关键字: extends
为什么存在:
多个类存在相同属性和行为,将其放在一个父类中,其余的类只需要继承就行。
提高代码复用性
格式:
class 子类名 extends 父类名{}
eg:
Person类:
public class Person {
private int age;
private String name;
public static void eat(){
System.out.println("吃饭");
}
}
Student:
public class Student extends Person{
}
Main:
public class ExtendsDemo {
public static void main(String[] args) {
Student st = new Student();
st.eat();
}
}
好处:
- 提高代码复用性
- 子类还可以在父类的基础上添加新成员
- 提高代码的维护性
- 让类与类之间产生关系,是多态的前提
(这也是弊端,类与类的耦合性很高)
弊端:
- 高耦合
- 可以打破封装性
拓展:
开发原则:低耦合,高内聚
耦合:类与类的关系
内聚:就是自己完成某件事情的能力
Java中继承的特点
- java中只支持单继承,不支持多继承
class zilei extends fulei,fulei2{} //这种不允许
- 但支持多层继承
class a
class b extends a{}
class c extends b{}
Java中继承的注意事项
- 子类不能继承父类的私有成员方法
继承非私有方法,里面如果有私有变量也可以。(打破封装性)
Person类:
public class Person {
private int age;
private String name;
public static void eat(){
System.out.println(age); //私有成员变量age
}
}
Student:
public class Student extends Person{
}
Main:
public class ExtendsDemo {
public static void main(String[] args) {
Student st = new Student();
st.eat();
}
}
- 子类不能继承父类的私有成员变量
- 子类不能继承父类的构造方法,只能通过super关键字访问
- 不要为了部分功能就去继承
继承适用场景:
继承体现的是一种关系: “is a”
假设法
当设计的时候需要你去分析:
比如有张三,李四类,张三 is a Person;李四 is a Person
比如有香蕉,苹果类,香蕉 is a 水果;苹果 is a 水果
那就是说如果你觉得ab都属于c的一种,就可以使用继承
继承中成员变量的关系
-
父类中成员变量名称与子类的不同:不冲突
-
若相同,变量就近原则。变量值为子类中的值
既输出局部范围的变量,还要输出本类成员范围中的变量:
父类:
public class Father {
int num = 100;
}
子类:
public class Son extends Father{
int num = 50;
public void show(){
int num = 10;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
Main:
public class ExtendsDemo2 {
public static void main(String[] args) {
Son son = new Son();
son.show();
}
}
输出为:
10 //输出的是最近的方法体中的num
50//输出的是son类中的num
100//输出的是父类中的num
关键字 | 寻值范围 |
---|---|
this.num | 本类中>父类 |
super.unm | 父类 |
num | 方法体>本类>父类 |
继承中构造方法的方法
- 子类中所有构造方法执行前都会默认访问父类中无参构造方法
- 为什么:子类会继承父类数据,所以子类初始化之前,一定要完成父类数据的初始化
子类的每个构造方法第一句都是:super(); 不写也会默认有
public class Student extends Person{
public Student(){
super();
}
}
super(); 可以访问父类的带参构造方法