面向對象的三大特徵:
封裝、繼承、多態
一.封裝:屬性私有化,對外提供統一訪問的get/set方法。完全封裝。基本類型只能按值傳遞,而每個基本類型對應的封裝類是按引用傳遞的。封裝類的出現,是爲了更方便的使用一些基本類型不具備的方法,比如valueOf(),toString()等等。還有你如果想傳遞一個int對象的引用,而不是值,那隻能用封裝類。
public class Pet { int age;// 屬性私有 封裝的要求 String name; // alt + shift + s public Pet(){ this(20,"張飛"); } public Pet(int age,String name){ this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void pritn(){ System.out.println(this); } }
二.繼承:
Student(name,age,sid);
Teacher(name,age,tid);
Super(name,age);
繼承的好處:
1. 代碼的複用。
2. 爲了以後多態的使用。
繼承來的東西:
1. )一般的屬性和方法被繼承。
2. )構造方法不被繼承。
3. )私有的方法不被繼承。
4. )私有的屬性被隱藏,可以通過繼承來的公有方法訪問。
什麼時候建立父子類關係:
任何A出現的地方,換做B之後仍然成立,或者說:
B is a A : 如果符合這個公式,就可以建立父子類關係。
父類:
public abstract class Super { static{ System.out.println("父類靜態語句塊"); } public Super(){ System.out.println("父類構造方法"); } public abstract void test(); }
子類:
public class Sub extends Super{ static{ System.out.println("子類靜態語句塊"); } public Sub(){ super(); System.out.println("子類構造方法"); } public void test(){ System.out.println("實現"); } }
*.對於構造方法來說:
構造方法的第一行不是super(..)就是this(..)
如果一個構造方法第一行不是this(..)或super(..),則默認是對父類無參構造的調用super();
不可能所有的構造都是this(..),至少有一個是super(..);
在子類中使用和父類中同樣名字的屬性沒有意義,對實際開發沒有任何好處,所以應該避免。
如果子類中有和父類名字相同的方法
1. 如果參數不同:構成了重載。
2. 如果參數相同:構成了重寫。
重寫:覆蓋 覆寫。
1. 發生在父子類中。
2. 同名同參同返回。
3. 子類方法的修飾符不能比父類方法的修飾符更封閉。(要麼相同,要麼更開放)
private—默認—protected—public。
4. 子類方法拋出的異常不能比父類方法拋出的異常更寬泛。
重載:
1. 發生同一類中
2. 同名不同參。參數個數不同、參數順序不同、參數類型不同均構成重載。
3. 返回值類型沒有要求。
如果一個類沒有指定繼承其他父類,則它的父類是Object。
this指本類對象。
super用法:指父類對象
三.多態:一個對象,多種狀態。父類引用指向子類的對象
多態兩點基本定理:
1. 發生多態時,只能調用父類的方法,不能調用子類的方法。
2. 發生多態時,如果子類中重寫了父類的方法,再調用這個方法,調用的是子類重寫之後的方法。
3. 想使用子類中獨有的方法,需要使用強制類型轉換
4. 注意:強制類型轉換沒有新建對象,只是換了一個引用。
對於靜態方法來說,有重寫,重寫也應該是靜態的。靜態方法是跟類一致的,沒有多態。
多態經常用傳遞的參數的類型和返回類型
public class Test { public static void main(String[] args) { Super s = new Sub();// 多態形式。 // s.test(); /* 靜態>一般 父類>子類 * 父類靜態語句塊 子類靜態語句塊 父類構造方法 子類構造方法 */ } }