我现在正在学习抽象类和接口,并试图弄清楚哪一个使用另一个的情况。我现在无法弄清楚这个例子:
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;在这里"?接口是接受来自祖先类的实现还是必须在子类中实现它,从而覆盖抽象类实现?
答案 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
类继承了Thing
中test()
的定义,因此无需明确提供定义即可实现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 ;; 主要思想 - 在抽象类中声明方法,必须覆盖以编译代码。 我希望,这足以解释答案。