Skip to content

Commit 42d067d

Browse files
committed
add note ch05
1 parent 4d8d317 commit 42d067d

13 files changed

Lines changed: 397 additions & 0 deletions
40 KB
Loading
218 KB
Loading
136 KB
Loading
38.8 KB
Loading
47.8 KB
Loading
126 KB
Loading

learning_notes/第5章:继承.md

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,146 @@
1+
第4章主要内容:类和对象
2+
3+
本章主要内容:
4+
5+
继承(inheritance)
6+
7+
- 基于已有的类构造一个新类,复用(继承)原有类的方法和属性,就是继承
8+
9+
反射(reflection)
10+
11+
- 指在程序运行期间发现更多的类及其属性的能力
12+
113
# 5.1 类、超类和子类
214

315
5.1.1 定义子类
416

17+
1)继承中的术语
18+
19+
- 已存在的类:超类( **superclass**)、 基类( **base** **class**) 或父类(**parent** **class**)
20+
- 新类:子类(**subclass**) 、派生类**(** **derived** **class**) 或孩子类(**child** **class**)。
21+
22+
2)类设计思想
23+
24+
- 将通用的方法放在超类,将具有特殊用途的方法放在子类
25+
526
5.1.2 覆盖方法
627

28+
1)子类方法不能直接访问父类的私有属性,需要借助父类属性对应的getter
29+
30+
2)`super调用父类方法`:一个指示编译器调用超类方法的特殊关键字,不是一个对象的引用,不能将super赋给另一个对象变量
31+
32+
```java
33+
public double getSalary() {
34+
double baseSalary = super.getSalary();// 获取父类私有属性salary
35+
return baseSalary + bonus;
36+
}
37+
```
38+
739
5.1.3 子类构造器
840

41+
1)`super调用父类构造器`:使用super 调用构造器的语句必须是子类构造器的第一条语句
42+
43+
2)如果子类的构造器没有显式地调用超类的构造器, 则将自动地调用超类默认(没有参数 )
44+
45+
的构造器。 **如果超类没有不带参数的构造器****并且在子类的构造器中又没有显式地调用超类**
46+
47+
**的其他构造器**则 Java 编译器将报告错误。
48+
49+
![image-20200402154811436](第5章:继承.assets/image-20200402154811436.png)
50+
51+
**3)多态【面试考点】**
52+
53+
> Q:谈一谈多态?
54+
>
55+
> A:Java中实现多态有两种方式:
56+
>
57+
> - 继承,子类重写父类的方法
58+
> - 接口,类实现接口并重写接口中的方法
59+
>
60+
> 用父类和接口声明对象的引用变量,该变量能指向父类或子类,能指向实现类,这就是多态(polymorphism)。
61+
>
62+
> 在程序运行期间,能自动选择调用哪个方法(的动态绑定,dynamic binding),如:引用变量用父类声明,调用子类重写父类的同名方法时,若引用变量指向父类,调用父类的方法;若指向子类时调用子类的方法。
63+
64+
![image-20200402162253662](第5章:继承.assets/image-20200402162253662.png)
65+
966
5.1.4 继承层次
1067

68+
1)继承层次(inheritance hierarchy):由一个公共父类派生出来的**所有类的集合**被称为继承层次
69+
70+
2)继承链(inheritance chain):从某个特定的类到其祖先的**路径**被称为该类的继承链
71+
72+
3)一个祖先类可以拥有多个子孙继承链
73+
74+
![image-20200402164350311](第5章:继承.assets/image-20200402164350311.png)
75+
76+
4)Java不支持多继承,但能用接口实现C++里多继承的功能
77+
1178
5.1.5 多态
1279

80+
1)"is a":父类对象的任何地方都可以用子类对象置换
81+
82+
如:将一个子类的对象赋给超类变量
83+
84+
```java
85+
Employee e;
86+
e = new Employee(. . .); // Employee object expected
87+
e = new Manager(. . .); // OK, Manager can be used as well
88+
```
89+
90+
再如:一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类的对象(如,Manager、Executive、Secretary等)
91+
1392
5.1.6 理解方法调用
1493

94+
1)方法覆盖
95+
96+
如果在子类中定义了一个与超类签名相同的方法, 那么子类中的这个方法就覆盖了超类中的这个相同签名的方法
97+
98+
2)动态绑定与方法表
99+
100+
虚拟机为 **Employee****Manager** 两个类生成方法表
101+
102+
Employee方法表:(省去了超类Object类的方法)
103+
104+
![image-20200402181340277](第5章:继承.assets/image-20200402181340277.png)
105+
106+
Manager方法表:
107+
108+
![image-20200402181419352](第5章:继承.assets/image-20200402181419352.png)
109+
110+
- 3个方法是继承来的:getName()、getSalary()、raiseSalary(double)
111+
- 1个方法是重写的:getSalary()
112+
- 1个是新增的:setBonus(double)
113+
15114
5.1.7 阻止继承:final类和方法
16115

116+
1)不允许类和方法被扩展,使用`final`修饰
117+
118+
```java
119+
// final类:此类无法被继承
120+
public final class Executive extend Manager{
121+
// final类的所有方法自动成为final方法
122+
}
123+
124+
// final方法:子类不能覆盖此方法(getName())
125+
public class Employee{
126+
...
127+
public final String getName(){
128+
return name;
129+
}
130+
...
131+
}
132+
```
133+
134+
2)将方法和类声明为final的主要目的:确保它们不会在子类中改变语义
135+
136+
![image-20200402182310177](第5章:继承.assets/image-20200402182310177.png)
137+
17138
5.1.8 强制类型转换
18139

140+
1)类型转换:将一个类型强制转换为另一个类型的过程被称为类型转换
141+
142+
143+
19144
5.1.9 抽象类
20145

21146
5.1.10 受保护访问
84.6 KB
Loading

learning_notes/面试考点.md

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# 第5章:继承
2+
3+
Q:谈一谈多态?
4+
5+
A:Java中实现多态有两种方式:
6+
7+
- 继承,子类重写父类的方法
8+
- 接口,类实现接口并重写接口中的方法
9+
10+
用父类和接口声明对象的引用变量,该变量能指向父类或子类,能指向实现类,这就是多态(polymorphism)。
11+
12+
在程序运行期间,能自动选择调用哪个方法(动态绑定,dynamic binding),如:引用变量用父类声明,调用子类重写父类的**同名方法时**,若引用变量指向父类,调用父类的方法;若指向子类时调用子类的方法。
13+
14+
**通常**:多态与`instanceof`关键字合用,可对父类及其所有子类,实现接口的类进行通用处理,使程序有良好的扩展性。(见实例2)
15+
16+
1)实例1
17+
18+
```java
19+
// 父类:Employee
20+
public double getSalary() {
21+
System.out.println("父类:getSalary()");
22+
return salary;
23+
}
24+
25+
// 子类:Manager
26+
public double getSalary() {
27+
System.out.println("子类:getSalary()");
28+
double baseSalary = super.getSalary();// 调用父类getSalary()
29+
return baseSalary + bonus;
30+
}
31+
```
32+
33+
```java
34+
// Employee -> Manager
35+
Employee e = new Manager("Test", 80000, 1987, 12, 15);
36+
e.getSalary(); // 调用子类方法
37+
38+
e = new Employee("666", 6666, 1990, 3, 16);
39+
e.getSalary(); // 调用父类方法
40+
41+
// 输出
42+
子类:getSalary()
43+
父类:getSalary()
44+
80000.0
45+
------------------
46+
父类:getSalary()
47+
6666.0
48+
```
49+
50+
![image-20200402174420945](面试考点.assets/image-20200402174420945.png)
51+
52+
2)实例2
53+
54+
多态存在的三个必要条件
55+
56+
- 继承
57+
- 重写
58+
- 父类引用指向子类对象
59+
60+
比如:`Parent p = new Child();`
61+
62+
当使用多态方式:p调用方法时,**首先**检查父类中是否有该方法,如果没有,则编译错误;如果有,**再去调用子类的同名**方法。
63+
64+
```java
65+
package com.ch05.inheritance;
66+
67+
public class Test {
68+
public static void main(String[] args) {
69+
show(new Cat()); // 以 Cat 对象调用 show 方法
70+
show(new Dog()); // 以 Dog 对象调用 show 方法
71+
72+
Animal a = new Cat(); // 向上转型
73+
a.eat(); // 调用的是 Cat 的 eat
74+
Cat c = (Cat)a;// 向下转型
75+
c.work();// 调用的是 Cat 的 work
76+
}
77+
78+
public static void show(Animal a) {
79+
a.eat();// 父类引用指向子类变量,调用子类的eat方法
80+
// 类型判断
81+
if(a instanceof Cat) { // 猫做的事情
82+
Cat c = (Cat)a;
83+
c.work();
84+
}else if (a instanceof Dog) { // 狗做的事情
85+
Dog c = (Dog)a;
86+
c.work();
87+
}
88+
}
89+
}
90+
91+
abstract class Animal{
92+
abstract void eat();
93+
}
94+
95+
class Cat extends Animal{
96+
public void eat() {
97+
System.out.println("吃鱼");
98+
}
99+
public void work() {
100+
System.out.println("抓老鼠");
101+
}
102+
}
103+
104+
class Dog extends Animal{
105+
public void eat() {
106+
System.out.println("吃骨头");
107+
}
108+
public void work() {
109+
System.out.println("看家");
110+
}
111+
}
112+
113+
// 输出
114+
吃鱼
115+
抓老鼠
116+
吃骨头
117+
看家
118+
吃鱼
119+
抓老鼠
120+
```
121+
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.ch05.inheritance;
2+
3+
import java.time.LocalDate;
4+
5+
class Employee {
6+
private final String name;
7+
private double salary;
8+
private LocalDate hireDay;
9+
10+
/*
11+
public Employee() {
12+
this.name = "";
13+
}*/
14+
15+
public Employee(String name, double salary, int year, int month, int day) {
16+
this.name = name;
17+
this.salary = salary;
18+
this.hireDay = LocalDate.of(year, month, day);
19+
}
20+
21+
22+
public String getName() {
23+
return name;
24+
}
25+
26+
27+
public double getSalary() {
28+
System.out.println("¸¸Àà:getSalary()");
29+
return salary;
30+
}
31+
32+
public void setSalary(double salary) {
33+
this.salary = salary;
34+
}
35+
36+
public LocalDate getHireDay() {
37+
return hireDay;
38+
}
39+
40+
public void setHireDay(LocalDate hireDay) {
41+
this.hireDay = hireDay;
42+
}
43+
44+
public void raiseSalary(double byPercent) {
45+
double raise = this.salary * byPercent / 100;
46+
this.salary += raise;
47+
}
48+
}

0 commit comments

Comments
 (0)