動態方法排程:
1. 訪問一個引用型的變數的非靜態方法,執行時與實際引用的物件的方法繫結。
2. 訪問一個引用型的變數的.靜態方法,執行時與宣告的類的方法繫結。
3. 訪問一個引用型的變數的成員變數(包括靜態變數和例項變數),執行時與宣告的類的成員變數繫結。
第3點尤其注意啊,之前我從來沒注意過啊
1. 非靜態方法:
public class Person {public String name; public void getInfo() { tln("父類"); }}public class Student extends Person { public void getInfo() { // 方法重寫 nfo(); // 呼叫父類的方法 tln("子類");}public static void main(String[] args) { Person s = new Student(); Person t = new Person(); s = t; // S的物件型別是父類,即Person類 nfo();}}
執行結果為:父類
2. 靜態方法:
public class Person {public String name; public static void getInfo() { tln("父類"); }}public class Student extends Person {Publics static void getInfo() { // 方法重寫tln("子類");}public static void main(String[] args) {Person s = new Student();nfo(); //等價於nfo();}}
執行結果為:父類
3. 成員變數
public class erson {public String name = "father"; public void getInfo() { tln("父類"); }}public class Student extends Person {public String name = "son";public void getInfo() { // 方法重寫nfo(); // 呼叫父類的方法tln("子類");}public static void main(String[] args) {Person s = new Student();Person t = new Person();s = t;tln();}}
執行結果:fanther
將成員變數變為static型別的也是一樣的
另外對於如下兩個變數
Students = new Student();Person t = new Student();
不過這兩者實際上是有區別的,當子類Student中有了自己的個性方法(在父類中沒有的)時,比如有了方法
public goSchool(){}
那麼只有s可以呼叫這個goSchool方法
而t不能呼叫
希望本文所述對大家java程式設計有所幫助。