1. 程式人生 > >05繼承與多態

05繼承與多態

屬性 string類 bst create image 為什麽 ceo 如果 mage

一、 繼承條件下的構造方法調用

1、運行 TestInherits.java 示例,觀察輸出,註意總結父類與子類之間構造方法的調用關系修改Parent構造方法的代碼,顯式調用GrandParent的另一個構造函數,註意這句調用代碼是否是第一句,影響重大!

源代碼:

package lianxi7;

class GrandParent

{

public GrandParent()

{

System.out.println("GrandParent Created");

}

public GrandParent(String string)

{

System.out.println("GrandParent Created.String:"+string);

}

}

class Parent extends GrandParent{

public Parent(){

super("sdg");

System.out.println("Parent Created");

}

}

class Child extends Parent{

public Child(){

System.out.println("Child Created");

}

}

public class TestInherits {

public static void main(String[] args) {

// TODO Auto-generated method stub

Child c=new Child();

}

}

實驗結果截圖:

技術分享

結論:通過 super 調用基類構造方法,必須是子類構造方法中的第一個語句,必須寫在第一個。

2、為什麽子類的構造方法在運行之前,必須調用父類的構造方法?能不能反過來?為什麽不能反過來?

子類是通過父類繼承過來的,所以子類有父類的屬性和方法,如果不調用父類的構造方法,那麽怎麽初始化父類中定義的屬性,即怎麽給父類的屬性分配內存空間

,如果父類的屬性沒有分配內存空間,那麽子類訪問父類的屬性,就會報錯。

二、神奇的“+”

技術分享

註意最後一句,一個字串和一個對象相加,得到以下結果:

技術分享

“+”運算中,當任何一個對象與一個String對象,連接時,會隱式地調用其toString()方法,默認情況下,此方法返回類名 @ + hashCode”。為了返回有意義的信息,子類可以重寫toString()方法。

三、請自行編寫代碼測試以下特性: 在子類中,若要調用父類中被覆蓋的方法,可以使用super關鍵字。

源代碼:

class GrandParent

{

public GrandParent()

{

System.out.println("GrandParent Created");

}

public GrandParent(String string)

{

System.out.println("GrandParent Created.String:"+string);

}

}

class Parent extends GrandParent{

public Parent(){

super("sdg");

System.out.println("Parent Created");

}

}

class Child extends Parent{

public Child(){

System.out.println("Child Created");

}

}

public class TestInherits {

public static void main(String[] args) {

// TODO Auto-generated method stub

Child c=new Child();

}

}

實驗截圖為:

技術分享

未添加super("sdg")之前的結果:

技術分享

課後作業一:接口多態:使用接口代替抽象基類
一、源代碼
package zoo4;

import java.util.Vector;

public class Zoo2 {

public static void main(String args[]) {

Feeder f = new Feeder("小李");

Vector<Animal> ans = new Vector<Animal>();//可隨時向其中加入或移除對象

//飼養員小李餵養一只獅子

ans.add(new Lion());

//飼養員小李餵養十只猴子

for (int i = 0; i < 10; i++) {

ans.add(new Monkey());

}

//飼養員小李餵養5只鴿子

for (int i = 0; i < 5; i++) {

ans.add(new Pigeon());

}

f.feedAnimals(ans);

}

}

class Feeder {

public String name;

Feeder(String name) {

this.name = name;

}

public void feedAnimals(Vector<Animal> ans) {

for (Animal an : ans) {

an.eat();

}

}

}

interface Animal {

public void eat();

}

class Lion implements Animal {

public void eat() {

System.out.println("我不吃肉誰敢吃肉!");

}

}

class Monkey implements Animal {

public void eat() {

System.out.println("我什麽都吃,尤其喜歡香蕉。");

}

}

class Pigeon implements Animal {

public void eat() {

System.out.println("我要減肥,所以每天只吃一點大米。");

}

}

二、實驗運行截圖

技術分享

驗證:

①TestInstanceof.java

代碼

public class TestInstanceof

{

public static void main(String[] args)

{

//聲明hello時使用Object類,則hello的編譯類型是Object,Object是所有類的父類

//但hello變量的實際類型是String

Object hello = "Hello";

//String是Object類的子類,所以返回true。

System.out.println("字符串是否是Object類的實例:" + (hello instanceof Object));

//返回true。

System.out.println("字符串是否是String類的實例:" + (hello instanceof String));

//返回false。

System.out.println("字符串是否是Math類的實例:" + (hello instanceof Math));

//String實現了Comparable接口,所以返回true。

System.out.println("字符串是否是Comparable接口的實例:" + (hello instanceof Comparable));

String a = "Hello";

//String類既不是Math類,也不是Math類的父類,所以下面代碼編譯無法通過

//System.out.println("字符串是否是Math類的實例:" + (a instanceof Math));

}

}

運行結果截圖:

技術分享

②TestCast.java

代碼如下:

class Mammal{}

class Dog extends Mammal {}

class Cat extends Mammal{}

public class TestCast

{

public static void main(String args[])

{

Mammal m;

Dog d=new Dog();

Cat c=new Cat();

m=d;

//d=m;

d=(Dog)m;

//d=c;

//c=(Cat)m;

}

}

運行結果沒有出錯!

③Zoo.java

代碼如下:

package zoo4;

import java.util.Vector;

public class Zoo {

public static void main(String args[]) {

Feeder f = new Feeder("小李");

Vector<Animal> ans = new Vector<Animal>();//可隨時向其中加入或移除對象

//飼養員小李餵養一只獅子

ans.add(new Lion());

//飼養員小李餵養十只猴子

for (int i = 0; i < 10; i++) {

ans.add(new Monkey());

}

//飼養員小李餵養5只鴿子

for (int i = 0; i < 5; i++) {

ans.add(new Pigeon());

}

f.feedAnimals(ans);

}

}

class Feeder {

public String name;

Feeder(String name) {

this.name = name;

}

public void feedAnimals(Vector<Animal> ans) {

for (Animal an : ans) {

an.eat();

}

}

}

abstract class Animal {

public abstract void eat();

}

class Lion extends Animal {

public void eat() {

System.out.println("我不吃肉誰敢吃肉!");

}

}

class Monkey extends Animal {

public void eat() {

System.out.println("我什麽都吃,尤其喜歡香蕉。");

}

}

class Pigeon extends Animal {

public void eat() {

System.out.println("我要減肥,所以每天只吃一點大米。");

}

}

運行結果截圖:

技術分享

05繼承與多態