• Tidak ada hasil yang ditemukan

drhuang.com

N/A
N/A
Protected

Academic year: 2023

Membagikan "drhuang.com"

Copied!
14
0
0

Teks penuh

(1)

多态

(2)

1. 多态

1.1 多态概述

同一个对象,在不同时刻表现出来的不同形态

举例:猫

我们可以说猫是猫:猫 cat = new ();

我们也可以说猫是动物:动物 animal = new ();

这里猫在不同的时刻表现出来了不同的形态,这就是多态

多态的前提和体现

有继承 /实现关系

有方法重写

有父类引用指向子类对象

(3)

1. 多态

1.2 多态中成员访问特点

 成员变量:编译看左边,执行看左边

 成员方法:编译看左边,执行看右边 为什么成员变量和成员方法的访问不一样呢?

 因为成员方法有重写,而成员变量没有

(4)

1. 多态

1.3 多态的好处和弊端

 多态的好处:提高了程序的扩展性

具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作

 多态的弊端:不能使用子类的特有功能

(5)

1. 多态

1.4 多态中的转型

 向上转型 从子到父

父类引用指向子类对象

 向下转型 从父到子

父类引用转为子类对象

(6)

1. 多态

1.5 多态转型内存图解

public class AnimalDemo {

public static void main(String[] args) { //向上转型

Animal a = new Cat();

a.eat();

//向下转型

Cat c = (Cat) a;

c.eat();

c.playGame();

//向上转型 a = new Dog();

a.eat();

//向下转型

//ClassCastException 类型转换异常 Cat cc = (Cat) a;

cc.eat();

cc.playGame();

} }

栈内存 堆内存

方法:main

方法:main 方法:main Animal a public class Cat extends Animal {

public void eat() {

System.out.println("猫吃鱼");

}

public void playGame() {

System.out.println("猫捉迷藏");

}

} public class Animal { public void eat() {

System.out.println("动物吃东西");

} }

new Cat()001

方法:main

Animal a 001

(7)

1. 多态

1.5 多态转型内存图解

public class AnimalDemo {

public static void main(String[] args) { //向上转型

Animal a = new Cat();

a.eat();

//向下转型

Cat c = (Cat) a;

c.eat();

c.playGame();

//向上转型 a = new Dog();

a.eat();

//向下转型

//ClassCastException 类型转换异常 Cat cc = (Cat) a;

cc.eat();

cc.playGame();

} }

栈内存 堆内存

public class Cat extends Animal { public void eat() {

System.out.println("猫吃鱼");

}

public void playGame() {

System.out.println("猫捉迷藏");

} }

new Cat()001

方法:main

Animal a 001

编译看左边 执行看右边

方法:eat 所属:Cat类

方法:eat 所属:Cat类

输出:

猫吃鱼

(8)

1. 多态

1.5 多态转型内存图解

public class AnimalDemo {

public static void main(String[] args) { //向上转型

Animal a = new Cat();

a.eat();

//向下转型

Cat c = (Cat) a;

c.eat();

c.playGame();

//向上转型 a = new Dog();

a.eat();

//向下转型

//ClassCastException 类型转换异常 Cat cc = (Cat) a;

cc.eat();

cc.playGame();

} }

栈内存 堆内存

new Cat()001

方法:main

Animal a 001 方法:main

Animal a 001 Cat c

输出:

猫吃鱼

方法:main

Animal a 001 Cat c 001

(9)

1. 多态

1.5 多态转型内存图解

public class AnimalDemo {

public static void main(String[] args) { //向上转型

Animal a = new Cat();

a.eat();

//向下转型

Cat c = (Cat) a;

c.eat();

c.playGame();

//向上转型 a = new Dog();

a.eat();

//向下转型

//ClassCastException 类型转换异常 Cat cc = (Cat) a;

cc.eat();

cc.playGame();

} }

栈内存 堆内存

new Cat()001

输出:

猫吃鱼

方法:main

Animal a 001 Cat c 001 public class Cat extends Animal {

public void eat() {

System.out.println("猫吃鱼");

}

public void playGame() {

System.out.println("猫捉迷藏");

}

} 输出:

猫吃鱼

输出:

猫捉迷藏

(10)

1. 多态

1.5 多态转型内存图解

public class AnimalDemo {

public static void main(String[] args) { //向上转型

Animal a = new Cat();

a.eat();

//向下转型

Cat c = (Cat) a;

c.eat();

c.playGame();

//向上转型 a = new Dog();

a.eat();

//向下转型

//ClassCastException 类型转换异常 Cat cc = (Cat) a;

cc.eat();

cc.playGame();

} }

栈内存 堆内存

new Cat()001

输出:

猫吃鱼

方法:main

Animal a 001 Cat c 001

输出:

猫吃鱼

输出:

猫捉迷藏

new Dog()002 public class Dog extends Animal {

public void eat() {

System.out.println("狗吃骨头");

}

} public class Animal { public void eat() {

System.out.println("动物吃东西");

} }

方法:main

Animal a 002 Cat c 001

(11)

1. 多态

1.5 多态转型内存图解

public class AnimalDemo {

public static void main(String[] args) { //向上转型

Animal a = new Cat();

a.eat();

//向下转型

Cat c = (Cat) a;

c.eat();

c.playGame();

//向上转型 a = new Dog();

a.eat();

//向下转型

//ClassCastException 类型转换异常 Cat cc = (Cat) a;

cc.eat();

cc.playGame();

} }

栈内存 堆内存

new Cat()001

输出:

猫吃鱼

输出:

猫吃鱼

输出:

猫捉迷藏

new Dog()002 public class Dog extends Animal {

public void eat() {

System.out.println("狗吃骨头");

} }

方法:main

Animal a 002 Cat c 001

编译看左边 执行看右边

方法:eat 所属:Dog类

方法:eat 所属:Dog类

输出:

狗吃骨头

(12)

1. 多态

1.5 多态转型内存图解

public class AnimalDemo {

public static void main(String[] args) { //向上转型

Animal a = new Cat();

a.eat();

//向下转型

Cat c = (Cat) a;

c.eat();

c.playGame();

//向上转型 a = new Dog();

a.eat();

//向下转型

//ClassCastException 类型转换异常 Cat cc = (Cat) a;

cc.eat();

cc.playGame();

} }

栈内存 堆内存

new Cat()001

输出:

猫吃鱼

输出:

猫吃鱼

输出:

猫捉迷藏

new Dog()002

输出:

狗吃骨头

方法:main

Animal a 002 Cat c 001 方法:main

Animal a 002 Cat c 001 Cat cc

public class Cat extends Animal { public void eat() {

System.out.println("猫吃鱼");

}

public void playGame() {

System.out.println("猫捉迷藏");

} }

public class Animal { public void eat() {

System.out.println("动物吃东西");

} }

public class Dog extends Animal { public void eat() {

System.out.println("狗吃骨头");

} }

输出:

ClassCastException

(13)

1. 多态

案例:猫和狗

需求:请采用多态的思想实现猫和狗的案例,并在测试类中进行测试 思路:

①定义动物类(Animal) 成员变量:姓名,年龄 构造方法:无参,带参

成员方法:get/set方法,吃饭()

②定义猫类(Cat),继承动物类 构造方法:无参,带参 成员方法:重写吃饭()

③定义狗类(Dog),继承动物类 构造方法:无参,带参 成员方法:重写吃饭()

④定义测试类(AnimalDemo),写代码测试

(14)

Referensi

Dokumen terkait

屡 观察下面的例字,比较尸字旁形态的细微差别, 然后尝试描红。 通过描红,可以发现,在“屋”“居”“屡”中,尸字旁的形态略有不同。 我来临摹 我来临摹 第 11 课 尸字旁 临摹下面的例字,注意尸字旁的书写要领。 我来评价 我学会了尸字旁的写法。□ 看谁书写的笔画有力度。 书法练习指导 五年级 下册... 老师作简要评价和总结。

温度。 由此可见,温度是组成物质的大量分子的热运动的集体表 现,它只具有统计的意义,对单个分子来说,温度是没有意义的。 讨论与思考 初中物理中,把温度定义为“物体冷热的程度”,现在我们把 温度定义为“系统内分子平均动能的标志”,请比较这两种定义的 联系与区别。 气体压强的微观解释 在研究大气压的时候,有一个问题常使人们迷惑不解:在“大