默写:
1.编程题
自定义Person类实现封装,属性有:姓名和年龄,行为:打印所有属性的方法。
自定义Student类继承Person类,属性有:学号,行为:打印所有属性的方法。
今天内容:
(1)对象创建的过程
(2)多态
(3)抽象类
(4)接口
(5)内部类
1.对象创建的过程(观察一下就行了)
1.1 单个对象创建的过程
(1)main()方法是程序的入口,当创建对象时没有指定成员变量的初始值,则采用默认
初始化方式,当指定初始值时,则采用指定的数值进行初始化。
(2)执行构造块可以修改成员变量的数值。
(3)执行构造方法体可以再次更改成员变量的数值。
(4)此时对象创建完毕,继续执行后续的代码。
1.2 子类对象创建的过程
(1)首先加载父类的字节码文件,执行父类的静态语句块。
(2)再加载子类的字节码文件,执行子类的静态语句块。
(3)当创建子类对象时,需要先构造子类对象中包含的父类对象,因此执行父类的构造块和
父类的构造方法体。
(4)执行子类的构造块和子类的构造方法体。
(5)此时子类对象构造完毕,继续执行后续的代码。
2.多态(重中之重 难点)
2.1 基本概念
多态本质上就是指同一种事物表现出来的多种形态。
饮料:可乐、雪碧、乐虎、果啤、…
宠物:狗、猫、鸟、小强、…
整数:int i = 10; short s = 10; byte b = 10; …
… …
2.2 语法格式
父类类型 引用名 = new 子类类型();
如:
Person p = new Student();
p.show();
解析:
在编译阶段p是Person类型的,只能调用Person类中的show()方法。
在运行阶段p指向的是Student类型的对象,因此最终调用Student类中的show()方法。
2.3 多态的效果
(1)当父类的引用指向子类的对象时,父类的引用可以直接调用父类的方法。
(2)当父类的引用指向子类的对象时,父类的引用不可以直接调用子类的方法。
(3)当父类的引用指向子类的对象时,编译阶段调用父类的,运行阶段最终调用子类的版本。
- 上述方式指 非静态的成员方法。
(4)当父类的引用指向子类的对象时,对于静态方法来说,最终调用父类的版本。
2.4 引用类型之间的转换
(1)子类类型向父类类型之间的转换自动完成,因此是自动类型转换。
(2)父类类型向子类类型之间的转换需要进行强制类型转换,格式如下:
目标类型 目标类型的引用 = (目标类型)源类型的引用;
(3)引用类型之间的转换必须发生在父子类之间,否则编译报错,执行不到运行阶段。
(4)只要拥有父子类关系则进行强制类型转换时,编译阶段不会报错,当转换的目标类型
并不是该引用真正指向的类型时,则运行阶段产生类型转换异常。
(5)为了避免上述错误的发生,可以使用instanceof运算符进行判断,格式如下:
if(引用变量名 instanceof 引用类型){ 语句块; }
当引用变量名真正指向的对象是后面的引用类型时,则返回true,并执行语句块;
否则返回false;
2.5 多态的作用
多态的作用在于屏蔽不同子类的差异性,实现通用的编程,根据实参传递的不同产生不同的效果。
3.抽象类(重点)
3.1 抽象方法
抽象方法就是指不能具体实现的方法,通常使用abstract关键字修饰。
具体语法格式如下:
访问控制符 abstract 返回值类型 方法名(形参列表);
如:
public abstract void cry();
3.2 抽象类
抽象类就是指具有抽象方法并且使用abstract关键字修饰的类。
3.3 注意事项
(1)抽象类是不能实例化对象,否则编译报错。
(2)抽象类中可以有成员变量、成员方法以及构造方法,可以没有抽象方法。
(3)抽象类中可以有抽象方法也可以没有,但有了抽象方法必须是抽象类。
3.4 抽象类的作用
抽象类的意义不在于实例化对象而在于被继承,因为子类若不重写抽象类中的抽象方法,则子类也要变成抽象类,因此抽象类对子类具有强制性和规范性。
因此使用抽象类的设计通常叫做模板设计模式。
经验:
在以后的开发中推荐使用父类的引用指向子类对象的形式,因为这种情况下引用直接调用的方法一定是父类拥有的方法,此时若更改指向的子类对象,那么后续直接调用的方法不需要做任何的修改直接生效,因此提供了代码的可维护性。
4.接口(重点)
4.1 基本概念
接口就是指一种比抽象类还抽象的类,体现在连构造方法都没有。
定义类的关键字是class,而定义接口的关键字是interface。
继承类的关键字是extends,而实现接口的关键字是implements。
4.2 注意事项
(1)接口中的所有变量都必须由public static final共同修饰,也就是常量。
(2)接口中的所有方法都必须由public abstract共同修饰,可以省略但推荐写上。
4.3 类和接口之间的关系
类和类之间的关系 使用extends关键字 支持单继承
类和接口之间的关系 使用implements关键字 支持多实现
接口和接口之间的关系 使用extends关键字 支持单继承
4.4 抽象类和接口之间的主要区别(笔试题)
(1)定义抽象类的关键字是class,定义接口的关键字是interface。
(2)继承抽象类的关键字是extends,而实现接口的关键字是implements。
(3)继承抽象类是单继承,而实现接口是多实现。
(4)抽象类中有构造方法,但接口中没有。
(5)抽象类中可以有成员变量,而接口中只有常量。
(6)抽象类中可以有成员方法,而接口中只有抽象方法。
(7)抽象类中增加方法可以不影响子类,但接口一定影响子类。
视频
javaseday11-对象创建过程和多态的概念-01
https://v.qq.com/txp/iframe/player.html?vid=m0798ejf4wv
javaseday11-多态的效果和类型转换-02
https://v.qq.com/txp/iframe/player.html?vid=v07989pljd1
javaseday11-多态的作用-03
https://v.qq.com/txp/iframe/player.html?vid=o0798qljfwh
javaseday11-抽象类的概念和使用-04
https://v.qq.com/txp/iframe/player.html?vid=h07985psd5x
javaseday11-接口的概念和使用-05
https://v.qq.com/txp/iframe/player.html?vid=a0798s62pfv
代码
https://pan.baidu.com/s/11wlsJbYB5iiufDTPzFnpaA
作业:
1.重点理解和掌握多态和账户类的案例代码。
2.编程题
自定义狗类,属性有:名字、重量,牙齿数量,行为有:吃食物、看家。
自定义猫类,属性有:名字、重量、颜色,行为有:吃食物、抓老鼠。
自定义抽象动物类描述狗类和猫类的相同成员,其中吃食物设计为抽象方法。
自定义测试类,包含一个main方法,在main方法中使用多态的语法去调用各个方法。