2014-12-07 28 views
0
//employee class 
public class Employee { 

protected String psrn; 

public Employee(String n) 
{ 
    psrn =n; 
} 

public String getPSRN() 
{ 
    return ("Emp:"+psrn); 
} 

void computeSimilarity(Employee t) 
{ 
    System.out.println("Emp::compute---"+t.getPSRN()); 
} 

} 

//student class 


public class Student extends Employee{ 
public Student(String n) { 
     super(n); 
     // TODO Auto-generated constructor stub 
    } 

public String getPSRN() 
{ 
    return("Std:"+psrn); 
} 
void computeSimilarity(Student t) 
{ 
    System.out.println("Std::compute---"+t.getPSRN()); 
} 
} 

//tester class 

public class Tester { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
Employee e0=new Employee("0"); 
Employee e=new Student("1"); 
Student s=new Student("2"); 

e.computeSimilarity(s); 
s.computeSimilarity(e); 
s.computeSimilarity(s); 
s.computeSimilarity(e0); 

} 

} 

輸出出來是:爪哇多態性:非最終方法調用

的Emp ::計算---標準:2

的Emp ::計算---標準: 1

的std ::計算---標準:2

的Emp ::計算---的Emp:0

但是通過我的理解,它應該出來是

的Emp ::計算---標準:2

的Emp ::計算---標準:1

標準: :計算---標準:2

的std ::計算---的Emp:0

誰能告訴我,我要去哪裏錯了?

回答

1

如果我讀這正確的,你得到了一個意想不到的結果爲

s.computeSimilarity(e0); 

你的期望是Student.computeSimilarity(學生)會被調用,但是Employee.computSimiarity(員工)被稱爲。

原因Employee.computSimiarity(Employee)被調用是因爲Student類中的computeSimilarity方法不是基類方法的重載。

爲了覆蓋一個方法,你必須保持確切的簽名。

void computeSimilarity(Employee t) 

void computeSimilarity(Student s) 

是不同的簽名。

========================

建議你:利用Java的@Override註解。如果您將此註釋放在您打算用作覆蓋的方法上,編譯器將確保情況如此。如果你把這個註解放在Student類的方法中,編譯器會給你一個錯誤信息。

所以在你的學生類,你會:

@Override 
void computeSimilarity(Student t) { 
    System.out.println("Std::compute---"+t.getPSRN()); 
} 

,編譯器將標記爲錯誤,你會糾正以下更改錯誤:

@Override 
void computeSimilarity(Employee t) { 
    System.out.println("Std::compute---"+t.getPSRN()); 
} 

,然後你會有理想的行爲。

+0

@Hubble - 這是否回答您的問題? – EJK 2014-12-07 04:35:53

+0

是的,非常感謝! – Hubble 2014-12-07 10:53:07

0

你有僱員的下列方法:

void computeSimilarity(Employee t) 

,這一次在學生:

void computeSimilarity(Student t) 

覆蓋第一種方法第二種方法。這是一個完全獨立的方法,恰好有相同的名稱。

爲什麼不呢?想象一下,如果它覆蓋。然後,該代碼將工作:

class Employee { 
    void print(Object o) { 
     System.out.println(o); 
    } 
} 
class Student extends Employee { 
    void print(String s) { 
     System.out.println(s.length()); 
    } 
} 
public class Main { 
    public static void main(String[] args) { 
     Employee e = new Student(); 
     e.print(e); 
    } 
} 

,它會以某種方式調用print(String s)與作爲Student的參數。這不應該被允許發生 - 事實上,它允許發生而不是,因爲Student中的方法不覆蓋Employee中的方法。

有一些語言,如果參數是一個字符串,則上面的代碼將調用Student方法,否則就是Employee方法。 Java不這樣做。