美文网首页
Java系列之 - 面向对象三大特征

Java系列之 - 面向对象三大特征

作者: SupKing_a520 | 来源:发表于2020-03-06 10:29 被阅读0次

    面向对象的三大特征:封装、继承、多态

    一、封装

    首先,属性能够描述事物的特征,方法能够描述事物的动作。封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。

    1. 封装:
      封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系。也就是说用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作就行。
    2. 封装的好处:
    • 实现了专业的分工
    • 良好的封装能够减少耦合
    • 类内部的结构能够自由修改
    • 可以对成员进行更精确的控制
    • 隐藏信息,实现细节
    1. 封装的步骤:
    • 修改属性的可见性来限制对属性的访问
    • 为每个属性创建一对赋值和取值方法,用于对这些属性的访问
    • 在赋值和取值方法中,加入对属性的存取限制

    二、继承

    1. Java继承
    • Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
    • JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,父类是子类的一般化,子类是父类的特化(具体化)。
    1. Java继承的特征
    • 继承关系是传递的。若类C继承类B,类B继承类A(多继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法。
    • 继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
    • 继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
    1. 结果:
      继承后子类自动拥有了父类的属性和方法,但特别注意的是,父类的私有属性和构造方法并不能被继承。

    三、多态

    1. 多态的定义:
      指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
    2. 实现多态的技术称为:
      动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
    3. 多态的作用:
      消除类型之间的耦合关系。
    4. 多态存在的三个必要条件
    • 要有继承;
    • 要有重写;
    • 父类引用指向子类对象。
    1. 好处:
    • 可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
    • 可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
    • 接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
    • 灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
    • 简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

    四、例子

    比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下:

    酒 a = 剑南春
    酒 b = 五粮液
    酒 c = 酒鬼酒
    …
    这里所表现的的就是多态。
    
    public class Wine {
        public void fun1(){
            System.out.println("Wine 的Fun.....");
            fun2();
        }
        public void fun2(){
            System.out.println("Wine 的Fun2...");
        }
    }
    
    public class JNC extends Wine{
        /**
         * 子类重载父类方法,父类中不存在该方法,向上转型后,父类是不能引用该方法的
        */
        public void fun1(String a){
            System.out.println("JNC 的 Fun1...");
            fun2();
        }
        
        /**
         * 子类重写父类方,指向子类的父类引用调用fun2时,必定是调用该方法
         */
        public void fun2(){
            System.out.println("JNC 的Fun2...");
        }
    }
    
     public class Test {
        public static void main(String[] args) {
            Wine a = new JNC();
            a.fun1();
        }
    }
    
    -------------------------------------------------
    Output:Wine 的Fun.....JNC 的Fun2...
    

    五、总结:

    指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

    相关文章

      网友评论

          本文标题:Java系列之 - 面向对象三大特征

          本文链接:https://www.haomeiwen.com/subject/bryvrhtx.html