从我在Java中使用线程的时间开始,我发现了这两种编写线程的方法:
用implements Runnable:
public class MyRunnable implements Runnable {
public void run() {
//Code
}
}
//Started with a "new Thread(new MyRunnable()).start()" call
Run Code Online (Sandbox Code Playgroud)
或者,用extends Thread:
public class MyThread extends Thread {
public MyThread() {
super("MyThread");
}
public void run() {
//Code
}
}
//Started with a "new MyThread().start()" call
Run Code Online (Sandbox Code Playgroud)
这两个代码块有什么显着差异吗?
我最近接受过两次电话采访,其中我被问及接口和抽象类之间的区别.我已经解释了他能想到的每一个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么.
根据我的经验,我认为以下是正确的.如果我错过了重点,请告诉我.
接口:
在接口中声明的每个单独的方法都必须在子类中实现.接口中只能存在事件,代理,属性(C#)和方法.一个类可以实现多个接口.
抽象类:
只有抽象方法必须由子类实现.Abstract类可以有实现的常规方法.Abstract类还可以在Events,Delegates,Properties和Methods旁边有类变量.由于C#中不存在多重继承,因此类只能实现一个抽象类.
毕竟,面试官想出了一个问题"如果你有一个只有抽象方法的抽象类怎么办?那么它与界面会有什么不同?" 我不知道答案,但我认为这是上面提到的继承权吗?
另一位采访者问我,如果你在界面中有一个Public变量,那么它与Abstract Class有什么不同?我坚持认为你不能在界面中有一个公共变量.我不知道他想听到什么,但他也不满意.
另见:
由于Java 8允许在名为Default Methods的接口中默认实现方法,因此在何时使用a之间似乎存在混淆abstract class.
那么什么时候应该使用与默认方法的接口,何时应该使用抽象类?抽象类在这种情况下仍然有用吗?
在我的一次访谈中,我被要求解释Interface和Abstract类之间的区别.
这是我的回答:
Java接口的方法是隐式抽象的,不能有实现.Java抽象类可以具有实现默认行为的实例方法.
在Java接口中声明的变量默认为final.抽象类可能包含非最终变量.
默认情况下,Java接口的成员是公共的.Java抽象类可以具有类似私有,受保护等类通常的类成员.
应使用关键字"implements"实现Java接口; 应使用关键字"extends"扩展Java抽象类.
接口只能扩展另一个Java接口,抽象类可以扩展另一个Java类并实现多个Java接口.
Java类可以实现多个接口,但它只能扩展一个抽象类.
然而,面试官并不满意,并告诉我这个描述代表了" 书本知识 ".
他告诉我一个更实际的回答,解释我何时会使用实际例子在界面上选择一个抽象类.
我哪里做错了?
什么时候在对象中使用工厂方法而不是Factory类是个好主意?
所以我想说我有这个界面:
public interface IBox
{
public void setSize(int size);
public int getSize();
public int getArea();
//...and so on
}
Run Code Online (Sandbox Code Playgroud)
我有一个实现它的类:
public class Rectangle implements IBox
{
private int size;
//Methods here
}
Run Code Online (Sandbox Code Playgroud)
如果我想使用IBox接口,我实际上无法创建它的实例,方式如下:
public static void main(String args[])
{
Ibox myBox=new Ibox();
}
Run Code Online (Sandbox Code Playgroud)
对?所以我实际上必须这样做:
public static void main(String args[])
{
Rectangle myBox=new Rectangle();
}
Run Code Online (Sandbox Code Playgroud)
如果这是真的,那么接口的唯一目的是确保实现接口的类如接口所描述的那样在其中获得了正确的方法?或者是否还有其他任何接口用途?
我想知道在 Android环境中何时,何地以及如何使用适配器.
来自Android开发者文档的信息对我来说不够,我想得到更详细的分析.
我一直在阅读有关OCP主要内容以及如何使用策略模式来实现这一目标.
我打算尝试向几个人解释这个,但我能想到的唯一例子是根据"订单"的状态使用不同的验证类.
我在线阅读了几篇文章,但这些文章通常没有描述使用该策略的真实原因,如生成报告/账单/验证等...
是否有任何现实世界的例子,您认为策略模式是常见的?
我被问到一个问题,我想在这里查看我的答案.
问:在哪种情况下扩展抽象类而不是实现接口更合适?
答:如果我们使用模板方法设计模式.
我对么 ?
如果我无法清楚地陈述问题,我很抱歉.
我知道抽象类和接口之间的基本区别.
1)当需求需要在特定操作的每个子类中实现相同的功能(实现方法)和其他一些操作的不同功能(仅方法签名)时,使用抽象类
2)如果需要将签名设置为相同(并且实现不同),请使用接口,以便您可以遵守接口实现
3)我们可以扩展一个抽象类的最大值,但可以实现多个接口
重申一个问题:除了上面提到的那些之外,还有其他任何场景,具体我们需要使用抽象类(一个是模板方法设计模式在概念上仅基于此)吗?
接口与抽象类
在这两者之间做出选择真的取决于你想做什么,但幸运的是,对我们来说,Erich Gamma可以帮助我们一点.
一如既往地存在权衡,接口为您提供基类的自由,抽象类使您可以自由地在以后添加新方法. - Erich Gamma
你无法在不改变代码中的许多其他东西的情况下更改接口,因此避免这种情况的唯一方法是创建一个全新的接口,这可能并不总是一件好事.
Abstract classes应主要用于密切相关的对象.Interfaces更好地为不相关的类提供通用功能.
java ×7
interface ×6
oop ×4
adapter ×1
android ×1
c# ×1
factory ×1
implements ×1
inheritance ×1
java-8 ×1
java-threads ×1
runnable ×1