繼承
子類繼承父類使用的是extends關(guān)鍵字识藤。Java繼承的特點(diǎn)是單繼承搭盾。
優(yōu)點(diǎn)
1.提高代碼的復(fù)用性。
2.讓類與類之間產(chǎn)生了關(guān)系痒钝,為多態(tài)提供了前提秉颗。
使用場(chǎng)景
當(dāng)事物之間存在著所屬關(guān)系時(shí),可以通過(guò)繼承來(lái)體現(xiàn)這個(gè)關(guān)系送矩。
對(duì)比多繼承
多繼承復(fù)用性更高蚕甥,單繼承復(fù)用性低。
多繼承關(guān)系復(fù)雜且有菱形缺陷栋荸,單繼承沒(méi)有菇怀。
PS:
1.菱形缺陷:B、C兩個(gè)類同時(shí)繼承于A晌块,D繼承于B和C爱沟,如果B和C中存在同名方法,不知道執(zhí)行從哪個(gè)類種中繼承過(guò)來(lái)的匆背。
2.所有類的根類是Object呼伸。
子類重寫(xiě)父類方法Override
前提:
子類可以訪問(wèn)父類方法。
注意事項(xiàng):
1.子類方法覆蓋父類方法钝尸,必須保證權(quán)限大于等于父類的權(quán)限括享。
2.靜態(tài)只能覆蓋靜態(tài),或者被靜態(tài)覆蓋珍促。
PS:注意是覆蓋铃辖,不是重寫(xiě)。寫(xiě)上super.run();
會(huì)報(bào)錯(cuò)
參考代碼
父類-Person類
public class Person {
private String name;// 私有變量能繼承踢星,不能訪問(wèn)
private int age;
public Person() {
System.out.println("Person init");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void eat() {
}
public static void run() {
System.out.println("run");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
子類-Teacher類
public class Teacher extends Person {
private int number;
public static String haha = "haha";
public Teacher() {
System.out.println("Teacher init");
}// 會(huì)先調(diào)用父類的無(wú)參構(gòu)造方法
public Teacher(String name, int age, int number) {
super(name, age);//調(diào)用父類的構(gòu)造器
this.number = number;
}
/**
* 重寫(xiě)父類方法
* 注意事項(xiàng):
* 子類方法權(quán)限大于等于父類方法權(quán)限
* 子類可以訪問(wèn)父類被重寫(xiě)的方法澳叉;
*/
@Override/*加上注解會(huì)為我們檢測(cè)父類是否擁有當(dāng)前方法隙咸,
如果沒(méi)有代表不是重寫(xiě),會(huì)提示我們*/
public void eat() {
super.eat();// super指的是父類的空間成洗,不是父類對(duì)象
System.out.println(getName());
}
public static void run() {
System.out.println("Teacher Run!");
}// 靜態(tài)只能覆蓋靜態(tài)五督,或者被靜態(tài)覆蓋 注意是覆蓋,不是重寫(xiě)瓶殃。
方法內(nèi)寫(xiě)super.run();會(huì)報(bào)錯(cuò)
}
單例設(shè)計(jì)模式
解決問(wèn)題
保證一個(gè)類的對(duì)象在內(nèi)存中的唯一性充包。
應(yīng)用場(chǎng)景
多處需要共享數(shù)據(jù)的時(shí)候。
步驟
1.類中構(gòu)造函數(shù)私有化遥椿。
2.在本類中new一個(gè)對(duì)象基矮。
3.定義一個(gè)靜態(tài)方法返回該對(duì)象。
代碼
餓漢式
public class Singleton {
// 在本類中創(chuàng)建一個(gè)對(duì)象
private static final Singleton s = new Singleton();
// 構(gòu)造器私有化
private Singleton() {
}
// 在靜態(tài)方法中將對(duì)象返回
public static Singleton getInstance() {
return s;
}
}
懶漢式
public class SingletonSecond {
private static SingletonSecond s = null;
private SingletonSecond() {
}
// 延遲加載內(nèi)存冠场,不調(diào)用getInstance()家浇,不開(kāi)辟內(nèi)存
public static SingletonSecond getInstance(){
if (s ==null) {
s = new SingletonSecond();
}
return s;
}
}
final關(guān)鍵字
1.可以修飾類:被final修飾的類不可被繼承(斷子絕孫)
2.可以修飾方法:被final修飾的方法不能被重寫(xiě)
3.可以修飾變量:被final修飾的變量被初始化后不能被更改值(只初始化一次)