Java 類的繼承與派生


派生類一般格式:

[類的修飾符] class 子類名 extends 父類名{

  成員變量定義

  成員方法定義

}

public class AutoMobileTest {
    public static void main(String args[]) {
        AutoMobile car=new AutoMobile();
        car.showNumber();
        Truck toto=new Truck();
        toto.showNumber();
        car.testdefault();
    }
}
class AutoMobile {
    public int publicNum;
    int defaultNum;
    protected int protectedInt;
    private int privateInt;
    public void showNumber() {
        System.out.println("AutoMobile Number is :"+defaultNum);
    }
    public void setNumber(int newNumber) {
        defaultNum=newNumber;
    }
    void testdefault() {
        System.out.println("It works");
    }
}
class Truck extends AutoMobile{
    @Override
    public void showNumber() {
        //重寫。重寫showNumber
        System.out.println("truck number is:"+defaultNum);
    }
}

重寫override:將父類的方法重新定義,static方法無法重寫

要調用超類的同名方法,使用super.method();

調用超類的構造方法(顯式)使用super()

 

2、繼承下的構造方法和finalize方法

構造方法是從父類的父類,直到Object類(所有類的父類)開始的;

可顯式(super(...))可隱式,

阻止繼承:final關鍵字

public class SupetTest {
    public static void main(String args[]) {
        Graduate xiaoming =new Graduate();
        xiaoming.run();
    }
}
class Human{
    public Human(){
        System.out.println("Human constructor");
    }
    public void run() {System.out.println("Human run");}
}
class Student extends Human{
    static String se="se";
    public Student() {
        System.out.println("student constructor");
    }
    public void run() {
        System.out.println("Student run");
    }
}
class Graduate extends Student{
    public Graduate() {
        System.out.println("Graduates constructor");
    }
    public void run() {
        super.run();
        System.out.println("Gradute run");
    }
}

 

finalize則從子類的finalize方法開始,往上執行,

在子類的finalize方法中最后應調用父類的finalize方法:super.finalize()

 

3、超類和子類的問題

若子類直接繼承父類的變量,可能會賦予其非法值。

所以:子類方法應依賴於超類的服務接口而不是實現。

(將變量設置成private,再使用public方法進行訪問)

 

4、繼承層次中對象間的關系

 子類對象可以視為超累的對象,將子類對象賦給超類變量

    Circle circle1=new Circle();
    Point point1=new Point();
    Point pointRef=new Circle();

5、抽象類 方法

abstract

抽象類至少含有一個抽象方法。只能作為超類被繼承

關鍵字abstract,抽象類,抽象方法(不提供方法體)。

靜態方法不能作為抽象方法

抽象類的所有具體子類必須提供抽象方法的具體實現。

6、接口

接口用於聲明一組類的公共操作(功能)

接口由:一組常量+一組抽象方法 組成

一個類可以實現多個接口  類名 [extends 父類名] implements 接口1,接口2,接口3

 

接口的聲明

  [public ] interface 接口名 [extends 父接口名]{

  [public]  [static] [final] 類型 常量名 = 常量值;常量定義

  [public]  [abstract] 返回類型 方法名(參數);抽象方法定義

}

public interface 的public決定是否可包外訪問

public static final 類型 常量名 的修飾符都可缺省不寫,因為必定public。static。final

public abstract 也可缺省不寫

 

如何訪問接口中的常量

public class VisitVariable implements A{
         static int k = 0;
         public static void main(String[] args) {
              VisitVariable test = new VisitVariable();
              k = test.i;//實現了接口的類對象來訪問
              k = VisitVariable.i;//實現了接口的類名來訪問
              k = A.i;//接口名來訪問
         }        
}
interface A {
     int i = 10;//接口中的常量     
}

7、final 方法 和 final 類

子類不能重寫超類中的final方法,final隱式地為private方法。

final類不能為超類,其中的所有方法都隱式地為final方法

final類可以防止創建繞過安全限制的子類

8、內部類

聲明

[修飾符]class outerClass{
    。。。
    [修飾符]class innerClass{
        。。。
    }
    。。。
}

內部類主要用於事件處理,可以訪問外部類內定義的所有成員

9、匿名內部類

在定義匿名內部類的地方直接創建該類的一個對象。往往用於注冊Java組件的事件處理對象

new object(){

  ....\\內部類的定義

}

嵌套類編譯時文件名:OutterClassName$InnerClassName.class

匿名內部類編譯時文件名:OuterClassName$#.class(#從1開始,往上遞增)

 

內部類可以使用OuterClassName.this訪問外部類的this

如何創建內部類的對象:

先創建一個外部類對象outref

然后:

 OuterClassName.InnerClassName.innerRef = outref.new InnerClassName()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM