
使用繼承
編寫父類
class Pet {
//公共的屬性和方法
}
編寫子類
class Dog extends Pet {
//子類特有的屬性和方法
}
class Penguin extends Pet {
}
main方法:
Dog dog = new Dog();
dog.name = "...";
sout(dog.name);
子類自動(dòng)繼承父類
子類訪問父類成員super
使用super關(guān)鍵字,super代表父類對(duì)象
訪問父類構(gòu)造方法
super(); (無參方法)
super(name);(有參方法)
--super調(diào)用構(gòu)造方法時(shí),只能是第一句
訪問父類屬性
super.name;
訪問父類方法
super.print();
不能被子類繼承的父類成員
private成員
構(gòu)造方法
protected
可以修飾屬性和方法
本類、同包、子類可以訪問

初始化順序
1.父類屬性
2.父類構(gòu)造方法
3.子類屬性
4.子類構(gòu)造方法
繼承下構(gòu)造方法的調(diào)用規(guī)則
在main方法里創(chuàng)造,調(diào)用子類方法,一定會(huì)先創(chuàng)造父類方法
- 如果子類的構(gòu)造方法中沒有通過super顯式調(diào)用父類的有參構(gòu)造方法,也沒有通過this顯式調(diào)用自身的其他構(gòu)造方法,則系統(tǒng)會(huì)默認(rèn)先調(diào)用父類的無參構(gòu)造方法。在這種情況下,寫不寫“super();”語句,效果是一樣的。
- 如果子類的構(gòu)造方法中通過super顯式調(diào)用父類的有參構(gòu)造方法,那將執(zhí)行父類相應(yīng)構(gòu)造方法,而不執(zhí)行父類無參構(gòu)造方法。
- 如果子類的構(gòu)造方法中通過this顯式調(diào)用自身的其他構(gòu)造方法,在相應(yīng)構(gòu)造方法中應(yīng)用以上兩條規(guī)則。
- 特別注意的是,如果存在多級(jí)繼承關(guān)系,在創(chuàng)建一個(gè)子類對(duì)象時(shí),以上規(guī)則會(huì)多次向更高一級(jí)父類應(yīng)用,一直到執(zhí)行頂級(jí)父類Object類的無參構(gòu)造方法為止。
方法重寫
方法重寫的規(guī)則
方法名相同
參數(shù)列表相同
返回值類型相同或者是其子類;
訪問權(quán)限不能嚴(yán)于父類: public, protected, private
子類會(huì)覆蓋父類
!構(gòu)造方法因?yàn)椴荒鼙焕^承,所以不能被重寫;
子類:
public String getinfo()
{
String str = super.getinfo();
return str + "我是一只" + kind;
}
@Override: 注解,重寫
抽象類
Pet pet = new Pet("...", 10, 20);
pet.print();
Pet沒有意義,只是作為父類存在,不能被實(shí)例化
public abstract class Pet {
}
abstract: 無法實(shí)例化
abstract也可以用于方法:抽象方法 (抽象方法里不能實(shí)現(xiàn):寫代碼)
只有抽象類能包含抽象方法
抽象方法:子類有自己的計(jì)算方法,父類不知道如何計(jì)算時(shí)用抽象方法,子類也必須實(shí)現(xiàn)父類的抽象方法
非抽象方法:父類能解決的方法
public abstract class Pet {
public void print() {
//…
}
}
每個(gè)子類的實(shí)現(xiàn)不同,抽象類中無法給出合理的print方法的實(shí)現(xiàn)
public abstract class Pet {
public abstract void print() {
//…
}
}
public abstract double calculateArea();
final類
方法:不能被其他類繼承
final能被實(shí)現(xiàn)
public final class Penguin extends Pet {
//…
}
屬性:不能更改
public class Penguin {
final String home ="南極";// 居住地
public void setHome(String name){
this.home=home; //錯(cuò)誤,不可再賦值
}
}
方法:不能重寫
public final void print () {
//…
}