继承
定义
继承是面向对象的三大特征(封装、继承、多态)之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
格式
public class 子类名 extends 父类名 {}
父类也被称为基类、超类。子类也被称为派生类。
继承的好处和弊端
好处:
1.提高了代码的复用性(多个类相同的成员可以放到一个类中)
2.提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
弊端:
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性。
什么时候使用继承
规则: is a
当什么是什么的一种的时候就可以使用继承
例如:香蕉和水果、猫猫和动物。
继承中变量的访问特点
在子类中访问一个变量的查找顺序
1.在子类局部范围找
2.在子类成员范围找
3.在父类成员范围找
4.若都没有就报错
super关键字
super关键字用法与this关键字相似。
this:代表本类对象的引用。
super:代表父类存储空间的标识。(可以理解为对父类对象的引用)
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
---|---|---|---|
this | this.成员变量 | this(…) | this.成员方法() |
super | super.成员变量 | super(…) | this.成员方法() |
继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中的无参构造方法。
原因:
1.因为每个子类会继承父类的数据,可能还会使用父类的数据。所以,子类在初始化之前一定要完成父类数据的初始化。
2.每一个子类的构造方法的第一条默认语句是super()访问父类中的无参构造方法。
若父类中没有无参构造方法,只有带参构造方法的解决办法
1.通过super关键字调用父类的带参构造方法
2.在父类中提供一个无参构造方法
继承中成员方法的访问特点
通过子类对象访问一个方法:
1.从子类成员范围找
2.从父类成员范围找
3.如果都没有就报错
Java中继承的注意事项
1.Java中类只支持单继承,不支持多继承。例son extends father,mather()会报错
2.Java中支持多层继承。例如son entends father(){} father extends grandfather(){}
方法重写
定义
子类中出现了和父类一模一样的方法声明
方法重写的应用
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类的方法,这样即沿袭了父类的功能,又有子类特有的内容。
@override检验方法重写方法声明是否正确
方法重写的注意事项
1.父类方法中私有类型的方法不能被子类重写
2.子类访问权限不能更低(public > 默认 > 私有)
Demo:
父类:
package Day13Extends;
public class School {
private String name;
private int age;
public School() {
}
public School(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
子类1:
package Day13Extends;
public class Teacher extends School {
public Teacher(){}
public void teach() {
System.out.println("Teach");
}
}
子类2:
package Day13Extends;
public class Student extends School {
public Student(String name,int age) {
// this.name = name;
// this.age = age;
super(name,age);
}
public void study() {
System.out.println("Study");
}
}
测试类:
package Day13Extends;
public class SchoolTest {
public static void main(String[] args) {
Teacher t = new Teacher();
t.setName("Yee");
t.setAge(24);
System.out.println(t.getName() + "," + t.getAge());
t.teach();
Student s = new Student("dejavu",20);
System.out.println(s.getName()+","+s.getAge());
s.study();
}
}
权限修饰符
修饰符 | 同一类中 | 同一包中子类无关类 | 不同包的子类 | 不同包中的子类无关类 |
---|---|---|---|---|
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
final
final关键字是最终意思,可以修饰成员方法,成员变量,类。
final修饰的特点
修饰方法:表明该方法是最终方法,不能被重写。
修饰变量:表明该变量是常量,不能再次被赋值。
修饰类:表明该类是最终类,不能再被继承。
final修饰局部变量
1.变量是基本类型,被修饰后变量变为常量,值不能变。
2.变量是引用类型,地址值不能变,但是值可以变。
static
static关键字是静态的意思,可以修饰成员方法,成员变量。
static修饰的特点
1.被类的所有对象共享
这是判断是否使用静态关键字的条件。
2.可以通过类名调用
static 静态访问特点
静态成员方法只能访问静态成员方法。
因为Main方法是静态的所以调用的方法也要是静态。