JavaSE学习历程
第一章:Java初识
第二章:Java语言基础
第三章:选择结构与分支结构
第四章:循环结构
第五章:方法/函数
第六章:数组
第七章:面向对象
第八章:三大特性
1 封装
1.1 封装
概念:尽可能隐藏对象的内部实现细节,控制对象的修改及访问权限
访问修饰符:private—>(可将属性修饰为私有,仅本类可见)
1.2 公共访问方法
set/get 方法,以访问的形式,进而完成赋值与取值操作.
get/set方法是外界访问私有属性的唯一方法
- set方法:带参数,无返回值.—>赋值方法
- get方法:无参数,有返回值.—>取值方法
1.3 过滤有效数据
通过再公共访问方法的内部,添加逻辑判断,进而过滤掉非法数据,以保证数据安全.
1.4 封装总结
1.通过private修饰符,让成员变量私有化;
2.通过set/get方法访问私有成员变量(属性);
3.在公共访问方法内部添加逻辑判断,达到检测和过滤数据的目的.
2 访问修饰符
本类 | 同包 | 非同包子类 | 其他 | |
---|---|---|---|---|
private | √ | × | × | × |
default | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
访问修饰符作用范围
- 访问修饰符除了放在属性前,还有其它什么位置:
- 通过修饰符来控制类、属性和方法的访问权限和其他功能,通常放在语句的最前端.
3 继承
3.1 继承
程序中的继承,是类与类之间特征和行文的一种赠与或获得
在一组相同或类似的类中,抽取出共性的特征和行为,定义在父类中,实现重用
语法:class 子类 extends 父类{} //定义子类时,显示继承父类
应用:产生继承关系之后,子类可以使用父类中的属性和方法,也可定义子类独有的属性和方法.
好处:既提高代码的复用性,又提高代码的可扩展性.
注:Java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加.
3.2 不可继承
构造方法:
- 类中的构造方法,只负责创建本类,不可继承.
private修饰的属性和方法:
- 访问修饰符的一种,仅本类可见.
父子类不在同一个package包中,default修饰的属性和方法:
- 访问修饰符的一种,仅同包可见.
4 方法重写/覆盖(Override)
4.1 方法的重写
问题:当父类提供的方法无法满足子类需求时,可在子类中定义和父类相同的方法进行重写(Override).
4.2 方法重写原则与执行
方法重写原则:
- 方法名称、参数列表必须与父类相同。
- 返回值类型与父类或其子类(返回值类型的子类)一样
- 访问修饰符可与父类相同或是比父类更宽泛。
方法重写执行:
- 子类重写父类方法后,调用时优先执行子类重写后的方法。
4.3 super关键字
- 在子类中,可直接访问从父类继承到的属性和方法,但如果父子类的属性或方法存在重名(属性遮蔽、方法重写)时,需要加以区分,才可专项访问.
- super关键字可在子类中访问父类的方法.
super()调用父类无参构造方法时,若没有显示书写,则隐式存在于子类构造方法的首行.
4.4 继承中的对象创建
- 在具有继承关系的对象创建中,构建子类对象会优先构建父类对象.
- 有父类的共性内容,叠加子类独有内容,组合成完整的子类对象
4.5 继承后的对象构建过程
构建子类对象时,先构建父类对象
4.6 this与super
相同点:
使用在构造方法中,都要求在首行,故在构造方法中两个关键字只能存在一个
5 多态
5.1 生活中的多态
生活中多态是指"客观事物在人脑中的主观反应".
主观意识上的类别与客观存在的对象具有"is a"关系时,即形成多态.
5.2 程序中的多态
概念: 父类引用指向子类对象,从而产生多种形态
父类引用(引用类型)<—Animal a = new Dog();—>子类对象(对象类型)
二者具有间接或直接的继承关系时,父类引用可指向子类对象,即形成多态.
父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法.但父类引用可通过类型强转实现调用子类的独有的方法.
5.3 多态中的方法重写
多态中的方法重写依旧遵循重写原则,如果子类重写了父类中的方法,执行子类中重写的方法,否则执行父类的方法.
5.4 多态的应用
方法得重载可以解决接收不同对象参数得问题,但其缺点也比较明显
- 随着子类的增加,类需要继续提供大量的方法重载,多次修改并重新编译源文件.
- 每一个重载的方法与某一种具体类型形成了密不可分的关系,耦合太高.
多态使用场景一:使用父类作为方法形参实现多态,使方法参数的类型更为宽泛.
多态使用场景二:使用父类作为方法的返回值实现多态,是方法可以返回不同的子类对象.
5.5 多态的静态和动态实现
动态绑定:即为重写/覆盖,方法的重写
动态绑定也叫后期绑定,在运行时,虚拟机根据具体对象实例的类型进行绑定,或者说是只有对象在虚拟机中运行创建了之后,才能确定方法属于哪一个对象实例的
- 根据实际对象是什么,就去找相应对象方法去执行。
- 动态绑定是在运行时才会执行(例如重写的方法)。
静态绑定:即为重载,方法的重载
一个方法的参数在编译阶段常被静态地绑定,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数
- 根据类型找相应的属性或者静态变量。
- 静态绑定是在编译时执行(如成员变量,静态方法)。
6 装箱与拆箱
6.1 向上转型(装箱)
Animal a = new Dog();
父类引用中保存真实子类对象–>称为向上转型(多态核心概念)
注意:只可调用父类中声明的属性和方法.
6.2 向下转型(拆箱)
Animal a = new Dog(); Dog dog = (Dog)a;
将父类引用的真实子类对象,强制转回子类本身类型,称为向下转型
注意:只有转回子类真实类型才可调用子类独有的属性与方法.
6.3 类型转换异常
java.lang.ClassCastException:向下转型时,如果父类引用的子类对象类型和目标类型不匹配,则会发生类型转换异常.
解决方法:向下转型前,应判断引用中的对象真实类型,保证类型转换的正确性。
关键字:instanceof
语法:父类引用 instanceof 目标类型 //返回boolean类型结果
public static void menu() {
Animal animal = new Animal();
Scanner input = new Scanner(System.in);
System.out.println("====欢迎来到宠物店====");
System.out.println("请输入您需要购买的宠物:1.狗、2.猫、3.蛇、4.鸟");
int choose = input.nextInt();
// 根据返回的动物类型,选择不同的动物
animal.buy(sell(choose));
animal = sell(choose);
if (animal instanceof Dog) {
Dog d = (Dog) animal;
d.run();
} else if (animal instanceof Cat) {
Cat c = (Cat) animal;
c.play();
} else if (animal instanceof Snake) {
Snake s = (Snake) animal;
s.climb();
} else if (animal instanceof Bird) {
Bird b = (Bird) animal;
b.flay();
}
}