Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以对象作为输入参数的Java抽象方法_Java_Abstract - Fatal编程技术网

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

以对象作为输入参数的Java抽象方法,java,abstract,Java,Abstract,我可以使这段代码在没有对象作为抽象方法的输入参数的情况下工作。例如,如果我亲自将printInformation()方法的输入参数设置为printInformation(int x),emp就会起作用 当我将输入参数作为printformation()方法的对象时,它抛出了一个错误 emp不是抽象的,也不重写抽象方法 person类emp中的printInformation(person)扩展person{^ 您的接口具有如下定义的函数: void printInformation(person

我可以使这段代码在没有对象作为抽象方法的输入参数的情况下工作。例如,如果我亲自将
printInformation()
方法的输入参数设置为
printInformation(int x)
,emp就会起作用

当我将输入参数作为
printformation()
方法的对象时,它抛出了一个错误

emp不是抽象的,也不重写抽象方法 person类emp中的printInformation(person)扩展person{^


您的接口具有如下定义的函数:

void printInformation(person p);
void printInformation(emp e);
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
}
您的类具有如下定义的函数:

void printInformation(person p);
void printInformation(emp e);
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
}

这些函数不同。Java认为第二个函数是一个新的重载方法,而不是来自接口的方法的实现。因为类
emp
不是声明为抽象的,但没有为抽象方法
void printInformation(person)提供实现
,这是错误的。

我会这样做:

void printInformation(person p);
void printInformation(emp e);
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
}

奇怪的是,
person.printInformation
需要另一个
person
。难道它不应该从正在访问的
person
实例中打印信息吗?而且,Java惯例是以大写字母开头类名,例如,
person
Employee
。我的问题更多的是一个概念问题……我是还是个新手。如果输入参数不是对象类型,为什么我可以重写?如果它是int这样的基本类型,我可以重写它。我不明白你说它们不是相同的函数。如果输入参数不是对象类型,为什么我可以重写?如果它是int这样的基本类型,我可以重写它。两个函数h具有不同参数的同一名称是
而不是
同一函数。@jahroy…它们怎么可能是不同的参数?Person是一个超类,emp是它的子类…此外,您可以将超类变量引用到子类对象。@user547453-在
int
的情况下,您是在重载方法,而不是重写它。它们是确实,由于签名的缘故,函数是分开的。@user547453:Person是一个超类,emp是子类,是的。这就是为什么它们是不同的函数,因为类型
Person
emp
不是同一类型。它们密切相关,但不同。要正确实现,您需要
printInformati在
函数上可以接受一个
person
参数。你没有,你只有一个
printInformation
函数可以接受一个
emp
。这意味着用
person
实例调用你的人找不到他们可以使用的实现。太好了!但这是否意味着在Java中我必须定义一个Interface是否重写将对象作为输入参数的抽象方法?如果您正在实现另一个具有相同名称并使用不同参数的方法,则不会重写该方法…这将被称为
重载
。您可以重写将对象作为参数的抽象方法…您只需要使用相同的参数ters!更改参数类型并仍被视为实现同一接口方法的唯一方法是使用泛型,如本答案所示。在没有泛型的情况下,在确定接口方法是否已实现时,不考虑类层次结构。您必须准确。也就是说,因为被雇佣者是一个人,任何接受一个人的方法都将自动接受一名员工。(谷歌利斯科夫替代原则)