類的繼承java
類的繼承要使用關鍵字 extendside
實現類的複用,提升效率有兩種方法函數
一、將一個類看成另外一個類的屬性(合成/聚合關係)
二、一個類繼承另外一個類,實現繼承的類稱爲 子類 或者 叫 派生類this
而被繼承的類稱爲 父類 ,也叫作 超類 或 基類
spa
經過 繼承 一個現有的類,可使用已經定義的類中的方法 和屬性對象
類的方法 和屬性能夠被繼承,但 類的 構造器(方法,函數)不能被繼承繼承
關鍵字super(其實就是父類的一個可變的對象)ip
能夠訪問父類中定義的屬性,成員方法 還能夠用在子類構造器(方法,函數)get
中調用父類的構造器it
/**
* 構造函數
* 一、子類new 對象的時候,必須調用父類構造函數
* 二、若是父類沒法提供子類所須要的構造函數,這時會報錯
* 報錯現象:
* 父類自定義帶參數的構造函數,而子類使用默認的構造函數(無參數的)
* 最佳的解法:自定義類時,自定義一個空參數的構造函數(養成習慣)
* 三、能夠經過,super進行調用父類的構造函數,進行初始化父類屬性
* 四、構造函數不能被子類繼承
*/
public class Son extends Father {
private String sonField;
public Son(){
super(); //默認調用這個super空參數的
//第一種賦值方式
//有弊端,屬性值固定
super.setAge(1);
super.setFatField("1111");
}
public Son(String field, int age){
/*//super(); //默認調用空參的父類構造函數
super(field, age); //調用父類的帶參數的構造函數*/
//Constructor call must be the first statement in a constructor
//super 跟this 在構造方法中,只能存在一個
//緣由:super this 都必須是第一行執行
//強調一點:此處的this 是調用構造函數
/*this(field);
super(age);*/
}
public Son(String field){
//super(); //默認調用空參的父類構造函數
//System.out.println();
super(field); //調用父類的帶參數的構造函數
this.sonField = field;
}
public static void main(String[] args) {
/*Son son = new Son();
System.out.println(son.getAge());
System.out.println(son.getFatField());*/
System.out.println("----------------------------");
Son son2 = new Son("2222", 2);
System.out.println(son2.getAge());
System.out.println(son2.getFatField());
}
}
---------------------------------------------------------------------------
/*
* 繼承屬性的知識點:
* 一、若是父類有某個屬性,而子類恰好也一個如出一轍的屬性,子類訪問時,訪問的是子類的屬性
* 若是子類沒有這個屬性,那麼訪問父類的屬性, 這個特性叫:屬性隱藏
* 二、若是子類非得去獲取父類的屬性,能夠經過super去獲取,注意super 自能在列的內部使用
* 三、子類繼承父類的屬性和方法,可是,沒法繼承父類private 修飾的方法或屬性
* 四、子類也繼承了父類的靜態屬性
*/
public class Son extends Father{
private int age = 18;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Son() {
System.out.println("son 的構造方法....");
}
public static void main(String[] args) {
//知識點:子類初始化(建立對象)時,首先調用父類的構造器,生成父類對象,
//而後在進行子類初始化。
Son son = new Son();
//father中有age ,子類也age 打印 son的age
System.out.println(son.getAge()); //18
//father中有age ,子類沒有age 打印 father的age
System.out.println(son.getAge()); //40
System.out.println(son.fatname);
System.out.println(Son.staticField);
System.out.println(son.staticField);
System.out.println(Father.staticField);
}
}
-----------------------------------------------------------------------
/*
* 類繼承的方法知識點
* 1、方法的重寫
* 若是父類中有一個方法,而子類中有個一個如出一轍的方法,這個時候,我稱爲方法的重寫
* 重寫的條件注意點:
* 一、方法名如出一轍
* 二、參數列表如出一轍
* 三、返回值如出一轍
* 四、訪問控制權限:
* 1> 若是父類中有個方法,是private 修飾的,而子類恰好也有一個如出一轍的方法,
* 這個時候,不能稱爲方法的重寫,子類的方法,是自定義的方法
* 2> 若是父類中有個方法,而子類恰好也有一個如出一轍的方法,子類的方法,訪問權限
* 必須大於或等於父類的方法的訪問權限
* 五、拋出的異常
* 子類方法重寫,拋出的異常,是父類拋的異常的子類或相同類
*
* 2、靜態方法
* 一、子類也能夠繼承父類的靜態方法
* 二、子類不能重寫父類的靜態方法
*
*/
public class Son extends Father {
//方法名不同,不算重寫
public void info1(){
System.out.println("Son.info1()");
}
//參數列表不同,不算重寫,不算重載,由於不在同一個類
public void info(int a){
System.out.println("Son.info(a)");
}
/*Multiple markers at this line
- Cannot reduce the visibility of the inherited method from
Father
- overrides com.qianfeng.demo6.Father.info*/
protected double info(){
System.out.println("Son.info()");
return 1;
}
/*@Override // overload
public static void staticMethod(){
System.out.println("son.staticMethod()");
}*/
/*@Override //java 註解 private void privateMethod(){ System.out.println("son.privateMethod()"); }*/ public static void main(String[] args) { Son son = new Son(); son.info(); Son.staticMethod(); }}