继承与组合

继承

如果两个类中具有部分相同的方法和字段,就可以使用继承省略相同部分的代码。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值