与Java对象作为输入参数抽象方法

问题描述:

我可以使此代码工作,没有对象作为抽象方法的输入参数。例如,如果我将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

你的接口有这样定义的函数:

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

我会做这样的事情:

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