多态是同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
我们也可以说猫是动物:动物 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,这就是多态
多态的前提有三个:
1、要有类的继承/接口的实现
2、要有方法的重写
3、要有父类引用指向子类对象
比如举个例子:三个前提都得有
public class polymorphism {
public static void main(String[] args) {
//当前事物是一只动物
Animal an = new Cat(); //3、父类引用指向子类对象
}
}
class Animal{
public void eat(){
System.out.println("动物吃饭");
}
}
class Cat extends Animal{ //1、类的继承
@Override //2、方法的重写
public void eat() {
System.out.println("猫吃鱼");
}
}
明白了多态概念,接下来就是多态成员的访问特点:
成员变量:编译看左边(父类),运行看左边(父类)
成员方法:编译看左边(父类),运行看右边(子类)
下来演示一下这个特点都是什么意思?????
这里定义了一个父类,一个子类,子类继承了父类,父类引用指向了子类对象;在父类和子类里我们都定义了一个成员变量和成员方法。那来猜一下运行结果是什么???是父类里的10和“父类方法”吗??
public class polymorphism {
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.num);
fu.method();
}
}
class Fu{
int num = 10;
public void method(){
System.out.println("父类方法");
}
}
class Zi extends Fu{
int num = 20;
@Override
public void method() {
System.out.println("子类方法");
}
}
运行结果是:10 “子类方法”。。。
所以我们就可以看出:
在运行的时候,成员变量打印的是父类的成员变量,这就是“运行看左边(父类)”。如果把子类的成员变量int num = 20;删掉也没有影响,但是父类里的int num = 10;删掉编译fu.num这句就会报错,这就是“编译看左边(父类)”。也就是说,如果不在父类里定义成员变量,只在子类里定义,那编译就会报错,这就是编译取决于父类是否定义。
成员方法打印的是子类的成员方法里的内容,这就是“运行看右边(子类)”。那我们可不可以把父类里的方法删掉呢?答案是不可以的,删掉编译fu.method()就会报错,这就是“编译看左边(父类)”。也可以理解为如果父类里没有定义方法,那么子类里的重写也就没有意义,所以编译的时候必须要看父类里有没有定义方法,也就是编译看左边。
大家可以把代码自己试验一下,把父类以及子类里的成员变量和成员方法随意删掉来验证编译看左边,运行看右边等等~~~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)