-------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();
}
}结果如下截图: