我最近接受过两次电话采访,其中我被问及接口和抽象类之间的区别.我已经解释了他能想到的每一个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么.
根据我的经验,我认为以下是正确的.如果我错过了重点,请告诉我.
接口:
在接口中声明的每个单独的方法都必须在子类中实现.接口中只能存在事件,代理,属性(C#)和方法.一个类可以实现多个接口.
抽象类:
只有抽象方法必须由子类实现.Abstract类可以有实现的常规方法.Abstract类还可以在Events,Delegates,Properties和Methods旁边有类变量.由于C#中不存在多重继承,因此类只能实现一个抽象类.
毕竟,面试官想出了一个问题"如果你有一个只有抽象方法的抽象类怎么办?那么它与界面会有什么不同?" 我不知道答案,但我认为这是上面提到的继承权吗?
另一位采访者问我,如果你在界面中有一个Public变量,那么它与Abstract Class有什么不同?我坚持认为你不能在界面中有一个公共变量.我不知道他想听到什么,但他也不满意.
另见:
在我的一次访谈中,我被要求解释Interface和Abstract类之间的区别.
这是我的回答:
Java接口的方法是隐式抽象的,不能有实现.Java抽象类可以具有实现默认行为的实例方法.
在Java接口中声明的变量默认为final.抽象类可能包含非最终变量.
默认情况下,Java接口的成员是公共的.Java抽象类可以具有类似私有,受保护等类通常的类成员.
应使用关键字"implements"实现Java接口; 应使用关键字"extends"扩展Java抽象类.
接口只能扩展另一个Java接口,抽象类可以扩展另一个Java类并实现多个Java接口.
Java类可以实现多个接口,但它只能扩展一个抽象类.
然而,面试官并不满意,并告诉我这个描述代表了" 书本知识 ".
他告诉我一个更实际的回答,解释我何时会使用实际例子在界面上选择一个抽象类.
我哪里做错了?
什么是Java中的以下关键字的区别:implements
,extends
?
在java中,围绕一个减少超类功能的子类设计的好方法是什么?
例如,考虑具有"See"函数的类"Man"和不应该具有该函数的子类"BlindMan",但应该具有"Man"具有的所有其他内容.
我能想出的唯一解决方案是使用抽象类"Man"和两个子类"SeeingMan"和"BlindMan",SeeinMan添加了一个"See"功能.
但是这个解决方案的问题在于,如果我现在想要添加一个"DeafMan"类 - 它会扩展什么?SeeingMan?如果那个男人既聋又瞎眼怎么办?
我在Java 8中读取接口时遇到过这个主题,有些情况下我们使用default或static关键字在接口中定义方法,允许下一个子节点重新定义相同的方法或实现它.这意味着多重继承吗?还有一个问题我发现,返回类型必须是co-variant类型,否则编译问题,这意味着它仍然不支持多重继承?我们可以说java支持多重继承吗?让我了解有关此主题的更多详细信息.
我们假设我有这个界面A:
interface A
{
void doThis();
String doThat();
}
Run Code Online (Sandbox Code Playgroud)
所以,我想要一些抽象类来实现方法doThis()而不是doThat()方法:
abstract class B implements A
{
public void doThis()
{
System.out.println("do this and then "+ doThat());
}
}
abstract class B2 implements A
{
public void doThis()
{
System.out.println(doThat() + "and then do this");
}
}
Run Code Online (Sandbox Code Playgroud)
当你最终决定在常规类中实现de doThat方法时会出现错误:
public class C implements B
{
public String doThat()
{
return "do that";
}
}
Run Code Online (Sandbox Code Playgroud)
这个课让我看到上面提到的错误:
"B类不能是C的超级接口;超级接口必须是接口"
如果这个类的层次结构有效或者我应该采取其他方式,那么现在任何人都可以吗?
我会阅读有关打字稿的内容class
,abstract class
并且确实发现了一些非常有趣的东西。
Typescript allows us to implement classes
.
我什至创建了一个stackblitz项目来测试它。
无论如何,我已经在这里找到了一般差异,以及它在此处的打字稿中的行为是什么。
为什么打字稿允许的话,如果在其他非常流行的语言(Java
,C#
,...),这是“禁止”?此功能是否还有其他重要应用?
假设我有以下代码......
interface A{
void a();
}
interface B extends A{
void b();
}
class ImplementOne implements B{
public void a(){};
public void b(){};
}
class ImplementTwo implements B, A{
public void a(){};
public void b(){};
}
Run Code Online (Sandbox Code Playgroud)
无论类ImplementTwo是实现B和A,还是只实现B,它仍然需要在接口A中实现方法a(),因为接口B扩展了接口A.是否有任何理由明确地做
...implements B, A
Run Code Online (Sandbox Code Playgroud)
而不仅仅是
...implements B
Run Code Online (Sandbox Code Playgroud)
?
我可以同时使用工具和扩展吗?因为我需要在同一个类上使用工具时继承其他类的东西.
public class DetailActivity extends AppCompatActivity
implementsView.OnClickListener "extends ListActivity"
Run Code Online (Sandbox Code Playgroud)
怎么会这样?
我们可以通过使用抽象类来实现与接口相同的功能,那么为什么java不允许以下代码呢?
abstract class Animals
{
public abstract void run();
}
abstract class Animals1
{
public abstract void run1();
}
class Dog extends Animals,Animals1
{
public void run() {System.out.println("Run method");}
public void run1() {System.out.println("Run1 method");}
}
Run Code Online (Sandbox Code Playgroud)
我知道只使用接口可以实现多重继承,但上面的代码与接口完成的工作相同.
这是我的接口.
public interface ConnectionListener{
public void onConnectionReady();
public void onConnectionDown();
}
Run Code Online (Sandbox Code Playgroud)
我在HomeActivity类中实现了这个接口.我想了解在实现的方法中使用@Override与不使用@Override注释之间的区别是什么...
public class HomeActivity implements ConnectionListener
{
@Override
public void onConnectionReady() {
}
@Override
public void onConnectionDown() {
}
}
Run Code Online (Sandbox Code Playgroud) java ×9
interface ×5
oop ×3
android ×2
class ×2
extends ×2
implements ×2
inheritance ×2
overriding ×1
typescript ×1
wifi-direct ×1