• JavaSE基础入门_008_面向对象三大特性


    面向对象三大特性

    封装

    什么是封装

    • 概念:尽可能隐藏对象的内部细节,控制对象的修改及访问的权限。

    • 访问修饰符:private(可将属性修饰为私有,仅本类可见)

    公共访问方法

    • 提供公共访问方法, 以保证数据的正常录入

    • 命名规范:

      • 赋值: setXXX() //使用方法参数实现赋值

      • 取值: getXXX() //使用方法返回值实现取值

    过滤有效数据

    • 在公共的访问方法内部, 添加逻辑判断, 进而过滤掉非法数据, 以保证数据安全

     

    访问修饰符

     本类同包非同包子类其他
    private Y N N N
    default(什么都不写) Y Y N N
    protected Y Y Y N
    public Y Y Y Y
    • 本类: 自己

    • 同包: 隔壁邻居, 一个文件夹

    • 非同胞子类: 不住在一个包里的儿子

    • 其他: 陌生人

    • Y: 可以用; N: 用不了

    //cmd 带包编译:
    javac -d . Father.java

     

     

    继承

    生活中的继承

    • 生活中的"继承"是施方的一种赠与, 受方的一种获得.

    • 将一方所拥有的东西给与另一方.

      • 往往二者之间 具有继承关系 (直系, 亲属)

     

    程序中的继承

    • 程序中的继承, 是类与类之间特征行为的一种赠与或获得.

    • 两个类之间的继承关系。必须满足“is a”的关系。

      • 狗是一种动物:Dog is an Animal

      • 奔驰是一种车:Benz is a Car

      • 都是 is a 的关系

     

    父类的选择

    • 现实生活中,很多类别之间都存在着继承关系,都满足“is a”的关系。

    • 狗是一种动物、狗是一种生物、狗是一种物质。

    • 多个类别都可作为“狗”的父类,需要从中选择出最适合的父类。

    •  动物生物物质
      属性 品种、年龄、性别 品种、年龄、性别 ...
      方法 呼吸、吃、睡 呼吸 ...
    • 功能越精细,重合点越多,越接近直接父类。

    • 功能越粗略,重合点越少,越接近Object类。(万物皆对象的概念)

     

    父类的抽象

    • 实战:可根据程序需要使用到的多个具体类,进行共性抽取,进而定义父类。

    • 在一组相同或类似的类中,抽取出共性的特征和行为,定义在父类中,实现重用。

     

    继承

    • 语法: class 子类 extends 父类 { } // 定义子类时, 显示继承父类

    • 应用: 产生继承关系之后, 子类可以使用父类中的属性和方法, 也可以定义子类独有的属性和方法

    • 好处: 既提高代码的复用性, 有提高代码的可扩展性

     

    继承的特点

    • Java为单继承, 一个类只能有一个直接父类, 但可以多级继承, 属性和方法逐级叠加。

     

    不可继承

    • 构造方法:

      • 类中的构造方法, 只负责创建本类对象, 不可继承

    • private修饰的属性和方法:

      • 访问修饰符的一种, 仅本类可见

    • 父子类不在同一个package中时, default修饰的属性和方法:

     

    继承中的对象创建

    • 在具有继承关系的对象创建中,构建子类对象会先构建父类对象。

    • 由父类的共性内容,叠加子类的独有内容,组合成完整的子类对象。

     

    继承后的对象构建过程

    • 构建子类对象时, 先构建父类对象

     

    方法重写(覆盖)

    • 思考: 子类中是否可以定义和父类相同的方法 ?

      • 可以定义一模一样重名的方法, 优先调用子类自己的

    • 思考: 为什么需要在子类中定义和父类相同的方法 ?

    • 分析: 当父类提供的方法无法满足子类需求时, 可在子类中定义和父类相同的方法进行覆盖(Override).

     

    • 方法覆盖原则:

      • 方法名称、参数列表、返回值类型必须与父类相同。

      • 访问修饰符可与父类相同或是比父类更宽泛。

     

    • 方法覆盖的执行:

      • 子类覆盖父类方法后,调用时优先执行子类覆盖后的方法。

     

    super关键字:父亲

    • 子类中,可直接访问从父类继承到的属性和方法,但如果父子类的属性或方法存在重名(属性遮蔽、方法覆盖)时,需要加以区分,才可专项访问。

    • class Father
      {
      int field = 10;
      }

      class Son extends Father
      {
      int field = 20;//与父类属性重名, 属性遮蔽
      public void method()
      {
      System.out.println(this.field);//this. 用以访问子类自身实例变量的属性和方法
      System.out.println(super.field);//super. 用以允许访问父类的属性和方法
      }
      }

     

    super访问方法

    • super关键字可在子类中访问父类的方法

    • 使用" super. "的形式访问父类的方法, 进而完成在子类中的复用; 再叠加额外的功能代码, 组成新的功能.

     

    super访问属性

    • 父子类的同名属性不存在覆盖关系, 两块空间同时存在( 子类遮蔽父类属性 ), 需要使用不同的前缀进行访问

     

    super调用父类无参构造

    class A{
       public A(){
           System.out.println("A()");
      }
    }
    class B extends A{
       public B(){
           super();
           System.out.println("B()");
      }
    }
    class C extends B{
       public C(){
           super();
           System.out.println("C()");
      }
    }

    super(): 表示调用父类无参构造方法. 如果没有显示书写, 隐式存在于子类构造方法的首行.

     

    super调用父类有参构造

    class A
    {
       int value;
       public A()
      {
           System.out.println("A()");
      }
       public A(int value){
           this.value = value;
      }
    }
    class B extends A
    {
       public B()
      {
           System.out.println("B()");
      }
       public B(int value)
      {
           super(value);
      }
    }

    super(实参): 表示调用父类有参构造方法.

     

    this与super

    • this: 当前实例

    • super: 当前实例的父类实例

    二者不能并存, 无论构造函数有几个 this 都必须有个 super 出口.

    • this或super使用在构造方法中时, 都要求在首行. 当子类构造中使用了this()或this(实参), 即不可再同时书写super()或super(实参), 会由this()指向的构造方法完成super()的调用

     

    小结

    • super关键字的第一种用法:

      • 在子类的方法中使用" super. "的形式访问父类的属性和方法

      • 例如: super. 父类属性、super.父类方法();

    • super关键字的第二种用法:

      • 在子类的构造方法的首行,使用“super()”或“super(实参)”,调用父类构造方法。

    • 注意:

      • 如果子类构造方法中,没有显示定义super()或super(实参), 则默认提供super().

      • 同一个子类构造方法中, super()、this()不可同时存在

     

    多态

    生活中的人物视角

    • 生活中,不同任务角色看待同一个对象的视角不同,关注点也不相同。

     

    生活中的多态

    • 生活中的多态是指 “客观事物在人脑中的主观反应”。

    • 主观意识上的类别与客观存在的对象具有“ is a ”关系时,即形成多态。

    • Java中的多态:将子类对象当成父类类别看待

     

    程序中的多态

    • 概念:父类引用指向子类对象,从而产生多种形态。

      • Animal a = new Dog();
        //父类引用(引用类型) 子类对象(对象类型)
    • 二者具有直接或间接的继承关系时,父类引用可指向子类对象,即形成多态。

    • 父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法。

     

    多态中的方法覆盖

    • 思考:如果子类中覆盖了父类的方法,以父类型引用调用此方法时,优先执行父类还是子类中的方法?

    • 实际运行过程中,依旧遵循覆盖原则,如果子类覆盖了父类中的方法,则执行子类中覆盖后的方法,否则执行父类中的方法。

     

    多态的应用

    • 场景一:

      • 使用父类作为方法形参实现多态,使方法参数的类型更为宽泛。

    • 场景二:【工厂模式】

      • 使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。

     

    装箱、拆箱

    向上转型(装箱)

    • 父类引用中保存真实子类对象,称为向上转型(即多态核心概念)。

      • Animal a = new Dog();
    • 注意:

      • 仅可调用父类中所声明的属性和方法。

     

    向下转型(拆箱)

    Animal a = new Dog();
    Dog dog = (Dog)a;
    • 将父类引用中的真实子类对象,强转回子类本身类型,称为向下转型。

    • 注意:

      • 只有转换回子类真实类型,才可调用子类独有的属性和方法。

     

    类型转换异常

    • 向下转型时,如果父类引用中的子类对象类型和目标类型不匹配,则会发生类型转换异常。

     

    instanceof关键字

    • 向下转型前,应判断引用中的对象真实类型,保证类型转换的正确性。

    • 语法:引用 instanceof 类型 //返回boolean类型结果

    • a instanceof Dog // 返回 true

     

    小结

    • 多态的两种应用场景:

      • 使用父类作为方法形参,实现多态。

        • 调用方法时,可传递的实参类型包括:本类型对象 + 其所有的子类对象

      • 使用父类作为方法返回值,实现多态。

        • 调用方法后,可得的结果类型包括:本类型对象 + 其所有的子类对象

     

    • 多态的作用:

      • 屏蔽子类间的差异

      • 灵活、耦合度低

  • 相关阅读:
    hive函数之~字符串函数
    hive函数之~条件函数
    JSONP使用及注意事项小结
    css命名管理混乱?不妨试试BEM
    【移动端debug-6】如何做一个App里的web调试小工具
    ES6学习笔记(五):Class和Module
    ES6学习笔记(三):与迭代相关的新东东
    ES6学习笔记(四):异步操作
    ES6学习笔记(二):引用数据类型
    CORS跨域资源共享简述
  • 原文地址:https://www.cnblogs.com/77-is-here/p/12919965.html
Copyright © 2020-2023  润新知