JAVA 多态
一、多态概述
1、多态概述
某一个事物,在不同时刻表现出来的不同状态。
举例: Dog d=new Dog();
Animal a=new Dog();
狗可以是狗的类型,同时猫也是动物的一种,也可以把狗称为动物。动物 a = new Dog(); 意思就是用父类指向子类对象。
2、多态的前提
(1)要有类的继承关系
(2)子类要有父类的方法重写
(3)要有父类指向子类对象
3、多态的好处
(1)提高了代码的维护性
(2)提高了代码的扩展性
多态的弊端
不能使用子类的特有功能(可以把父类的引用强制转换为子类的引用,即向下转型)
4、特点
(1)成员变量
编译看左边,运行看左边。
(2)构造方法
创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。
(3)成员方法
编译看左边,运行看右边。
(4)静态方法
编译看左边,运行看左边。(静态和类相关,算不上重写,所以,访问还是左边的)
二、猫狗案例多态版
1、测试类:(注意:多态测试类中不能直接调用子类的特有功能,需向下转型后调用。)
public class Mytest {
public static void main(String[] args) {
Animals animals = new Cat();
animals.eat();
animals.sleep();
Cat cat=(Cat) animals;
cat.keai();
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$");
Animals animals1=new Dog();
animals1.sleep();
animals1.eat();
Dog dog=(Dog) animals1;
dog.Warrning();
}
}
2、父类
public class Animals {
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
3、猫类
public class Cat extends Animals {
public void keai() {
System.out.println("猫会卖萌");
}
@Override
public void sleep() {
System.out.println("猫睡得早");
}
@Override
public void eat() {
System.out.println("猫爱吃鱼");
}
}
狗类
public class Dog extends Animals {
public void Warrning(){
System.out.println("狗能看家护院");
}
@Override
public void eat() {
System.out.println("狗爱吃肉");
}
@Override
public void sleep() {
System.out.println("狗睡得晚");
}
}
三、多态内存图示例
多态图示例
public class Demoduotai {
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.num);
fu.show();
Zi zi= (Zi) fu;
System.out.println(zi.num);
zi.method();
}
}
class Fu{
int num=50;
public void show(){
System.out.println("fu 执行了");
}
}
class Zi extends Fu{
int a=20;
int num=100;
@Override
public void show() {
System.out.println("zi 执行了");
}
public void method(){
System.out.println("子类特有的功能");
}
}
输出结果为
50
Zi 执行了
100
子类特有的功能