java中接口和类有啥区别 java中接口和类有啥区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中接口和类有啥区别 java中接口和类有啥区别相关的知识,希望对你有一定的参考价值。
实际上完全可以把接口理解成为一种特殊的类,由常量和抽象方法组成的特殊类。一般都是比较接口和抽象类 因为抽象类和接口有一定的相似性
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而类是可以有私有方法或私有变量的,
另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用. 参考技术A 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
接口与类的区别:
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。 参考技术B 接口中定义的方法不能有实现
Typescript中的接口和抽象类有啥区别?
【中文标题】Typescript中的接口和抽象类有啥区别?【英文标题】:What is the difference between interface and abstract class in Typescript?Typescript中的接口和抽象类有什么区别? 【发布时间】:2018-10-11 03:48:32 【问题描述】:我写了几行代码来试验和区分这两者:interface
和 abstract class
。
我发现他们有同样的限制。
interface IPerson
name: string;
talk(): void;
interface IVIP
code: number;
abstract class Person
abstract name: string;
abstract talk(): void;
class ManagerType1 extends Person
// The error I get is that I need to implement the talk() method
// and name property from its base class.
class ManagerType2 implements IPerson
// The error I get is that I need to implement the talk() method
// and the name property from the interface.
class ManagerType3 implements IPerson, IVIP
// Now the error I get is that I need to implement all the
// properties and methods of the implemented interfaces to the derived class
正如我发现的那样,这两者之间没有明显的区别,因为它们都实现了相同的限制。我唯一注意到的是继承和实现。
-
一个类只能扩展为一个基类
一个类可以实现多个接口。
我没听错吗?如果是这样,我什么时候需要使用?
更新
我不知道这是否是正确的答案,但您可以根据自己的情况真正使用 BOTH。 OOP 真的很酷。
class ManagerType3 extends Person implements IPerson, IVIP
// Now the restriction is that you need to implement all the abstract
// properties and methods in the base class and all
// the properties and methods from the interfaces
【问题讨论】:
除了限制基类可以提供实现/部分实现,接口只定义shape/contract @AlekseyL。是的,非常感谢,我发现接口是用于标准的,与抽象类相同,但是您可以为每个派生类添加一些持久的方法。 Difference between interfaces and classes in Typescript的可能重复 【参考方案1】:接口
interface
是一个合同,它定义了属性以及实现它的对象可以做什么。例如,您可以定义 Plumber 和 Electrician 可以做什么:
interface Electrician
layWires(): void
interface Plumber
layPipes(): void
然后,您可以使用接口的服务:
function restoreHouse(e: Electrician, p: Plumber)
e.layWires()
p.layPipes()
请注意,实现接口的方式是免费的。您可以通过实例化一个类或使用一个简单的对象来做到这一点:
let iAmAnElectrician =
layWires: () => console.log("Work with wires…")
接口在运行时根本不存在,因此无法进行自省。它是处理对象编程的经典 JavaScript 方式,但在定义的合约的编译时具有良好的控制。
抽象类
class
既是合同,也是工厂的实施。 abstract class
也是一个实现,但不完整。特别是在运行时存在抽象类,即使它只有抽象方法(那么instanceof
可以使用)。
当您定义一个抽象类时,您通常会尝试控制必须如何实现流程。例如,你可以这样写:
abstract class HouseRestorer
protected abstract layWires(): void
protected abstract layPipes(): void
restoreHouse()
this.layWires()
this.layPipes()
这个抽象类HouseRestorer
定义了如何使用方法layWires
和layPipes
,但是在使用之前需要由子类来实现专门的处理。
抽象类是一种传统的 OOP 方法,这在 JavaScript 中并不传统。
这两种方法都允许做同样的事情。但它们是解决问题的两种不同方式。
【讨论】:
【参考方案2】:TypeScript 的一个更大区别是(抽象)类在运行时可用,而接口仅在编译时可用。这意味着您不能将instanceof
与接口一起使用。
let x: any;
if (x instanceof IPerson) // Error: 'IPerson' only refers to a type, but is being used as a value here.
if (x instanceof Person) // OK
如果您真的不需要运行时类型,例如上面的示例,或者只想在具体类中实现,请选择接口。由于它们只是编译时的,所以生成的 JS 的大小会更小。
【讨论】:
以上是关于java中接口和类有啥区别 java中接口和类有啥区别的主要内容,如果未能解决你的问题,请参考以下文章