day09Java-多态01
多态
我对多态的最终理解:父类的引用指向不同的子类,调用相同的方法从而实现不同的功能。
多态概述以外可参考
博客名称 | 连接地址 |
---|---|
day09Java-多态02 | https://blog.csdn.net/qq_40332952/article/details/104715953 |
多态:同一个对象(事物),在不同时刻体现出来的不同状态。
举例:
猫是猫,猫是动物。
水(液体,固体,气态)。
多态的前提:
A:要有继承关系。
B:要有方法重写。
其实没有也是可以的,但是如果没有这个就没有意义。
自己的理解:
多态是由方法的重写来实现的,比如说一个动物类有一个吃饭的方法(),再有两个子类猫和狗都重写了父类的吃饭方法,猫吃的是鱼,狗吃的是肉,通过父类引用去指向猫或者狗。从而实现调用相同的方法实现不同的功能。
C:要有父类引用指向子类对象。
父 f = new 子();
用代码体现一下多态。
多态中的成员访问特点:
A:成员变量
编译看左边,运行看左边。
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
C:成员方法
编译看左边,运行看右边。
D:静态方法
编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是左边的)
由于成员方法存在方法重写,所以它运行看右边。
多态继承中的内存图解
多态中成员变量访问特点代码演示
System.out.println(fu.num2); //编译报错,因为左边没有该成员变量,所以说编译看左边。
fu.num; 输出值为100,100是Fu中的成员变量,所以说执行看左边。
多态中成员变量访问特点结论:
编译看左边,运行看右边。
class Fu {
public int num = 100;
}
class Zi extends Fu {
public int num = 1000;
public int num2 = 10000;
}
public class DuoTaiTest{
public static void main(String[] args) {
Fu fu = new Zi();
System.out.println(fu.num);
//System.out.println(fu.num2); 因为左边没有该成员变量所以报错,所以说编译看左边
}
}
结果
100
多态中成员方法访问特点代码演示
fu.method(); 编译报错,因为在Fu中没有method()方法,method()方法是Zi独有的。所以说编译看左边。
fu.show(); 输出值为shwo() Zi,调用的是Zi的show()方法。所以说运行看右边。
多态中成员方法访问特点结论:
编译看左边,运行看右边
原因:由于成员方法存在方法重写,所以它运行看右边。
class Fu {
public void show(){
System.out.println("show() Fu");
}
}
class Zi extends Fu {
//子类重写父类show()方法
public void show(){
System.out.println("shwo() Zi");
}
//子类独有的method()方法
public void method(){
System.out.println("method() Zi");
}
}
public class DuoTaiTest{
public static void main(String[] args) {
Fu fu = new Zi();
fu.show();
//fu.method();
}
}
结果:
shwo() Zi
多态中静态方法访问特点代码演示
fu.method(); 编译报错,因为在Fu中没有method()静态方法,编译看左边。
fu.function(); 输出值为function() Fu,调用的Fu类中方法function()方法,所以运行看左边。
多态中静态方法总结:
编译看左边,运行看左边。(静态和类相关,算不上重写,所以,访问还是左边的)
class Fu {
public static void function() {
System.out.println("function() Fu");
}
}
class Zi extends Fu {
public static void function() {
System.out.println("function() Zi");
}
public static void method() {
System.out.println("method() Zi");
}
}
public class DuoTaiTest {
public static void main(String[] args) {
Fu fu = new Zi();
fu.function();
// fu.method();
}
}
结果:
function() Fu