2012-07-20 90 views
4

我可以使此代碼工作,沒有對象作爲抽象方法的輸入參數。例如,如果我將printInformation()方法的輸入參數設爲person,並將emp設爲printInformation(int x),則該方法有效。與Java對象作爲輸入參數抽象方法

我使輸入參數作爲printInformation()方法的對象,如下所示的瞬間,它引發錯誤

EMP不是抽象的,不重寫抽象方法在人類EMP printInformation(人)擴展人{^

abstract class person{ 
abstract void printInformation(person p); 
} 

class emp extends person{ 
emp(){ 
    System.out.println("This is a emp constructor"); 
} 
void printInformation(emp e){ 
    System.out.println("This is an emp"); 
} 
} 

class entity{ 
public static void main(String args[]){ 
    emp employeeObject = new emp(); 
    employeeObject.printInformation(employeeObject); 
} 
} 
+1

這是奇怪的是'person.printInformation'需要另一個'person'。它不應該打印正在訪問的'person'實例的信息嗎?此外,Java約定是以大寫字母開始類名,例如'人'和'員工'。 – 2012-07-20 02:24:02

+0

我的更多是一個概念問題......我仍然是一個新手。爲什麼我可以重寫,如果輸入參數不是一個對象類型?當它是一個像int這樣的基本類型時,我可以覆蓋它... – user547453 2012-07-20 02:27:31

回答

4

你的接口有這樣定義的函數:

void printInformation(person p); 

你班有這樣定義的函數:

void printInformation(emp e); 

這些都是不相同的功能。 Java認爲第二個是一個新的重載方法,而不是從接口實現該方法。由於類emp未被聲明爲抽象,但未提供抽象方法void printInformation(person)的實現,因此是錯誤的。

+0

我不明白當你說他們不是相同的功能。爲什麼我可以重寫,如果輸入參數不是一個對象類型?當它是一個像int這樣的基本類型時,我可以覆蓋它... – user547453 2012-07-20 02:28:10

+0

具有相同名稱並帶有不同參數的兩個函數不是同一個函數。 – jahroy 2012-07-20 02:31:14

+0

@jahroy ....他們怎麼會是不同的論點? Person是一個超類,emp是它的子類....也可以將一個超類變量引用到一個子類對象中。 – user547453 2012-07-20 02:35:48

3

我會做這樣的事情:

interface PrintsInformation<T> { 
    void printInformation(T t); 
} 

class Emp implements PrintsInformation<Emp> { 
    public void printInformation(Emp e) { 
     System.out.println("This is an emp"); 
    } 
} 

public static void main(String[] args) { 
    Emp employeeObject = new Emp(); 
    employeeObject.printInformation(employeeObject); // compiles 
} 

其他的方式來解決你的問題是不是在傳遞對象,如果它的打印本身。
只是這樣做:

public void printInformation() { 
     // print "this" object, rather than the one passed in 
     System.out.println("This is an emp"); 
    } 
+0

太棒了!但這是否意味着在Java中我必須定義一個接口來覆蓋將對象作爲輸入參數的抽象方法? – user547453 2012-07-20 02:34:23

+1

如果你正在實現另一個具有不同參數的同名方法,那麼你不會重寫一個方法......這將被稱爲「overloading」。你可以重寫將對象作爲參數的抽象方法......你只需要使用相同的參數! – jahroy 2012-07-20 02:41:28

+0

您可以更改參數類型並仍被視爲實現相同接口方法的唯一方法是使用泛型,如此答案中所示。在沒有泛型時,在確定接口方法是否已經實現時,不會考慮類層次結構。你必須是確切的。這就是說,由於僱員是一個人,任何實施接受一個人的方法都會自動獲得僱員。 (谷歌liskov替代原則) – Matt 2012-07-20 02:46:41

相關問題