JavaSE基础入门Day9、10、11

时间:2020-05-19
本文章向大家介绍JavaSE基础入门Day9、10、11,主要包括JavaSE基础入门Day9、10、11使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

面向对象三大特性

封装

什么是封装

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

  • 访问修饰符: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

小结

  • 多态的两种应用场景:

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

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

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

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

  • 多态的作用:

    • 屏蔽子类间的差异

    • 灵活、耦合度低

原文地址:https://www.cnblogs.com/77-is-here/p/12919965.html