非静态成员方法:
多态中,父类引用指向子类对象,调用非静态成员方法时,编译时看父类,运行时看子类.
若父类中,没有则报错;否则,运行子类中的方法.
//1.Test.class加载进方法区
class Test {
//2.main方法进栈
public static void main(String[] ages){
//父类引用指向子类对象
//3.Father.class加载进方法区
//4.Son.class加载进方法区
Father f = new Son();
//5.去Father.class中找speak()方法(若没有此方法,将报错:找不到符号)
//6.调用Son.class中的speak()方法
f.speak();
Son s = new Son();
//7.调用Son.class中的speak()方法
s.speak();
//访问成员方法:编译时看左边,运行时看右边
}
}
class Father {
int num = 10;
public void speak(){
System.out.println("Father");
}
}
class Son extends Father {
int num = 20;
public void speak(){
System.out.println("Son");
}
}
静态成员方法:
因为是静态的,所以,编译时指向那个,运行时就不再改变.也就是,访问静态方法,编译时看左边,运行时,也看左边.
//1.Test.class加载进方法区
class Test {
//2.main方法进栈
public static void main(String[] ages){
//父类引用指向子类对象
//3.Father.class加载进方法区
//4.Son.class加载进方法区
Father f = new Son();
//5.去Father.class中找speak()方法
//6.调用Father.class中的speak()方法
f.speak();
Son s = new Son();
//7.调用Son.class中的speak()方法
s.speak();
//访问静态成员方法:编译时看左边,运行时看左边
}
}
class Father {
int num = 10;
public static void speak(){
System.out.println("Father");
}
}
class Son extends Father {
int num = 20;
public static void speak(){
System.out.println("Son");
}
}