一、Java面向对象的三个基本特征:
封装
封装提供了对象之间的一种合约,这种合约确定对象自身内部隐藏什么,向彼此暴露什么。在Java中,我们可以使用private访问修饰符来隐藏方法和变量,从而制约来自外部世界的访问。 Java也提供了不同的访问修饰符如public(默认),protected和private,在不同的隐藏水平使用,但目标是封装一些不需要改变的东西。按照最佳实践 - 一个类应该只有一个理由去改变,封装实现的“一个理由”的设计原则。
封装的好处:
1、我们能够保护内部状态,只要通过隐藏对象的属性即可,因为我们经常使用对象的一个属性来代表对象的状态。
2、能够提高代码的模块性,因为封装可以阻止对象和其他外部对象以一种不可预期的方式交互。
3、提高重用性。
4、它维持特定对象的合约。
5、促进维护。
6、代码能够独立的改变。
继承
基类的行为(即方法)和状态(即变量)可以在其派生子类中访问。继承的主要优点是,它提供了代码重用和避免重复继承的正式机制,这也会导致紧耦合的设计,因为如果你要更改的超类,你必须知道子类的所有细节。
继承的好处:
1、提高代码的复用性
2、模块化代码
3、避免重复
4、紧耦合(子类依赖于父类实现是一种紧耦合。)
多态
多态性是一种(编程时)对于不同基础形式(数据类型)呈现相同接口的能力。这意味着类有不同的功能,同时共享一个通用的接口,可以通过传递特定类别的参考动态调用。典型的例子是Shape类和所有可以继承它(方形,圆形,十二面体,不规则的多边形,图示等)的类。多态性的美妙之处在于与不同类别工作代码并不需要知道它正在使用哪个具体类,因为它们都使用相同的方法。采用面向对象的编程语言来实现运行时多态的过程称为动态绑定。注意:多态是一种运行时依赖调用其对象进行选择特定方法的的能力。多态性的发生可以不涉及抽象类。
多态的好处:
1、创建可重用的代码:多态性意味着一旦类被创建 实现和测试,它就能容易地被使用,而无需关注类的内部写的是什么
2、它提供更多泛型和松耦合代码
3、编译时间更少,且允许更快地开发
4、动态绑定:
5、一些接口能够使用不同实现方式创建。
6、能够使用同样的方法签名完全替代实现。
重载和重写是Java多态的两种重要形式:
重载:方法名相同,参数不同,返回值可以不同 重写:方法名相同,参数相同,返回值必须相同。
抽象
抽象意味着以接口和功能开发类,而不是功能的实现细节。抽象类暴露接口,而不是暴露实际执行细节。它从分离对象的执行实现。通过隐藏不相关的细节降低了复杂性。简单比喻:条条大路通罗马,什么途径细节通往罗马不重要,关键目标到达罗马即可,这就是抽象。
好处:
1、通过使用抽象, 我们能将细节通过类型进行分类
2、频繁地改变属性和方法将被分组到一个单独类型,以避免主要类型不受改变影响,这是符合 OOAD 原则 -”代码应该对扩展开发,对修改封闭”.
3、简化领域模型的表现。
抽象和封装的区别:
封装是作为抽象策略的一部分。封装是指对象的状态 - 对象封装它自己的状态,并对外部将其隐藏;
该类以外的用户必须通过它的方法与状态进行交互(读写),但不能直接访问类的状态。所以类是抽象了有关其状态的实现细节。
抽象是更通用的术语,它的实现可以由子类完成。例如,类List是一种集合抽象,List的具体子类有ArrayList或LinkedList。
如果没有通过封装隐藏其内部状态,抽象也不可能实现,如果一个类暴露其内部状态,它不能在其内部完全掌控改变这个状态,那么这也不是抽象。
接口:
接口是类的抽象,没有类的任何方法或函数实现的细节。你只能声明一个方法或函数的名称,但不要提供实现细节也就是如何实现这些方法。实现该接口的类应该提供实际的实现细节。接口是面向对象设计的一个非常有用和常用的概念,因为它提供了接口和实现的分离,使您能够:
1、多个继承
2、松耦合-将抽象的操作和实现分离在不同层次,比如JDBC, JPA, JTA etc.
3、面向接口编程,而不是面向实现细节编程
4、结合动态绑定的多态性 – 暴露其对象接口,而不是暴露其细节.
5、抽象层: 分离关注
抽象类和接口的区别:
1、abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2、在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。3、abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。 4、实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。5、接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。 7、接口中的方法默认都是 public,abstract类型的。
匿名内部类
1、匿名内部类中是不能定义构造函数的。
2、匿名内部类中不能存在任何的静态成员变量和静态方法
3、匿名内部类只能使用一次是指只能有一个对象,可随时声明该类引用该对象