所有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();
将打印 “道在这里”,
,因为你不会被覆盖在抽象类中的test()方法。这种方法的 主要思想 - 你可以在未来的抽象实现使用
class C {
void print(Face face) {
face.test();
}
}
new C(new Thing()).print();
会“这里的事”打印;
new C(new Thing2()).print();
将打印“Tract here”; 你可以隐藏不同的实现 但这不是抽象类的主要思想。 主要思想抽象类:
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” 打印;
new C(new Thing2()).print();
将打印“Thing2 here”; 主要思想 - 你在抽象类中声明方法,你必须重写以编译代码。 我希望,这足以解释答案。
*或者你是否必须在子类中实现它* - 为什么你不试试它并看到 –
downvote工具提示说:“这个问题没有显示任何研究工作;它不清楚或没有用。这对我来说似乎是合理的,因为显而易见的研究工作是“试图看到”以及“寻找类似的问题”。 –
没有任何实际尝试或任何研究的证据推动这样的问题,只是在'好问题'和'家庭作业转储'之间的线上。它会杀死OP来尝试它,然后问为什么? –