多态概述:某一个事物,在不同时刻表现出不同的状态
例如:猫可以是猫的类型 猫 m = new 猫();
同时,猫也是动物的一种,也可以把猫成为动物
动物 d = new 猫();
像这样new出的对象要从右边向左边读,例如 猫 m = new 猫();;猫是猫
动物 d = new 猫(); 读 猫是动物;
多态的前提和体现
1.有继承关系
2.有方法重写
3.有父类引用指向子类对象
父 f = new 子();
多态的成员访问特点(通过代码展示)
A:成员变量
编译看左边,运行看左边
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
C:成员方法
编译看左边,访问看右边
D:静态方法
编译看左边,运行看左边
(静态和类相关,所以算不上重写,访问的还是左边)
A:成员变量
编译看左边,运行看左边
class Fu{
public int num = 100;
public void show() {
System.out.println("Fu的方法");
}
}
class Zi extends Fu{
public int num = 1000;
public int num2 = 50;
public void show() {
System.out.println("Zi类的方法");
}
}
public class test {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.num);
//System.out.println(f.num2); 找不到符号
//f.num2 因为编译看左边 Fu f Fu类没有num2,所以提示找不到符号
}
}
运行结果:
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
C:成员方法
编译看左边,访问看右边
class Fu{
public int num = 100;
public void show() {
System.out.println("Fu的方法");
}
}
class Zi extends Fu{
public int num = 1000;
public int num2 = 50;
public void show() {
System.out.println("Zi类重写Fu类的方法");
}
public void mo() {
System.out.println("Zi类自己的方法");
}
}
public class test {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.num);
f.show();
//f.mo(); 找不到符号
/**
提示找不到符号是因为编译看左边,而左边Fu是没有mo方法的
所以找不到符号
**/
}
}
运行结果
D:静态方法
编译看左边,运行看左边
(静态和类相关,所以算不上重写,访问的还是左边)
class Fu{
public int num = 100;
public void show() {
System.out.println("Fu的方法");
}
public static void fun() {
System.out.println("Fu类的静态方法");
}
}
class Zi extends Fu{
public int num = 1000;
public int num2 = 50;
public void show() {
System.out.println("Zi类重写Fu类的方法");
}
public void mo() {
System.out.println("Zi类自己的方法");
}
public static void fun() {
System.out.println("Zi类的静态方法");
}
}
public class test {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.num);
f.show();
f.fun();
//f.mo(); 找不到符号
}
}
运行结果