学习时间
2020-11-30
学习内容
多态
概述
某一个事物,在不同时刻表现出来的不同状态。
一只名叫ca的猫属于猫这个类型,也属于动物这个类型
举例: Cat ca=new Cat();
Animal an=new Cat();
猫可以是猫的类型。猫 m = new 猫();
同时猫也是动物的一种,也可以把猫称为动物。动物 d = new 猫();
前提
a:要有继承关系。
b:要有方法重写。 其实没有也是可以的,但是如果没有这个就没有意义。
c:要有父类引用指向子类对象。
格式
父 f = new 子();
好处:
a:可以提高代码的维护性(由继承保证)
b:可以提高代码的扩展性
弊端:
它不能引用子类特有的方法
多态的向下转型
多态的向下转型就是把父类的引用强制转换为子类的引用
由于只new了一次,所以并没有再额外开辟空间
演示
我们通过猫狗案例来演示以下
public class Test {
public static void main(String[] args) {
Animal an=new Cat();
an.sleep();
an.eat();
Cat ca=(Cat) an;
ca.catchMouse();
System.out.println(an);
System.out.println(ca);
}
}
class Animal{
int age;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
class Cat extends Animal{
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
class Dog extends Animal{
public void lookDoor(){
System.out.println("狗看大门");
}
}
输出结果;
睡觉
吃饭
猫抓老鼠
com.xupt.demo.Cat@1540e19d
com.xupt.demo.Cat@1540e19d
可以看出,多态向下转型的时候并没有再多开辟空间
多态中的访问特点
多态中的成员访问特点
a:成员变量
编译看左边,运行看左边。
b:构造方法
创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。
c:成员方法
编译看左边,运行看右边。
d:静态方法
编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是左边的)
演示
我们通过以下案例来演示
1、这一段代码是有错误的,加注释符的那一行会因为父类对象不能直接调用子类特有的方法而报错
class Fu {
public void show() {
System.out.println("fu show");
}
}
class Zi extends Fu {
public void show() {
System.out.println("zi show");
}
public void method() {
System.out.println("zi method");
}
}
class DuoTaiTest3 {
public static void main(String[] args){
Fu f = new Zi();
f.method();//
f.show();
}
}
我们的解决方法就是向下转型,将原来的加注释符的代码替换为
Zi a=(Zi) f;
a.method();
就可以了
2、
class A {
public void show() {
show2();
}
public void show2() {
System.out.println("1");
}
}
class B extends A {
public void show2() {
System.out.println("2");
}
}
class C extends B {
public void show() {
super.show();
}
public void show2() {
System.out.println("3");
}
}
public class DuoTaiTest4 {
public static void main(String[] args) {
A a = new B();
a.show();
B b = new C();
b.show();
}
}
运行结果:
2
3