黑马程序员 08 Java基础教学 - 08 - 面向对象(4) 之 多态

时间:2021-09-27 00:47:23

               -------android培训java培训、期待与您交流! ----------




本日志doc文档下载







一、多态

1、多态的体现

父类的引用指向了自己的子类对象

2、多态的前提

必须是类与类之间的关系。要么继承,要么实现

通常还有一个前提就是:覆盖

3、多态的好处

多态的出现大大的提高了程序的扩展性

4、多态的弊端

提高了扩展性的同时,只能使用父类的引用访问父类中的成员。

5、多态的应用

多态示例一:


abstract class Animal {
abstract void eat();
}

class Activities {
void doActivity(Animal a) {
if (a != null) {
a.eat();
}
if (a instanceof Cat) {
((Cat) a).catchMouse();
} else if (a instanceof Dog) {
((Dog) a).kanJia();
} else if (a instanceof Pig) {
((Pig) a).sleep();
}
}
}

class Cat extends Animal {
@Override
void eat() {
System.out.println("吃鱼");
}

void catchMouse() {
System.out.println("抓老鼠");
}
}

class Dog extends Animal {
@Override
void eat() {
System.out.println("吃骨头");
}

void kanJia() {
System.out.println("看家");
}
}

class Pig extends Animal {
@Override
void eat() {
System.out.println("吃饲料");
}

void sleep() {
System.out.println("老是睡觉");
}
}

public class DuoTaiDemo1 {
public static void main(String[] args) {

// new Activities().doActivity(null);

Animal a = new Cat();//类型提升,向上转型
a.eat();
//如果想要调用猫的特有方法,如何操作??
//强制将父类的应用转成子类类型,向下转型
Cat c = (Cat)a;
c.catchMouse();

/**
* 注意:前往不能将父类对象转成子类类型
* Animal a = new Animal();
* Cat c = (Cat)a;
* 我们能转换的是父类引用执行了自己子类对象是,该应用可以被提升
* 多态自始至终都是子类对象在做着变化
*/

//下面代码是利用Activities类创建对象完成对Cat,Dog,Pig进行的活动
new Activities().doActivity(new Cat());
new Activities().doActivity(new Dog());
new Activities().doActivity(new Pig());
}
}

多态示例二

/**
* 需求:电脑运行实例,电脑运行基于主板,提供扩展功能
*
* @author LeeYou
*
*/

interface PCI {
public void open();

public void close();
}

/**
* 主板,使用PCI接口
*
*/
class MainBoard {
public void run() {
System.out.println("mainBoard run...");
}

public void userPCI(PCI p) {
if (p != null) {
p.open();
p.close();
}
}
}

/**
* 网卡扩展类,实现PCI接口
*
*/
class NetCard implements PCI {

@Override
public void open() {
System.out.println("netcard open...");
}

@Override
public void close() {
System.out.println("netcard close...");
}

}

/**
* 声卡扩展类,实现PCI接口
*
*/
class SoundCard implements PCI {

@Override
public void open() {
System.out.println("soundcard open...");
}

@Override
public void close() {
System.out.println("soundcard close...");
}

}

class DuoTaiDemo3 {
public static void main(String[] args) {
MainBoard mb = new MainBoard();
mb.run();
mb.userPCI(new SoundCard());
mb.userPCI(new NetCard());
}
}

6、多态的注意事项

6.1在多态中成员函数的特点

6.1.1 在编译时期:参阅引用型变量所属的类是否有调用的方法。如果有,编译通过;如果没有,编译失败。

6.1.2 在运行时期:参阅对象所属的类中是否有调用的方法。

6.2在多态中,成员变量的特点(常用于面试)

无论编译和运行,都参考左边(引用型变量所属的类)

6.3在多态中,静态成员函数的特点(常用于面试)

无论在编译和运行,都参考左边(引用型变量所属的类)

代码如下:

class Father {
int num = 10;
void method1() {
System.out.println("Father method 1");
}

void method2() {
System.out.println("Father method 2");
}
static void method4() {
System.out.println("Father method 4");
}
}

class Son extends Father {
int num = 20;
void method1(){
System.out.println("Son method 1");
}
void method3(){
System.out.println("Son method 3");
}
static void method4() {
System.out.println("Son method 4");
}
}

class DuoTaiDemo2 {
public static void main(String[] args) {
//演示6.1
Father f = new Son();
f.method1();
f.method2();//对应6.1.2
//f.method3(); 对应6.1.1

//演示6.2
System.out.println(f.num);

//演示6.3
f.method4();
}
}

结果如下截图:

黑马程序员 08 Java基础教学 - 08 - 面向对象(4) 之 多态