关于java语言设计理念
下面的知识是关于java语言从设计角度出发的一些知识点。
抽象类与接口的区别是什么
首先来看看接口的定义:接口,在JAVA编程语言中是一个抽象类型,主要是抽象方法的集合,接口中的变量定义必须为public static final类型。接口通常以interface来声明。
抽象类: 从面向对象的角度来讲,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样,并不是 所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就可以认为是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
从定义角度来看,接口和抽象类是两个几乎没有太多联系的设计。接口只是一个抽象方法的集合。而抽象类本质上是一个类,但是它不能被实例化,但是类具备的大多特性抽象类都有。抽象类和interface在Java语言中都是用来进行抽象的,他们除了都是一个用于抽象的东西之外几乎没有任何相同之处。事实上对于一个java里的类来说,无外乎由两种成分组成,即变量和方法(静态代码块可以写在类里面但从实际效果角度并没有影响一个类)。因此接口的功能仅仅包含其中一部分,即方法的集合以及一部分静态成员变量。这样来看,接口是一种非常高的抽象,里面定义的东西被认为是不会改变的。抽象类里面就可以定义普通的成员变量,抽象类的抽象程度相对接口来说会低一点。
但是对于java来说个人认为设计接口的最大原因是为了支持多继承,从这个角度来说,抽象类和接口最重要的区别应该是在使用的时候的区别:
其他的区别就非常多了,本质上是一些java语言规则方面的区别。例如:抽象类可以写方法实现,接口也可以写方法实现,不过需要加上default修饰,等等。
问题:什么时候用接口什么时候用抽象类?
抽象类的关键好处在于 能够实现面向对象设计的一个最核心的原则OCP(Open-ClosedPrinciple)。因此当我有一部分内容是不想让子类修改的,但是子类又都通用,同时各个自乐又有自己的特点,那么就适合使用抽象类。
在面向对象领域,抽象类主要用来进行类型隐藏。 我们可以构造出一个固定的一组行为的抽象描 述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个 抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知 道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
符合开发封闭原则,我可以对抽象出来的类进行扩展,但是只要是这个抽象类的子类,那么他必然能够。
从语法层面上讲,java单继承多实现,而接口可以多实现。
java为什么不支持多继承
典型的支持多继承的语言就是C++。在OOP的世界里,单根继承意味着所有的类都会有一个最上面的终极类,java里面这个类就是Object。单根继承既可以说是一门语言的特性,也可以说是一门语言的一个选择。从纯粹技术的角度来说,java也可以做到多继承,只是如果那样的话那么java就不会再是我们今天所认识的java。除此之外,单根继承还有下面这些优点:
单根继承的优点1:兼容性
单根继承带来的一个效果就是所有的对象归根到底都是相同的基本类型。这带来的好处就是任何java出现的新类库中,兼容性的问题会大大降低,这一点很好理解。但是在C++之中,总是会有一些不兼容的接口,这虽然带来了一定的灵活性,但是对于不兼容的接口,往往就是要通过多继承来解决。
单根继承的优点2: 便利性
因为单根继承,所有的对象都会具备某些一样的功能,比如所有的对象都会有hashcode方法,有euqals方法。因此拿到一个对象时,无论这个对象从哪里来,我们都知道可以对他执行某些基本操作。参数传递也得到了简化。
单根继承的优点3: 垃圾回收
单根继承会使得垃圾回收变得简单很多。因为所有对象都保证具有其类型信息,因此不会因为无法确定类型信息而带来不便。垃圾回收正是java相对于C++的重要改进之一。
https://www.bilibili.com/video/BV1qL411u7eE?from=search&seid=7067890005246929445&spm_id_from=333.337.0.0
来源:https://www.cnblogs.com/haoxiaonan/p/15988181.html
本站部分图文来源于网络,如有侵权请联系删除。