JavaDay9面向对象
day9中,主要介绍5个新的问题:
(1)final关键字
(2)由继承铺垫而来的多态
(3)上下转型问题
(4)抽象类
(5)接口
1:final关键字可以干什么?有什么特点?
final关键字意味着最后、最终,用来对方法、成员变量、局部变量(基本数据类型、引用数据类型)、和类进行修饰,被final修饰后的对象,会有不同于以前的变化。
final关键字可以修饰的有三类:
(1)类:修饰后,无法继承
(2)成员变量:修饰后,成为一个常量
(3)成员方法:修饰后,无法被子类继承后重写
2:final关键字的面试题?
A:修饰局部变量
(1)修饰基本数据类型
修饰基本数据类型,无法继续修改该变量的值;
但是有两种初始化情况:
- 饿汉式(给定引用就给定初始化值)
- 懒汉式(给定引用后忽略初始化值,JVM默认初始,之后再给定值)
不管是哪一种情况,程序的编写者只能给final修饰的关键字赋值一次。
(2)修饰引用数据类型
引用数据类型的代表是代码执行过程中的一个具体的类对象,当被final修饰后,地址值固定不变,而其成员变量仍可以进行修改
案例演示:FinalDemo2.java
B:初始化时机
(1)只能被初始化一次,并且JVM的默认初始化不算初始化
(2)可以在成员变量初始化时直接赋值
(3)可以在类中代码块初始化
(4)可以在构造方法中初始化
3:多态是什么,前提是什么?
多态的出现,表达了这样的一种意思「同一个对象可以在不同时刻体现出不同的状态」,举一个例子,定义水为父类,那么冰块类、液态水类、水蒸气类、都具备水的一般属性,可以继承自水,当需要对这三个不同的类进行同一种相同操作的时候,只需要在方法中传入三者的父类即可,避免了针对同一种东西的不同类需要写多条方法语句的问题。
多态前提:
(1)具备继承关系;
(2)进行方法重写;
(3)父类引用指向子类对象;
4:多态中成员访问的特点?
成员变量:编译看左边父类,执行看左边父类
**成员方法:**编译看左边父类,执行结果为子类重写的方法,如果没有就使用来自父类的方法
静态方法:编译看左边父类,运行看左边方法
构造方法:先访问父类构造方法,再访问子类构造方法
5:多态的好处及弊端?如何解决多态的弊端?
多态的好处:
(1)多态让代码更容易维护
(2)多态提高了代码的扩展性
多态弊端:
(1)父类引用对象无法使用子类特有的方法
这时候,可以通过向下转型,把父类引用强制转换为子类引用,再调用子类的方法
6:什么是向上转型?什么是向下转型?
向上转型:
就是以「父类 f = new 子( )」这种形式出现的,由父类指向子类
向下转型:
「子 z = (子) f 」,把父类引用强制转换为了子类引用,同时这个过程是没有new对象的。
7:多态练习
案例演示:猫狗与工具类 「DuoTaiDemo2.java」
8:抽象类概述及其特点?
概述:
在「DuoTaiDemo2.java」中,定义了动物的两个具体方法eat、sleep,但是这是多余的,因为最终具体的类重写了这两个具体的方法;所以,这个类是没有必要定义成为一个具体类的,所以引入了抽象类
特点:
(1)抽象类是无法实例化的,但抽象类具有构造方法,作用是初始化子类
(2)抽象类中可以没有抽象方法,但是有抽象方法的类一定是抽象类
(3)抽象类使用「abstract」关键字修饰
(4)抽象类的子类有两种
-
不重写抽象方法,继续是一个抽象类;
-
重写所有抽象方法,是一个具体类;
9:抽象类成员特点?
抽象类成员:
(1)成员变量:可以是常量、也可以是变量(可以被修改)
(2)构造方法:具有构造方法,能够被子类访问初始化
(3)成员方法:可以是具体方法、也可以是抽象方法,如果是抽象方法,那么方法不能有主体(不能有花括号)
抽象类实例化的方法也是存在的,就是通过多态中,父类引用指向子类对象 Animal a = new Cat( );
10:抽象类练习?
案例演示:「AbstractDemo.java」
11:抽象类的小问题
(1)一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以,只有存在抽象方法的类,才必须定义成为抽象类
意义在于:这个类无法创建对象
(2)abstract不能和哪些关键字共存
- private:被这个修饰的方法会导致子类无法重写
- final:也会导致无法重写
- static:通过「变量名.方法名」调用抽象方法时,没有意义
12:接口的概述及其特点?
(1)接口的产生:
继承解决的是类与类之间的共性问题,接口解决的是类与类的特性问题、
(2)特点:
- 接口需要使用interface指定,使用implement实现
- 接口不能进行一般的实例化,但是和抽象类一样,可以使用多态的方式进行实例化
- 类与接口可以单实现,也可以多实现,并且在继承的基础上也可以实现
- 接口的子类可以分为两种进行实现
- 1 一个具体子类
- 2 一个抽象类(没有意义)
13:接口的成员特点?
接口成员:
(1)成员变量:默认被 「public static final 」修饰;
(2)构造方法:没有构造方法;
(3)成员方法:默认被「public abstract」修饰,抽象方法;
14:接口的练习?
接口名+接口名+Impl这种格式是接口的实现类格式
案例演示:「InterFaceDemo2.java」
15:抽象类和接口的区别?
(1)设计理念不同
接口:沿用继承思想的「is a」
抽象类:突出类的独特性,「like a」
(2)建立的关系不同
接口:实现关系
抽象类:继承关系
(3)对成员方法的限制不同
接口:只能只抽象方法
抽象类:可以是抽象方法,也可以是具体方法,还可以在抽象类中不定义抽象方法,只定义类是抽象的
(4)对成员变量的限制不同
接口:成员变量是常量
抽象类:可以是常量和变量
(5)对构造方法的限制不同
接口:没有构造方法
抽象类:有构造方法,子类初始化时访问
(6)共性
都无法被正常实例化,但可以通过多态方式实例化
16:案例
- 猫狗案例,加入跳高的额外功能
案例演示:「InterFaceDemo.java」
- 老师和学生案例,加入抽烟的额外功能
案例演示:「InterFaceDemo4.java」
- 教练和运动员案例(学生分析然后讲解)
案例演示:「InterFaceDemo3.java」
总结
Day9学习了Java中的抽象类、接口类,还有多态,如果想让一个类无法实例化,也可以不用定义为抽象类,直接私有它的构造方法。