1. 程式人生 > >2017-09-20

2017-09-20

class 一個 under nds 轉型 oid eat align 擴展

什麽是抽象類:

一個類中沒有包含足夠的信息來描繪一個具體的對象;用abstract修飾的類就是抽象類;抽象類中不一定有抽象方法;但是有抽象方法就一定存在於抽象類中;

抽象類只能用作父類,表示繼承關系。繼承抽象類的子類必須實現其中的所有抽象方法,而已實現方法的參數、返回值要和抽象類中的方法一樣。否則,該類也必須聲明為抽象類。

定義抽象類:

【訪問權限】abstract class 類名 {成員列表}

抽象方法:

在類中沒有方法體的方法,稱之為抽象方法;

抽象方法的聲明:

【訪問權限】abstract 返回值類型 方法名稱(參數列表);

作用:可擴展性好;可優化程序;

多態性:

體現在:方法重載;方法覆蓋;多態參數;

①:編譯期類型與運行期類型相同;

A a = new A();

a.show();

在編譯期,虛擬機認為a的類型是A,對於a所使用的屬性和方法的有效性將到類A中去驗證。

構造方法A()中的A是運行期類型,在運行期,將執行運行期類型中的方法

②:當有繼承關系時,可能發生編譯期類型和運行期類型不同的情況,即編譯期類型是父類類型,運行期類型是子類類型;

//A類是B類的父類

A ab = new B();

ab.show();

對象ab的編譯期類型為父類A類,運行期類型為子類B類。

如果一個引用的編譯期類型和運行期類型不同,那麽一定是編譯期類型與運行期類型有父類子類關系。

多態環境下對成員方法的調用:

編譯在左,運行在右;

多態環境下對靜態成員方法的調用:

編譯在左,運行也在左;

多態環境下對成員變量的調用:

簡單的說:編譯和運行都看等號左邊。

註意:變量不存在被子類覆寫這一說法,只有方法存在覆寫。

父類:

public class Anmainal {

String name = "動物";

//方法

void eat(){

System.out.println("父類 : 吃飯");

}

Anmainal(){

System.out.println("父類 :構造方法");

}

static void jump() {

System.out.println("父類 :jump ");

}

}

子類1

public class Cat extends Anmainal {

String name = "貓";

void eat() {

System.out.println("貓 子類 : 吃飯");

}

void drink(){

System.out.println("貓 子類 :喝水");

}

Cat(){

System.out.println("貓 子類 :構造方法");

}

static void jump() {

System.out.println("貓 子類 :jump ");

}

}

public class Main {

public static void main(String[] args) {

Anmainal A=new Cat();

A.eat(); //結果: 子類 吃飯

System.out.println(A.name); //結果:動物

A.jump(); //調用靜態方法時,出現父類的結果

Cat B = (Cat) A; //需要強制轉換,子類中創新的方法才能出現結果

B.drink();

System.out.println(B.name); //需要強制轉換,子類中屬性才能出現結果 }

父類引用指向子類對象:

當編譯器類型是父類,運行期類型是子類時,被稱為父類引用指向子類對象;

class Animal{ //父類

……

}

class Cat extends Animal{

…… //子類Cat

}

class Dog extends Animal {

…… //子類Dog

}

Cat m = new Cat()

Animal x = new Cat() //Animal 的引用指向Cat的對象

對象m可以調用貓類中的所有方法,x只能調用動物類中定義的方法,

貓類擴展的新方法不能調用。 (例子如上)

多態參數:

方法參數具有多態性:

父類:

public class Anmainal {

String name = "動物";

//方法

void eat(){

System.out.println("父類 : 吃飯");

}

Anmainal(){

System.out.println("父類 :構造方法");

}

static void jump() {

System.out.println("父類 :jump ");

}

}

子類貓:

public class Cat extends Anmainal {

String name = "貓";

void eat() {

System.out.println("貓 子類 : 吃飯");

}

void drink(){

System.out.println("貓 子類 :喝水");

}

Cat(){

System.out.println("貓 子類 :構造方法");

}

static void jump() {

System.out.println("貓 子類 :jump ");

}

}

子類狗:

public class Dog extends Anmainal{

String name = "狗";

void eat() {

System.out.println("狗 子類 : 吃飯");

}

void drink(){

System.out.println("狗 子類 :喝水");

}

Dog(){

System.out.println("狗 子類 :構造方法");

}

static void jump() {

System.out.println("狗 子類 jump ");

}

}

public class Main {

public static void main(String[] args) {

Anmainal A1 = new Anmainal();

Cat B = new Cat();

Dog D = new Dog();

A1.eat();

B.eat();

D.eat();

}

void sing(Anmainal A1) {

A1.eat();

}

}

多態環境下對象造型:

向上造型 –又稱自動類型提升:

class Animal{

abstract void eat();

}

class Cat extends Animal{

void look() {

System.out.println("看家");

}

}

………

Animal x=new Cat() //向上造型,Cat對象提升到Animal對象

x.eat() //只能使用父類中的方法

x.look() //報錯!不能使用子類中的方法

向上造型的作用是:提高程序的擴展性。

向下造型 –又稱向下轉型:

class Animal{

abstract void eat();

}

class Cat extendsAnimal{

void look() {

System.out.println("看家");

}

}

………

Animal x=new Cat()

Cat m=(Cat)x; //向下轉型

m.eat() ;

m.look();//子父類中的方法都可以使用

向下造型的作用是:為了使用子類中的特有方法。

2017-09-20