2018.7.26
1、Java中的繼承
Java中使用extends
關鍵字來說明繼承關係。
class Animals {}class Dogs extends Animals {}
2、繼承的特性
java中繼承的特性與C++基本一致:
· 子類擁有父類中非private的屬性,方法;
· 子類可以擁有自己的屬性和方法;
· 子類可以用自己的方式實現父類的方法(即重寫);
· java中的繼承是單繼承,但是可以多重繼承,單一般不使用多重繼承,而採用介面的方式來實現多重繼承。??? 這也是與C++中繼承問題的不同。
3、繼承相關關鍵字
extends
Java中使用extends
關鍵字來說明單繼承(一個子類只能擁有一個父類):
public class Animal { private String name; private int id; public Animal(String myName, String myid) { //初始化屬性值 } public void eat() { //吃東西方法的具體實現 } public void sleep() { //睡覺方法的具體實現 } } public class Penguin extends Animal{ }
implements
使用implements
關鍵字可以變相的使java具有多繼承的特性,使用範圍為類繼承介面的情況,可以同時繼承多個介面(介面和介面之間採用逗號分隔):
public interface A { public void eat(); public void sleep();} public interface B { public void show();} public class C implements A,B {}
super 與 this
super
關鍵字:用來實現對父類成員的訪問,用來引用當前對象的父類,這在C++中是不允許的。
this
關鍵字:類似於C++中的this指標,只不過java中沒有指標的概念,這裡是引用。
class Animal { void eat() { System.out.println("animal:eat"); }}class Dog extends Animal { void eat() { System.out.println("dog:eat"); } void eatTest() { this.eat(); super.eat(); }}public class testFile { public static void main(String[] args) { Animal a = new Animal(); a.eat(); Dog d = new Dog(); d.eatTest(); }}
這裡父類中的方法沒有存取控制許可權標識,預設為default
,說明了各個存取控制標識的存取範圍(default
也是與C++的區別):
final
final
關鍵字聲明類可以把類定義為不能被繼承的類,又叫做最終類。
final
關鍵字還可以用於單獨修飾方法,是的該方法不能被子類重寫:
final class Base { } public/private/default/protected final 傳回值 method() { }
另外,執行個體變數也可以被定義為final
,被定義為final
的變數不能被修改。被聲明為final
類的方法自動被聲明為final
,但執行個體變數並不是final
。
4、建構函式
這裡與C++中的建構函式基本一致,存在一個不同點是:
如果父類的建構函式中帶有參數,則必須在子類的建構函式中顯式的通過super
關鍵字調用父類的建構函式,並配以適當的參數列表。
如果父類建構函式沒有參數,則在子類的建構函式中不需要使用super
關鍵字調用父類的建構函式,系統會自動調用父類的無參數建構函式:
class SuperClass { private int n; SuperClass() { System.out.println("SuperClass()"); } SuperClass(int n) { System.out.println("SuperClass(int n)"); this.n = n; }}class SubClass extends SuperClass { private int n; SubClass() { super(300); System.out.println("SubClass()"); } SubClass(int n) { System.out.println("SubClass(int n) : " + n); this.n = n; }}public class TestSuperSub { public static void main(String[] args) { SubClass sc = new SubClass(); //SuperClass(int n), SubClass() System.out.println(); SubClass sc2 = new SubClass(200); //SuperClass(), SubClass(int n) }}
5、Override與Overload
Override->重寫,Overload->重載,這裡從概念上將於C++沒什麼區別。
Override
當需要在子類中調用父類的被重寫的方法時,需要使用super
關鍵字:
class Animal{ public void move(){ System.out.println("動物可以移動"); } } class Dog extends Animal{ public void move(){ super.move(); //調用Animal的move System.out.println("狗可以跑和走"); } public void bark(){ System.out.println("狗可以吠叫"); }} public class testFile{ public static void main(String args[]){ Animal b = new Dog(); b.move();//執行Dog,但是由於其中調用了super,所以也會輸出Animal中的內容 }}
Overload
6、 Java中的多態
同C++相同,java中多態的存在需要三個必要條件:
· 繼承; · 重寫; ·父類引用指向子類對象呢。
7、抽象類別
如果一個類中沒有包含足夠的資訊來描繪一個具體的對象呢,這個類就是抽象類別 ,其與C++中抽象類別的概念一致,不能用於執行個體化對象,主要用於介面的指定。
C++中使用純虛函數來表示抽象類別,java中使用關鍵字abstract
來聲明一個抽象類別:
public abstract class Base { }
8、抽象方法
一個類中包含一些特別的成員方法,該方法的具體實現由其子類確定,則可以在父類中聲明該方法為抽象方法:
抽象方法只包含一個方法名,沒有方法體。
public abstract class Employee{ private String name; private String address; private int number; public abstract double computePay(); //其餘代碼}
聲明抽象方法會造成一下兩個結果:
· 如果一個類中包含抽象方法,則該類必須是抽象類別;
· 任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類別。
9、Java中的封裝
這與C++中的封裝沒有什麼區別,主要以private
體現。
10、Java中的介面
在Java中抽象方法的集合通常以interface
來聲明,稱之為介面,這與golang中的介面一致。
[可見度] interface 介面名稱 [extends 其他的類名] { // 聲明變數 // 抽象方法}
介面使用執行個體:
/*AnimalH.java*/package test2;interface AnimalH { public void eat(); public void travel();}
類使用implements
關鍵字實現介面。
package test2;public class MammalInt implements AnimalH { public void eat() { System.out.println("Mammal eats"); } public void travel() { System.out.println("Mammal travels"); } public int noOfLegs() { return 0; } public static void main(String[] args) { MammalInt m = new MammalInt(); m.eat(); m.travel(); }}
11、同時,介面與介面之間也可以由繼承關係,用extends
關鍵字表示:
// 檔案名稱: Sports.javapublic interface Sports{ public void setHomeTeam(String name); public void setVisitingTeam(String name);} // 檔案名稱: Football.javapublic interface Football extends Sports{ public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter);} // 檔案名稱: Hockey.javapublic interface Hockey extends Sports{ public void homeGoalScored(); public void visitingGoalScored(); public void endOfPeriod(int period); public void overtimePeriod(int ot);}
12、介面的多繼承
在java中,類的多繼承是不合法的,但介面允許多繼承 。
在介面的多繼承中,extands關鍵字只需要使用一次,在後面跟著繼承介面:
public interface Hockey extends Sports, Event {}
一個類可以實現多個介面,使用implements
關鍵字,後面跟實現的介面:
public class People implements Sports, Event {}
13、沒有任何方法的介面被稱為標記介面:
其作用為:
13、Java中的包,是C++中沒有的概念。包的存在是為了更好的組織類,用於區別類名的命名空間。
import
為了使用某個包中的成員,需要在java程式中明確匯入該包,使用import
關鍵字來完成對包的匯入。