在C++中继承可分为公有继承(public)保护继承(protected)和私有继承(private),而在Java中默认只有一种继承(相当于C++中的公有继承)下面我们来看一段代码
#include <iostream> using namespace std; class A{ int aprivate; void Aprivate(){ cout << "A类的private方法" << endl; } protected: int aprotected; void Aprotected(){ cout << "A类的protected方法" << endl; } public: A(){} A(int a, int b, int c):aprivate(a), aprotected(b), apublic(c){} int apublic; void Apublic(){ cout << "A类的public方法" << endl; } }; //class B : private A{ //public: // B(){} // B(int a, int b, int c):A(a, b, c){} // void Bpublic(){ // Aprotected(); // cout << "B类的public方法----" << aprotected << endl; // } //}; int main(){ A a(100, 200, 300); a.Apublic(); // a.Aprotected(); // a.Aprivate(); cout << a.apublic << endl; // cout << a.aprotected << endl; // cout << a.aprivate << endl; return 0; }
我们定义了一个类A,可以看到:
1、类A外部我们只可以访问公有成员(public),protected和private的成员均不可访问。
2、类A内部成员函数可以访问所有成员,包括(public、protected、private).
上面这两个特点和Java是完全相同的。
下面我们来让B类继承子A类,代码如下:
class B : private A{ public: B(){} B(int a, int b, int c):A(a, b, c){} void Bpublic(){ Aprotected(); cout << "B类的public方法----" << aprotected << endl; } };
将上面的继承改为私有继承、保护继承、公有继承,都有以下结论:
1、子类B内部可以访问父类的非private成员。
2、子类B和父类A在类体外部均不可访问类的私有(private)成员。
3、如果是公有继承(public),则子类B在外部可访问父类A的公有属性(如 Apublic()方法)。
4、如果是私有继承和保护继承,子类B在外部不可访问类A的所有属性。
5、如果是保护继承,在B类中继承自A类的保护属性和公有属性均变为保护属性,同理私有继承。
上面这些描述可能有些绕,其实我们可以从上面的结论中看到如下结论,继承方式(public、protected、private)会改变子类继承自父类属性的访问权限(private、protected、public),如下:
public | protected | private | |
共有继承 | public | protected | 不可见 |
私有继承 | private | private | 不可见 |
保护继承 | protected | protected | 不可见 |
从上面的分析我们可以看出继承方式可以改变子类继承子父类属性的访问区域,所以如果此时有子类C继承自B类,同样会影响到C类对A类成员的访问。
下面我们来看看Java中的继承,先来看一段代码:
public class A { private int aprivate; int afriendly; protected int aprotected; public int apublic; private void Aprivate(){ System.out.println("A类的private方法"); } void Afriendly(){ System.out.println("A类的friendly方法"); } protected void Aprotected(){ System.out.println("A类的protected方法"); } public void Apublic(){ System.out.println("A类的public方法"); } }
public class Test { public static void main(String[] args) { A a = new A(); //a.Aprivate(); a.Afriendly(); a.Aprotected(); a.Apublic(); //System.out.println(a.aprivate); System.out.println(a.afriendly); System.out.println(a.aprotected); System.out.println(a.apublic); } }
可以看到:
1、Java比C++多了一个friendly访问权限,应为C++中没有包的概念(是命名空间).
2、Java中的protected属性是可以在类外部访问的。
3、Java中的friendly属性可以在相同包下的类外部访问。
注意:protected属性也可以在同一个包类访问,如果Test类和A类不在同一个包下的话,上面的a.Afriendly()和a.Aprotected()均不可访问。
public class B extends A{ public void Bpublic(){ Afriendly(); Aprotected(); Apublic(); } }
B b = new B(); b.Bpublic(); b.Afriendly(); b.Aprotected(); b.Apublic();
可以看到:
1、Java中的继承不区分(私有继承和公有继承)所以继承后相当于C++中的公有继承。
2、Java中的protected成员是可以在类外部被访问的(protected和friendly的前提是在同一个包下)。
下面我们再来看一个特点:
public class B extends A{ @Override public void Afriendly() { super.Afriendly(); System.out.println("重写了A类的Afriendly方法"); } public void Bpublic(){ Afriendly(); Aprotected(); Apublic(); } }
可以看到:
1、在子类B中重写A类的Afriendly方法的时候我们可以将访问权限增大(如上面的public)
2、Java中的文件中只能有一个public类。
3、Java中的外部类(对应的是内部类,这里暂且不谈)只能被修饰为public或friendly,不能被修饰为private或protected.
最后我们来做一个总结吧:
1、在Java中有四种权限,public可以在整个工程访问,protected属性可以在本类和子类的整个工程访问,friendly属性可以在本类的整个工程访问,private只能在本类内部访问。
2、在C++中又三中权限,public可以在整个工程访问,protected属性只能在本类内部和子类的内部访问,private属性只能在子类内部访问。