Java中繼承、類構造函數、方法重寫,this以及super關鍵詞。
Java與C++有很多相似之處,下面的概念有很多地方會跟c++牽扯在一起。,沒有c++基礎者慎重!
下面介紹四個部分
-
繼承的概念以及語法
-
構造函數
-
方法重寫
-
this關鍵字和super關鍵字
1.繼承的概念以及關鍵詞
Java中繼承與C++稍有不同,C++允許多繼承,但Java不允許,即Java只支持一個類最多有一個直接父類。
與c++繼承的概念相同,父類所擁有的函數和屬性,子類同樣具有,且子類可以增添加自己的函數。(不過會受訪問權限的約束)
Java中的繼承的語法:
[修飾符] class 子類名 extends 父類名{
//類的內容
}
#####下面是繼承的一個例子:
package test;
class A{
int a;
public void speak1() { System.out.println("A speak");};
}
class B extends A{
public void speak2() { System.out.println("B speak");}
}
public class Kit{
public static void main(String [] arg) {
B bb=new B();
bb.speak1();
bb.speak2();
}
}
2.構造函數
構造函數: 對象生成會直接(非語句調用)執行自己的構造函數,一般構造函數是對象進行初始化的操作;構造函數可以重載
這裏需要注意的是構造函數裏面調用其他構造函數的語句只能出現一次。
package test;
class A{
int a;
A(){System.out.println("A 無參構造函數");}
A(int a){
this.a=a;
System.out.println("A int 構造函數");
}
A(A b){this.a=b.a;
System.out.println("A class 構造函數");
}
}
public class Kit{
public static void main(String [] arg) {
A aa=new A();//A 無參構造函數
A bb=new A(10);//A int 構造函數
A cc=new A(bb);//A class 構造函數
}
}
注:與C++稍有不同,Java的類的無參構造函數在生成類時後面的 ‘()’ 不可以省略
比如C++類A爲:
#include<bits/stdc++.h>
using namespace std;
class A
{
public:
int a;
A()
{
puts("A 無參構造函數");
}
A(int a)
{
this->a=a;
puts("A int 構造函數");
}
A(const A &b)
{
this->a=b.a;
puts("A class 構造函數");
}
};
int main(){
A *aa=new A;//java 就需要A()。
delete aa;
}
根據學了幾門語言的經驗,總是覺得Java的對象變量皆爲指針(Python也相同)。
3.子類可以重寫父類方法
子類重寫父類方法,那麼原父類方法就會被覆蓋,若想在子類中調用父類方法,可以用super關鍵詞。
package test;
class A {
int a;
public void speak(){System.out.println("A speak");}
}
class B extends A {
public void speak() {
System.out.println("B speak");
super.speak();
}
}
public class Kit {
public static void main(String[] arg) {
B bb = new B();
bb.speak();/*B speakA speak*/
}
}
4.this關鍵字和super關鍵字
this表示自身對象,在對象中可以用this訪問自身的屬性和方法 。
package test;
class A {
int a;
A(){};
A(int a){this.a=a;}
A(boolean a){
this(a?1:0);
}
public void speak(){System.out.println("A speak");}
}
super表示父類對象 ,可以使用super訪問父類的方法或屬性 。
想調用父類的構造函數?
不過super和this調用構造函數時候都只能出現在函數的第一個語句,否則就會編譯錯誤。
你確實沒看錯,在構造函數中,super和this調用構造函數只能出現其中一個,若出現則必須出現在該構造函數的第一個語句。
例子:
package test;
class A{
int a;
A(){System.out.println("A 無參構造函數");}
A(int a){
this.a=a;
System.out.println("A int 構造函數");
}
A(A b){this.a=b.a;
System.out.println("A class 構造函數");
}
}
class B extends A{
B(){System.out.println("B 無參構造函數");};
B(int a){
super(a);
//this(); 這裏this()就會報錯
}
}