繼承
子類繼承父類使用的是extends關鍵字。Java繼承的特點是單繼承。
優點
1.提高代碼的復用性。
2.讓類與類之間產生了關系,為多態提供了前提。
使用場景
當事物之間存在著所屬關系時,可以通過繼承來體現這個關系。
對比多繼承
多繼承復用性更高,單繼承復用性低。
多繼承關系復雜且有菱形缺陷,單繼承沒有。
PS:
1.菱形缺陷:B、C兩個類同時繼承于A,D繼承于B和C,如果B和C中存在同名方法,不知道執行從哪個類種中繼承過來的。
2.所有類的根類是Object。
子類重寫父類方法Override
前提:
子類可以訪問父類方法。
注意事項:
1.子類方法覆蓋父類方法,必須保證權限大于等于父類的權限。
2.靜態只能覆蓋靜態,或者被靜態覆蓋。
PS:注意是覆蓋,不是重寫。寫上super.run();
會報錯
參考代碼
父類-Person類
public class Person {
private String name;// 私有變量能繼承,不能訪問
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");
}// 會先調用父類的無參構造方法
public Teacher(String name, int age, int number) {
super(name, age);//調用父類的構造器
this.number = number;
}
/**
* 重寫父類方法
* 注意事項:
* 子類方法權限大于等于父類方法權限
* 子類可以訪問父類被重寫的方法;
*/
@Override/*加上注解會為我們檢測父類是否擁有當前方法,
如果沒有代表不是重寫,會提示我們*/
public void eat() {
super.eat();// super指的是父類的空間,不是父類對象
System.out.println(getName());
}
public static void run() {
System.out.println("Teacher Run!");
}// 靜態只能覆蓋靜態,或者被靜態覆蓋 注意是覆蓋,不是重寫。
方法內寫super.run();會報錯
}
單例設計模式
解決問題
保證一個類的對象在內存中的唯一性。
應用場景
多處需要共享數據的時候。
步驟
1.類中構造函數私有化。
2.在本類中new一個對象。
3.定義一個靜態方法返回該對象。
代碼
餓漢式
public class Singleton {
// 在本類中創建一個對象
private static final Singleton s = new Singleton();
// 構造器私有化
private Singleton() {
}
// 在靜態方法中將對象返回
public static Singleton getInstance() {
return s;
}
}
懶漢式
public class SingletonSecond {
private static SingletonSecond s = null;
private SingletonSecond() {
}
// 延遲加載內存,不調用getInstance(),不開辟內存
public static SingletonSecond getInstance(){
if (s ==null) {
s = new SingletonSecond();
}
return s;
}
}
final關鍵字
1.可以修飾類:被final修飾的類不可被繼承(斷子絕孫)
2.可以修飾方法:被final修飾的方法不能被重寫
3.可以修飾變量:被final修飾的變量被初始化后不能被更改值(只初始化一次)