封装
什么是封装
-
概念:尽可能隐藏对象的内部细节,控制对象的修改及访问的权限。
-
访问修饰符: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
小结
-
多态的两种应用场景:
-
使用父类作为方法形参,实现多态。
-
调用方法时,可传递的实参类型包括:本类型对象 + 其所有的子类对象
-
-
使用父类作为方法返回值,实现多态。
-
调用方法后,可得的结果类型包括:本类型对象 + 其所有的子类对象
-
-
-
多态的作用:
-
屏蔽子类间的差异
-
-