继承
如果两个类中具有部分相同的方法和字段,就可以使用继承省略相同部分的代码。
class Person{
private String name;
public String getName(){...} //获取、读值
public void setName(String name){...} //设置、写值
}
class Student extends Person{
private int score;
public int getScore(){...}
public void setScore(int score){...}
}
继承树
protected
子类无法访问父类的private字段、private方法,但在同类里子类可以访问父类的protected字段和方法。
super
调用父类的字段和方法是需要构造器里用到super。
class Person{
protected String name;
public Person(String name){
this.name= name;
}
}
class Student extends Person{
protected int score;
public Student(int score){
super(name); //如果不用super,编译器会自动生产无参:super()
this.score = score;
}
}
阻止继承
sealed
//只允许Student和Teacher子类继承父类Person
public sealed class Person permits Student, Teacher {
...
}
这种sealed类主要用于一些框架,防止继承被滥用。
final
加了final的类不允许被扩展。
public final class sextends Person{
...
}
向上转型
把一个子类类型安全地变为父类类型的赋值,被称为向上转型(upcasting)。
继承树是Student > Person > Object,所以,可以把Student类型转型为Person,或者更高层次的Object。
Student s = new Student();
Person p = s;
Person p = new Student();
//实际类型为Student,引用类型为Person
向下转型
把父类类型转化为子类类型,就是向下转型。
Person p1 = new Student(); // p1是指向Student的
Student s1 = (Student) p1; // ok
Person p2 = new Person(); // p2是指向Person的
Student s2 = (Student) p2; // error!将其转换成Student,无法凭空多出功能
instanceof实际上判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。
Person p =new Student(); //p是指向Student的
if (p instanceof Student) {
// 只有判断成功才会向下转型:
Student s = (Student) p; // 一定会成功
}
从Java 14开始,判断instanceof后,可以直接转型为指定变量,避免再次强制转型。
// instanceof variable:
public class Main {
public static void main(String[] args) {
Object obj = "hello";
if (obj instanceof String s) { //判断obj是否为String
// 可以直接使用变量s:
System.out.println(s.toUpperCase());
//输出HELLO
}
}
}
组合
如果说继承是is,那么组合就是has。
class Book {
protected String name;
public String getName() {...}
public void setName(String name) {...}
}
class Student extends Person {
protected Book book; //Student可以has一个Book实例
protected int score;
}
参考链接
https://www.liaoxuefeng.com/wiki/1252599548343744/1260454548196032