java中extends怎么用_Java 中extends與implements使用方法

 2023-10-08 阅读 29 评论 0

摘要:初學Java語言, 代碼中的extends和implements讓我感到很迷惑,現在終於弄明白它們之間的區別和用法了。//定義一個Runner接口 public inerface Runner { int ID = 1; void run ();}//定義一個interface Animal,它繼承於父類Runnerinterface Animal extends Ru

初學Java語言, 代碼中的extends和implements讓我感到很迷惑,現在終於弄明白它們之間的區別和用法了。

//定義一個Runner接口 public inerface Runner { int ID = 1; void run ();}

//定義一個interface Animal,它繼承於父類Runnerinterface Animal extends Runner{ void breathe ();}

//定義Fish類,它實現了Animal接口的方法run()和breather()class Fish implements Animal{ public void run () //實現了Animal方法run() { System.out.println("fish is swimming"); }public void breather() { System.out.println("fish is bubbing"); }}//定義了一個抽象類LandAnimal,它實現了接口Animal的方法。abstract LandAnimal implements Animal{ public void breather () { System.out.println("LandAnimal is breathing"); }}//定義了一個類Student,它繼承了類Person,並實現了Runner接口的方法run()。class Student extends Person implements Runner{ ...... public void run () { System.out.println("the student is running"); } ......} //定義了一個接口Flyerinterface Flyer{ void fly ();} //定義了一個類Bird,它實現了Runner和Flyer這兩個接口定義的方法。class Bird implements Runner , Flyer{ public void run () //Runner接口定義的方法。 { System.out.println("the bird is running"); } public void fly () //Flyer接口定義的方法。 { System.out.println("the bird is flying"); }} //TestFish類class TestFish{ public static void main (String args[]) { Fish f = new Fish(); int j = 0; j = Runner.ID; j = f.ID; }}

接口實現的注意點:

a)實現一個接口就是要實現該接口的所有的方法(抽象類除外)。

b)接口中的方法都是抽象的。

c)多個無關的類可以實現同一個接口,一個類可以實現多個無關的接口。

extends與implements的區別:

extends是繼承父類,只要那個類不是聲明為final或者那個類定義為abstract的就能繼承,JAVA中不支持多重繼承,但是可以用接口來實現,這樣就用到了implements,繼承只能繼承一個類,但implements可以實現多個接口,用逗號分開就行了。

比如:

class A extends B implements C,D,E {} ?? (class 子類名 extends 父類名 implenments 接口名)

父類與子類繼承關系上的不同:

A a = new B(); 結果a是一個A類的實例,只能訪問A中的方法,那么又和A a = new A();有什么區別呢?

***********************************************************************************************

class B extends A

繼承過后通常會定義一些父類沒有的成員或者方法。

A a = new B();

這樣是可以的,上傳。

a是一個父類對象的實例,因而不能訪問子類定義的新成員或方法。

***********************************************************************************************

假如這樣定義:

class A

{

int i;

void f(){}

}

class B extends A

{

int j;

void f(){}?????? //重寫

void g(){}

}

然后:

B b = new B();

b就是子類對象的實例,不僅能夠訪問自己的屬性和方法,也能夠訪問父類的屬性和方法。諸如b.i,b.j,b.f(),b.g()都是合法的。此時b.f()是訪問的B中的f()

A a = new B();

a雖然是用的B的構造函數,但經過upcast,成為父類對象的實例,不能訪問子類的屬性和方法。a.i,a.f()是合法的,而a.j,a.g()非法。此時訪問a.f()是訪問B中的f()

***********************************************************************************************

A a = new B(); 這條語句,實際上有三個過程:

(1) A a;

將a聲明為父類對象,只是一個引用,未分配空間

(2) B temp = new B();

通過B類的構造函數建立了一個B類對象的實例,也就是初始化

(3) a = (A)temp;

將子類對象temp轉換未父類對象並賦給a,這就是上傳(upcast),是安全的。

經過以上3個過程,a就徹底成為了一個A類的實例。

子類往往比父類有更多的屬性和方法,上傳只是舍棄,是安全的;而下傳(downcast)有時會增加,通常是不安全的。

***********************************************************************************************

a.f()對應的應該是B類的方法f()

調用構造函數建立實例過后,對應方法的入口已經確定了。

如此以來,a雖被上傳為A類,但其中重寫的方法f()仍然是B的方法f()。也就是說,每個對象知道自己應該調用哪個方法。

A a1 = new B();

A a2 = new C();

a1,a2兩個雖然都是A類對象,但各自的f()不同。這正是多態性的體現。

***********************************************************************************************

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/129737.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息