查看: 201|回复: 0

[JAVA] 面对对象的三大特征,封装继承多态

[复制链接]
  • TA的每日心情

    2018-10-18 16:49
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    发表于 2018-12-26 22:01:08 | 显示全部楼层 |阅读模式
         今天咱们说说java面对对象编程的三大特征,封装、继承、多态 (此文章是给初学者参考,以下纯属自己理解,请嘴下留情)那第一个先说说封装:
    封装从字面上就可以看出来,是吧东西封装起来,那么这种东西是啥呢?我先打个比喻,比如说,你查询数据库的内容,数据库有很多字段,你现在要把查询出来的东西,放到哪呢? 在类上定义 一堆属性?public static final String shuxing = ""; 这些东西?首先静态属性是不会被gc回收,占用资源,并且,只能在当前类用,其他类中如果还需要这些属性呢?那很容易造成资源浪费,那这种方法咋解决呢?这时候就可以用到我们的三大特征之一:封装。
    封装是什么?封装是把一些属性给装起来,我们把属性定义成类private或者是protected,然后通过get、set方法取值和存入值.来个代码
    // 这两个是私有方法的属性
    private String name;
    private String sex;


    // 用来取值的方法
    public String getName(){
           retrun name;
    }


    // 用来储存的方法
    public void setName(String name){
          return this.name = name;
    }
    .......


    从上面可以看见,我们的属性定义成私有的,然后定义了一个getName、setName方法,在来对属性进行操作,这里需要注意,属性名的第一个字母必须是小写,否则会有问题,楼主之前就遇到这种情况,找了半天的bug,好的,我们在来看看上面的那问题,这时候我们用封装来弄值,只需要把查询出来的值通过set方法,塞值进去,然后在使用get方法取值,封装还是很容易的,总的来说,就是定义个类,然后定义一群使用的属性,然后通过set、get进行操作,封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法


    那我们看看多态:
    多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

          比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下:
          酒 a = 剑南春
          酒 b = 五粮液
          酒 c = 酒鬼酒
          …
          这里所表现的的就是多态。剑南春、五粮液、酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象。
          诚然,要理解多态我们就必须要明白什么是“向上转型”。在继承中我们简单介绍了向上转型,这里就在啰嗦下:在上面的喝酒例子中,酒(Win)是父类,剑南春(JNC)、五粮液(WLY)、酒鬼酒(JGJ)是子类。我们定义如下代码:
          JNC a = new  JNC();
          对于这个代码我们非常容易理解无非就是实例化了一个剑南春的对象嘛!但是这样呢?
          Wine a = new JNC();
          在这里我们这样理解,这里定义了一个Wine 类型的a,它指向JNC对象实例。由于JNC是继承与Wine,所以JNC可以自动向上转型为Wine,所以a是可以指向JNC实例对象的。这样做存在一个非常大的好处,在继承中我们知道子类是父类的扩展,它可以提供比父类更加强大的功能,如果我们定义了一个指向子类的父类引用类型,那么它除了能够引用父类的共性外,还可以使用子类强大的功能。白话就是,一个接口,实例化成多个实现类对应多个功能,
    继承是所有OOP语言不可缺少的部分,在java中使用extends关键字来表示继承关系。当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承。比如下面这段代码:
    class Person {
        public Person() {
             
        }
    }

    class Man extends Person {
        public Man() {
             
        }
    }

    类Man继承于Person类,这样一来的话,Person类称为父类(基类),Man类称为子类(导出类)。如果两个类存在继承关系,则子类会自动继承父类的方法和变量,在子类中可以调用父类的方法和变量。在java中,只允许单继承,也就是说 一个类最多只能显示地继承于一个父类。但是一个类却可以被多个类继承,也就是说一个类可以拥有多个子类。
      1.子类继承父类的成员变量
      当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:
      1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
      2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
      3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
      2.子类继承父类的方法
      同样地,子类也并不是完全继承父类的所有方法。
      1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
      2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
      3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。

    您需要登录后才可以回帖 登录 | 注册青鸟豆号

    本版积分规则

    Copyright 1999-2019 Beijing Aptech Beida Jade Bird Information Technology Co.,Ltd

    北大青鸟IT教育 北京阿博泰克北大青鸟信息技术有限公司 版权所有

    京ICP备11045574号-3 京公网安备11010802013845号

    快速回复 返回顶部 返回列表