2017-08-14 115 views
-9

我正在学习抽象类vs接口,并试图找出在哪里使用一个在另一个上的情况。目前我无法找出这个例子:在抽象类中实现的方法,但出现在接口

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()函数是在抽象类中实现的。如果你没有在子类中实现它,它会调用抽象类的方法并打印出“在这里”?接口是否接受祖先类的实现,还是必须在子类中实现它,因此覆盖抽象类的实现?

+4

*或者你是否必须在子类中实现它* - 为什么你不试试它并看到 –

+6

downvote工具提示说:“这个问题没有显示任何研究工作;它不清楚或没有用。这对我来说似乎是合理的,因为显而易见的研究工作是“试图看到”以及“寻找类似的问题”。 –

+2

没有任何实际尝试或任何研究的证据推动这样的问题,只是在'好问题'和'家庭作业转储'之间的线上。它会杀死OP来尝试它,然后问为什么? –

回答

1

所有接口关心的是该类实现了一个名为test()的方法,该方法返回void。无论该方法是直接在类中还是在任何祖先(父类)类中实现都没关系。

在你的情况下,Thing类继承了其test()定义从Tract,因此实现了Face接口,您无需提供明确的定义。

1

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

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(); 

将打印 “道在这里”,

,因为你不会被覆盖在抽象类中的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”; 主要思想 - 你在抽象类中声明方法,你必须重写以编译代码。 我希望,这足以解释答案。