方法在抽象类中实现,但出现在接口中

时间:2017-08-14 05:49:36

标签: java oop

我现在正在学习抽象类和接口,并试图弄清楚哪一个使用另一个的情况。我现在无法弄清楚这个例子:

public interface Face {
    public void test();
}

public abstract class Tract {
    public void test() {
        System.out.println("over here");
    }
}

public class Thing extends Tract implements Face {
    public void test() {
        // what should print out?
    }

}

这里,test()函数在抽象类中实现。如果你不在子类中实现它,它会调用抽象类'方法并打印出#34;在这里"?接口是接受来自祖先类的实现还是必须在子类中实现它,从而覆盖抽象类实现?

3 个答案:

答案 0 :(得分:1)

所有接口都关心的是该类实现了一个名为class MyContextMenuExtension extends Autodesk.Viewing.Extension { constructor( viewer, options ) { super( viewer, options ); } load() { this.viewer.setContextMenu( new MyContextMenu( this.viewer ) ); return true; } unload() { this.viewer.setContextMenu( new Autodesk.Viewing.Extensions.ViewerObjectContextMenu( this.viewer ) ); return true; } } 的方法,它返回test()。方法是直接在类中实现还是在任何祖先(父)类中实现并不重要。

在您的情况下,void类继承了Thingtest()的定义,因此无需明确提供定义即可实现Tract接口。

答案 1 :(得分:1)

在“Tract”类中,您已经为来自界面的方法提供了实现。你也可以在“Thing”类中覆盖它,所以当在Thing实例上调用这个方法时,将会调用这个版本(Thing版本)。

答案 2 :(得分:0)

所有java方法都是虚拟的。 让我们考虑一点修改后的代码, 我希望,你会明白这个想法:

public interface Face {
    public void test();
}

public abstract class Tract {
    public void test() {
        System.out.println("Tract here");
    }
}

public class Thing extends Tract implements Face {
    public void test() {
        System.out.println("Thing here");
    }
}

public class Thing2 extends Tract implements Face {
}

让我们去输出:

Tract tr = new Tract();
tr.test();

将无法编译,因为您无法实例化抽象类。

Thing th = new Thing();
th.test();

将打印"在这里"

Thing2 th2 = new Thing2();
th2.test();

将打印" Tract here",

因为你没有覆盖抽象类中的test()方法。 这种方法的主要思想 - 您可以在将来使用抽象实现

class C {
void print(Face face) {
    face.test();
  }
}
new C(new Thing()).print();

将打印"在这里";

new C(new Thing2()).print();

将打印" Tract here&#34 ;; 您可以隐藏不同的实现 但这不是抽象类的主要思想。 主要思想抽象类是:

public interface Face {
    public void test();
}

public abstract class Abstract {
    abstract public void test();
}

public class Thing1 extends Abstract implements Face {
    public void test() {
        System.out.println("Thing1 here");
    }
}

public class Thing2 extends Abstract implements Face {
    public void test() {
        System.out.println("Thing2 here");
    }
}

主要想法 - 您可以在没有实现的情况下声明方法

new C(new Thing1()).print();

将打印" Thing1 here";

new C(new Thing2()).print();

将打印" Thing2 here&#34 ;; 主要思想 - 在抽象类中声明方法,必须覆盖以编译代码。 我希望,这足以解释答案。