C++的繼承和Java繼承的比較,java繼承比較
在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{@Overridepublic 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屬性只能在子類內部訪問。
另外C++中可以多繼承,一個多繼承的例子如下:
#include <iostream>using namespace std;class B1{int b1;public:B1(int i){b1 = i;cout << "建構函式 B1." << i << endl;}void print(){cout << b1 << endl;}};class B2{int b2;public:B2(int i){b2 = i;cout << "建構函式 B2." << i << endl;}void print(){cout << b2 << endl;}};class B3{int b3;public:B3(int i){b3 = i;cout << "建構函式 B3." << i << endl;}int getb3(){return b3;}};class A : public B2, public B1{int a;B3 bb;public:A(int i, int j, int k, int l):B1(i), B2(j), bb(k){a = l; cout << "建構函式 A." << l << endl;}void print(){B1::print();B2::print();cout << a << ", " << bb.getb3() << endl;}};int main(){A aa(1, 2, 3, 4);aa.print();return 0;}