1,成员变量:在多态中,子父类成员变量同名。
在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误)
运行时期:也是参考引用型变量所属的类中是否有调用的成员。
简单一句话:无论编译和运行,成员变量参考的都是引用变量所属的类中的成员变量。
再说的更容易记忆一些:成员变量 ---编译运行都看 =左边。
代码:
class Fu{
int num=5;//成员变量
void method1(){
System.out.println("fu method_1");
}
void method2(){
System.out.println("fu method_2");
}
}
class Zi extends Fu{
int num = 8;//成员变量
void method1(){
System.out.println("zi method_1");
}
void method3(){
System.out.println("zi method_3");
}
}
public class Test3 {
public static void main(String[] args) {
Fu f= new Zi();
System.out.println(f.num);//5
Zi z= new Zi();
System.out.println(z.num);//8
}
}
2,成员函数。
编译时期:参考引用型变量所属的类中是否有调用的方法。
运行事情:参考的是对象所属的类中是否有调用的方法。
为什么是这样的呢?因为在子父类中,对于一模一样的成员函数,有一个特性:覆盖。
简单一句:成员函数,编译看引用型变量所属的类,运行看对象所属的类。
更简单:成员函数 ---编译看 =左边,运行看= 右边。 (Fu f = new Zi();)
左边 右边
代码:
class Fu{
void method1(){//成员函数
System.out.println("fu method_1");
}
void method2(){//成员函数
System.out.println("fu method_2");
}
}
class Zi extends Fu{
void method1(){//成员函数
System.out.println("zi method_1");
}
void method3(){//成员函数
System.out.println("zi method_3");
}
}
public class Test3 {
public static void main(String[] args) {
Fu f= new Zi();
f.method1();//zi method_1
f.method2();//fu method_2
Zi z= new Zi();
z.method1();//zi method_1
z.method2();//fu method_2
z.method3();//zi method_3
}
}
3,静态函数。
编译时期:参考的是引用型变量所属的类中是否有调用的成员。
运行时期:也是参考引用型变量所属的类中是否有调用的成员。
为什么是这样的呢?因为静态方法,其实不所属于对象,而是所属于该方法所在的类。
调用静态的方法引用是哪个类的引用调用的就是哪个类中的静态方法。
简单说:静态函数 ---编译运行都看 =左边。
代码:
class Fu{
void method1(){
System.out.println("fu method_1");
}
void method2(){
System.out.println("fu method_2");
}
static void method4(){//静态函数
System.out.println("fu method_4");
}
}
class Zi extends Fu{
void method1(){
System.out.println("zi method_1");
}
void method3(){
System.out.println("zi method_3");
}
static void method4(){//静态函数
System.out.println("zi method_4");
}
}
public class Test3 {
public static void main(String[] args) {
Fu f= new Zi();
f.method4();//fu method_4
Zi z = new Zi();
z.method4();//zi method_4
}
}