繼承繼承的概念java
根據已有類派生出新類的技術。還能夠有本身的獨特屬性。安全
爲何要使用繼承?(優點)ide
注意:java類只支持單一繼承,不容許多繼承:即意味着一個父類能夠有多個子類,可是子類只能有多個父類函數
語法:學習
編寫父類this
編寫子類:在子類加上 extends 父類名稱設計
使用對象
一:繼承父類:子類繼承父類的 「全部」成員,就像在本身類中使用繼承
二:子類不能繼承父類的:
1. 父類中private修飾的成員
2. 子類和父類不在同一程序包下,使用默認修飾符的成員
3. 構造器。文檔
別稱:
父類,超類,基類
子類,派生類
程序設計原則:里氏替換原則
子類是父類,子類徹底替換父類不會出現問題
方法重寫
子類中的方法名字,參數,返回值類型與父類中的同樣
重寫場合
重寫要注意:
1. .必須 子類
2. 必須是實例成員方法
3. 方法名必須以有
4. 參數同樣 或父類擦除後和子類相同
5. 返回值類型和父類相同 或 子類能夠是父類的子類型(引用)
6. 子類方法的訪問修飾符 不能比父類更嚴格(低)
7. 異常處理,子類不能比父類異常範圍更大
重載和重寫的區別
區別點
重載
重寫
位置
在同一個類中
在有繼承關係的子類中
方法
方法名相同,參數列表不一樣,與返回值無關
方法名,參數,返回值類型與父親一致
做用
方便記憶
修改父親的功能
英文
overloading
overriding
super
父類的範圍
能夠調用父類的成員(成員變量,方法)
位置:
子類構造器的第一行代碼處
做用
super使用注意:子類構造器中沒有顯示調用父類構造或本類構造,那麼系統會自動分配一個super()調用父類的==無參==構造器
父類中沒有無參構造器,只有帶參數的構造器,解決辦法:
1. 在父類中定義一個無參構造器
2. 顯示調用帶參構造器,而且傳參
this和super的區別和相同點
區別:
一、super()主要是對父類構造函數的調用,this()是對重載構造函數的調用
二、super()主要是在繼承了父類的子類的構造函數中使用,是在不一樣類中的使用;this()主要是在同一類的不一樣構造函數中的使用
相同點:
一、super()和this()都必須在構造函數的第一行進行調用,不然就是錯誤的
繼承的傳遞:
子類能夠繼承直接父類的成員,也能夠繼承間接父類的成員
objectfinalize()
垃圾回收以前調用
強制垃圾回收:System.gc();
//垃圾回收
package day16_1;
class Student{
@Override
protected void finalize() throws Throwable {
System.out.println("this----->"+this);
super.finalize();
}
}
public class TestStudent {
public static void main(String[] args) {
Student guojing = new Student();
System.out.println(guojing);
//斷開
guojing = null;
//強制垃圾回收
System.gc();
System.out.println(guojing);
}
}
toString
對象的字符串描述信息
注意:在使用print()或者println()輸出對象名字時,會自動調用toString
System.out.println(guojing);
System.out.println(guojing.toString());
//重寫toString,調用tostring時,輸出的是「我愛學習」
@Override
public String toString() {
// TODO Auto-generated method stub
return "我愛學習";
}
equals
//重寫equals
@Override
public boolean equals(Object obj) {
// 全部的屬性值都相同就是同一個對象
Student stu = (Student)obj;//父類類型強制轉換爲子類類型
return this.name.equals(stu.name) &&this.age ==stu.age;
}
public class TestStudent {
public static void main(String[] args) {
Student guojing = new Student("郭靖",22);
Student yangkang = new Student("郭靖",22);
System.out.println(guojing);
System.out.println(yangkang);
System.out.println(guojing.equals(yangkang));//object類的equals
String s = "abc";
System.out.println(s.equals("def"));//String類下也有equals類,而且是重寫的object的
}
}
final
修飾符:
1. 類,不能被子類繼承
- 爲了類的安全性,不容許子類修改
- 類之間的方法有複雜的調用關係
- 此類是最終版本的類,不想再擴展了
2. 方法,不能被子類重寫
- 不但願子類更改,全部子類使用的是父類同一版本的方法
3. 變量,值不能更改,這是也就是一個常量
- 對於基本數據類型值不能修改,
- 對於引用類型,不能換對象,對象裏的值能夠變
Final B b = new B();
b = new B();//出錯,不能改對象
b.value = 45;//對象的值能夠更改
1
2
3
常量的命名規則:全部字母大寫,單詞之間用下劃線鏈接
常量的好處
(1)安全性,不容許隨意更改
(2)好維護,一個常量值更改了,全部應用的地方都改了
(3)加強可讀性
什麼狀況下會派生新類
子類 會增長屬性
子類 增長了方法
設計類的繼承關係注意
繼承關係不要超過三層
能夠被子類繼承的類
寫詳細的文檔說明
儘可能封裝,private;對全部用戶都開放,用public;只對子類開放,protected;對全部用戶都開放,又不想被子類更改,用final
優勢 :
1.代碼重用
2.便於維護
缺點:
1.高耦合
2.破壞封裝
組合
總體和局部的關係
//發動機
class Engine{
public void start(){
System.out.println("啓動");
}
public void stop(){
System.out.println("中止");
}
}
//輪子
class Wheel{
public void inflate(int r){
System.out.println("重氣"+ r);
}
}
//車窗戶
class Window{
public void roolUp(){
System.out.println("升");
}
public void roolDown(){
System.out.println("降");
}
}
//車門
class Door{
Window win = new Window();
public void open(){
System.out.println("車開門");
}
public void close(){
System.out.println("車關門");
}
}
//構造器
class Car{
Engine e = null;//
Wheel [] w =null;//
Door[] d = null;//new Door();
Car(){
e = new Engine();
w =new Wheel[4];
for(int i = 0;i <w.length;i++){
w_= new Wheel();_
}
d = new Door[2];
for(int i = 0;i <d.length;i++){
d= new Door();__
}
}
}
public class TestCar {
public static void main(String[] args) {
Car car = new Car();
car.e.start();
car.e.stop();
for(int i = 0; i < car.w.length;i++){
car.w_.inflate(100);_
}
car.d[0].open();
car.d[1].close();
car.d[2].win.roolDown();
car.d[3].win.roolUp();
}
}