我们都知道 Java 中有三大特性, 那就是继承 , 封装和多态 . 那我今天我就来说说这几个特性 .
老样子 , 先问问自己为什么会存在这些特性 . 首先说封装 , 封装就是使用权限修饰符来实现对属性的隐藏 , 同时提供一些共有的 get / set 方法来对数据进行访问 . 这样怎么实现封装的效果的呢 ? 我们可以在 get 或 set 方法内部添加一些逻辑控制语句 . 比方说在设置年龄的时候 , 我就限制传入的 age 不能大于 120 . 代码实现可以这样写 .
- public void setAge(int age){
- if(age> 120){
- this.age = 120;
- }
- }
- public int getAge(){
- if(this.gender == "女"){
- System.out.println("女孩子的年龄是你能看的?");
- return -1;
- }
- return this.age;
- }
这只是一个简单的实例 , 实际情况是可以优化的 . 比方说对小于零的 age 进行限制 . 所以我们可以看到对数据的封装有以下优点 , 对成员进行精密的控制且隐藏了实现细节 , 还可以自由的修改方法的内部实现 .
就像是儿子继承老子的财富那样 , 子类也可以继承父类的属性和方法 , 但是有些是不能继承的 , 这要回到前面看一看访问修饰符的问题了 . 在 Java 中只允许单继承 , 就是只能有一个老子 . 继承是怎么实现的 ? 为什么要有继承 ? 我们通过 extends 关键字来标识继承的父类 . 而且继承是可以传递的 ,A 继承 B ,B 继承 C , 那么 C 也是 A 的父类 . 父类也叫超类 , 子类也叫基类 .Object 是所有类的超类 . 在子类中调用和父类同名的方法时 , 执行的是子类的方法 , 而可以显示的使用 super 来调用父类的方法 .
继承的优点显而易见 , 可以增加代码的复用性 , 但是我们不能为了继承而去继承 , 还要注意继承和组合的概念 , 继承是 "is a" 的概念 , 比方说 cat is a animal . 而组合是 "has a" 的概念 , 比方说 our body has a leg . 以上两句话可以设计出如下的结构 .
- class Animal {
- sleep(){
- System.print.out("动物睡觉");
- }
- }
- // 表示猫是动物
- class Cat extends Animal{
- sleep(){
- System.print.out("猫睡觉");
- }
- }
- class Leg{
- }
- // 表示身体里有腿
- class Body{
- Leg leg = new Leg();
- }
而最后一个就是多态 , 同样的问自己 , 什么是多态 ? 多态有什么用 ? 顾名思义 , 多态就是多种状态 . 就像是同样的早晨有时候你是精神满满而有时候你是萎靡不振一样 , 我们在调用同一个方法的时候 , 很可能执行的情况也不一样 . 这就是 Java 中说的多态 . 那为什么会不一样呢 ? 还记得刚刚说的子类继承父类的方法吧 , 子类在继承父类方法之后 , 可以对其进行重写 , 当我们调用重写的方法时 , 运行的结果就和父类的结果不一样 . 所以说 , 你想要多态 , 先要有继承 . 还有一种多态的形式 , 我们称之为 "虚拟方法调用" 又叫向上转型 , 说的简单一点就是父类的引用指向了子类对象 . 像这样 , 父类 Animal 的 a 指向了 Cat 实体 .
- Animal a = new Cat();
- a.sleep() // 猫睡觉
需要注意的是在使用虚拟方法调用的时候不能调用父类独有的方法 , 这会在运行时报错 , 在编译时没事 , 编译的时候只编译等号左边 . 但是在运行的会看具体的对象 , 在子类中找不到相应的方法自然会报错 .
可以总结一下多态的作用了 , 我们使用多态可以达到解耦合和易扩展的目的 , 我们编写不同模块的功能 , 在调用的时候只需要将父类的引用变个方向就行 . 只需提供稳定的子类实现 , 父类只负责调用相应的接口方法就行 . 这也就是工厂设计模式的原理 .
来源: https://www.cnblogs.com/YJK923/p/9441026.html