java多态如果放在生活中多态就是比如做一件事情,不同人有不同的实现方式。
但是在java这里指的多态,它设定了限制,必须是多个子类继承同一个父类实现方法的重写。
同时创建的对象的时候new出来的子类同时指定父类引用。(这样就造成了生成的对象只能调用和父类共有的方法,不能调用子类特有的方法)。
多态是同一个行为具有多个不同表现形式或形态的能力。
Animal am = new Cat();语句在堆内存中开辟了子类(Cat)的对象,并把栈内存中的父类(Animal)的引用指向了这个Cat对象。
执行强转语句Cat ct = (Cat)am;之后,ct(栈里面声明的Cat类型的变量)就指向最开始在堆内存中创建的那个Cat类型的对象了。
多态存在的三个必要条件继承
重写
父类引用指向子类对象
Parent p = new Child();
成员变量 编译看左边(父类),运行看左边(父类) 成员方法 编译看左边(父类),运行看右边(子类)。动态绑定 静态方法 编译看左边(父类),运行看左边(父类)。
(静态和类相关,算不上重写,所以,访问还是左边的) 只有非静态的成员方法,编译看左边,运行看右边多态的弊端:多态后不能使用子类特有的属性和方法。
如果我们非要想用也是可以的
那我们就可以把这个父类引用指向了子类对象的家伙am再强制变回Cat类型。
package com.lky.h1;
class Animal {
int num = 10;
static int age = 20;
public void eat() {
System.out.println("动物吃饭");
}
public static void sleep() {
System.out.println("动物在睡觉");
}
public void run(){
System.out.println("动物在奔跑");
}
}
class Cat extends Animal {
int num = 80;
static int age = 90;
String name = "tomCat";
public void eat() {
System.out.println("猫吃饭");
}
public static void sleep() {
System.out.println("猫在睡觉");
}
public void catchMouse() {
System.out.println("猫在抓老鼠");
}
}
public class Test3 {
public static void main(String[] args) {
Animal am = new Cat();
am.eat();
am.sleep();
am.run();
//am.catchMouse();这里先注释掉,等会会说明
//System.out.println(am.name);//这里先注释,待会说明
System.out.println(am.num);
System.out.println(am.age);
}
}
参考文章
对于向上转型,程序会自动完成,而对于向下转型时,必须明确的指明要转型的子类类型。
向上转型,new 了一个子类可以指向父类
向下转型,把指向父类的转成子类我这里的向下转型指的是把向上转型返回的对象指向强转成子类,我可以没有说new了一个父类指向子类,现实中不行,java也是不行的。