JavaDay8 继承
配套代码地址:https://github.com/Philbenzy/Java-question-100/tree/main/day8
1:代码块是什么?代码块的分类和各自特点?
代码块是写在花括 { } 号内的执行语句
代码块的分类:
- 静态代码块:随着类的加载而加载,只执行一次
- 构造代码块:在执行构造方法之间执行
- 局部代码块:限定变量、方法的生命周期,在执行完毕后被回收
2:静态代码块,构造代码块,构造方法的执行流程?
静态代码块(一次) > 构造代码块 > 构造方法
程序演示:Test.java
PS: 如果这个类在创建新对象时,不会再执行一遍这个类中的静态代码块
3:继承概述
继承思想在类与类之间构造出了关联,可以把重复、执行内容相似的代码进行抽取之后独立为一个新类
使用extends关键字表示继承
4:继承的好处
继承的好处:
(1)提高代码复用
(2)增强代码维护性
(3)类与类通过关系连接,具备多态前提
继承也有弊端:
(1)继承的做法增强了类与类的耦合性,某个类的改变会影响到相关类
(2)继承的做法会打破了代码的封装性
5:Java中继承的特点
(1)Java中的继承只支持单继承,但是可以通过多层(重)继承来达到多继承的效果
6:Java中继承的注意事项?以及我们什么时候使用继承?
注意事项
(1)如果成员变量、方法被定义为私有,则子类无法继承;
(2)子类无法继承父类中的构造方法,但是可以使用super( )关键字指定访问;
(3)不要为了部分功能进行继承
什么时候使用?
继承关系可以简单的表达成为:is a
可以通过什么是什么来确定是否可以进行继承
7:继承中的成员访问特点
A:成员变量
在子类方法中访问一个变量
case1:当名称不同时很简单,访问什么就会出现什么;
case2:当名称相同时,会依据查找顺序进行查找
(1)查找子类局部范围
(2)查找子类成员范围
(3)查找父类局部~
(4)查找父类成员~
(5)JVM报错!
B:成员方法
在测试类中通过子类对象去访问一个方法
(1)在子类中查找
(2)在父类中查找
(3)JVM报错!
8:继承中构造方法的执行流程?假如父类没有无参构造方法,子类应该怎么办?
继承中构造方法的执行流程:
(1)子类初始化默认访问父类无参构造方法
(2)子类构造方法初始化
当父类没有无参构造方法时:
当我们自定义了父类带参构造方法后,JVM就不会再给默认的无参构造方法,这时候
(1)子类可以通过super( )指定访问
(2)子类通过this调用自己的构造方法,但是自己的构造方法中必定有一个会访问到父类的带参构造
(3)不用那么麻烦,手动再写一个无参构造吧
9:面试题:
方法重写和方法重载的区别?方法重载能改变返回值类型吗?
Overload(重载):重载发生在类内的成员方法,名称相同,但参数列表不同时,JVM会根据传入参数的类型匹配名称相同的不同方法,此时被称为方法重载,方法重载可以改变返回值类型,因为重载与返回值类型无关。
**Override(重写):**重写发生在出现继承关系时,由于父类的方法应用于子类时满足不了子类的特殊需求,所以在子类中定义一个与父类一摸一样的方法(方法名称、返回值类型、方法权限相同)。
this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。//ExtendsDemo5
this
(1)this关键字用于对本类对象的成员变量与自己的构造方法进行声明
(2)this的三类使用
- 成员方法:this.成员方法
- 成员变量:this.成员变量
- 构造方法:this(构造方法)
super
(1)super是针对父类对象的标识
(2)super的三类使用
- 父类方法调用
- 父类变量调用
- 构造方法调用
10:继承案例练习
A: 学生老师案例
ExtendsDemo.java
B: 猫狗案例分析
ExtendsDemo2.java
11:猜数字小游戏练习。
通过API学习并使用Math类的random()方法。
API:应用编程接口,也可以叫做函数、方法。。。
案例演示:GuessNumber.java