OOP的三大特征分别是:
- 封装性
- 继承性
- 多态性
一、封装性
封装是面向对象编程的核心思想,将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来对隐藏的信息进行操作和访问。
封装性的设计思想
“高内聚,低耦合”
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:仅对外暴露少量的方法用于使用。
封装的作用
- 保证了类内部数据结构的完整性
- 应用该类的用户不能轻易的操作此数据结构
- 只能执行类公开的数据(public)
- 避免外部类对内部数据的影响,提高程序的可维护性
- 提高代码的安全性以及复用性
封装性的具体体现
体现一:将类的属性私有化(private),同时提供公有的(public)方法来获取get和set此属性的值
private double radius;
public void setRadius(double radius){
this.radius = radius;
}
public double getRadius(){
return radius;
}
体现二: 不对外暴露的私有方法(private)私有化方法,在内部自己调用。
体现三:单例模式(将构造器私有化),外部不可进行调用。
体现四:如果不希望类在包外被调用,就设置为包内使用权限。
补充理解:四种权限修饰符等价于封装性
二、继承性
说明:下边三个类,中都具有person类中的属性,所以通过继承的方式减少代码量
继承性的好处
- 减少代码的冗余,提高代码的复用性
- 便于功能的扩展(相同功能属性,可在父类定义)
- 为多态性提供前提(多态使用前提必须继承)
继承性的格式
class A extends B{}
A:子类、派生类
B:父类、超类、基类
子类继承父类之后的不同点
-
子类继承父类后,就获取了父类中声明的所有的属性和方法。
-
子类继承父类后,还可以声明自己特有的属性和方法。
注意:父类中声明为private的属性和方法,使用子类不能调用父类
Java中继承性的说明
- 一个类可以被多个子类继承。
- 一个子类只能有一个父类(单继承性)。
- 子类和父类是相对的概念。
- 子类直接继承的父类,称为间接父类。间接继承的称位:间接父类。
- 子类继承父类以后,就获取了父类及间接父类中声明的方法和属性。
三、重写(Override)
规定:
- 方法名相同
- 形参列表相同(个数和类型)
- 返回值相同
- final修饰方法不可以被重写
注意:
- 方法为静态时,不可被重写
- 子类如果要写父类的方法,子类的修饰权限一定大于父类权限 private default protected public
- 父类中要被重写的方法一定不能是private
四、对象的类型转换
对象的类型主要包括向上转型和向下转型
向上转型
父类 变量名 = new 子类
父类的引用,引用了子类的对象称为“向上转型”。由于向上转型是从一个较具体的类到抽象的类的转换,所以总是安全的。
向上转型发生的三个时机
-
直接赋值 Animal animal = new dog(“assa”);
-
传值
Animal animal = new Animal("assa"); func(animal); Dog dog = new Dog("sadasd") func(dog); func(new Dog("dsa"))
-
返回值
向下转型
不是所有的对象都可以向下转型,只有当这个对象原本就是子类对象时,通过向上转型得到的时候才能够成功转型
Fruit fruit = new Apple();
Apple apple = (Apple)fruit;
说明:做向下转型时,必须做向上转型,并且向下转型不安全。
五、动态绑定
- 一定要发生向上转型(父类引用 引用 子类对象)
- 父类和子类有同名的重写/覆盖/覆写方法
- 通过父类的引用,来调用子类和父类的这个同名的覆盖方法,此时就会发生动态绑定,也叫运行时绑定
- 在构造方法中,也可以发生动态绑定
六、多态性
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。
多态性的前提
- 要有类的继承
- 要有子类对父类方法的重写
多态的好处
- 类调用者对类的使用成本进一步降低。
- 能够降低代码的 “圈复杂度”, 避免使用大量的 if - else。
- 可扩展能力更强。
七、抽象类(abstract)
包含抽象方法的类就是抽象类,abstract是定义抽象类的关键字。抽象类存在的意义就是被继承。
abstract 修饰的方法叫抽象方法,可以不用具体实现
抽象类的作用和注意事项
- 抽象类可以被继承,也可以向上转型,动态绑定
- 抽象类不可以被实例化
- 抽象类中的方法一定要在子类中重写
- 抽象类存在的意义就是被继承,因为根本不能被实例化
- 如果是②抽象类继承了一个①抽象类,可以不同重写抽象方法,但是③抽象类继承②就需要写两个抽象方法
- 抽象方法不能是private
- 可以包含普通的方法,但是只能被继承才能调用
- 抽象类不能被final修饰
八、接口(interface)
接口是抽象类的延伸,将其可以看作是纯粹的抽象类,接口中所有方法都没有方法体。
interface I+接口名{}
interface:定义为接口关键字
接口的作用和说明事项
-
接口当中的抽象方法默认是public abstract 不能有具体实现
-
不能被实例化
-
接口当中的方法默认是 public static final
-
接口和类之间的关系是implements,此时接口中的所有方法 都需要重写
-
也可以发生向上转型
-
JDK1.8kaishi ,接口中的方法可以实现,但是需要用default修饰
-
在java中一个类可以实现多个接口
-
类和接口是implements 接口和接口之间是extends
在街口中定义的任何字段都自动是static和final
接口与集成
Java中,不允许出现多重继承,但是可以使用接口来实现多继承。
一各类可以实现多个接口,使用关键字implements。
class 类名 implements 接口1 , 接口2,···,接口n
接口与接口之间继承使用extends
interface intf1{
}
interface intf2 extends intf1{
}
自定义数据类型排序
需要实现comparable接口并且重写compareTo方法。
九、super() 关键字
super()关键字 :父类对象的引用
- super()调用父类的构造方法
- super.data 调用父类的成员属性
- super.方法 调用父类的成员方法
- static{ }先执行 并且只执行一次