Java面向对象4--继承

1.定义

每个类都会继承一个父类,在没有继承类的情况下,默认继承Object类,所以,除了Object类,其他类都会继承一个类。并且,一个子类只会存在一个父类,不允许继承多个父类。

2.作用

继承父类之后,子类会继承父类所有的功能,减少重复代码,提高代码的复用性。子类只需要编写额外的功能,但注意的是!子类已经获得了父类的所有字段名称,不能定义与父类重名字段!

3.protected

(1).子类不能继承private类的字段,这会让继承作用被削弱,若想被子类使用,可以使用protected。

4.super

super是用来引用父类的字段以及方法等。

假如父类中有name字段,super.name,this.name,name都可以表示到父类的name字段。但某些时候必须使用super字段。

当父类重新定义了构造方法,并且构造方法中有参数,并且子类中对父类中的字段进行传参,若只对子类中添加的字段进行this.字段名=赋值,那会抛出异常。

因为默认传参是super(),而不是super(参数),所以编译失败。

例如:

public class Main {
    public static void main(String[] args) {
        Student s = new Student("Xiao Ming", 12, 89);
    }
}

class Person {
    protected String name;
    protected int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

class Student extends Person {
    protected int score;

    public Student(String name, int age, int score) {
        this.score = score;
    }
}

此时编译就会报错。因为在Student中,默认调用了super()。

class Student extends Person {
    protected int score;

    public Student(String name, int age, int score) {
        super(); // 自动调用父类的构造方法
        this.score = score;
    }
}

但是父类中并不存在super()无参构造函数,所以编译异常。正确写法是调用父类中对应的有参构造方法。

class Student extends Person {
    protected int score;

    public Student(String name, int age, int score) {
        super(name, age); // 调用父类的构造方法Person(String, int)
        this.score = score;
    }
}

5.final

正常情况下,只要没有final修饰符,其他任何类都可以继承该类,若是想限制继承的类,可以使用sealed修饰class,用permits明确写出可以继承的类的名称。未写在permits中的类继承sealed类会报错。

作用:主要用于一些框架,防止继承被滥用。

注意事项:使用sealed,必须使用--enable-preview 和--source 15.

6.向上转型

当一个父类创建一个指向父类的是实例是可以的。当一个子类创建一个指向子类的实例也是可以的。当一个子类创建一个父类的实例,就叫做向上转型。

例如:

 Person p =new Student();
Object o1 = new Student();
Object o2 = new Student();

7.向下转型

当一个父类的实例指向子类,就会classCastException异常错误。子类中多出来的字段,父类不可以凭空出现,所以向下转型很可能会爆出异常。

例如:

Student student = new Person();

8.instanceof

当需要向下转型时,可以使用instanceof判断是否是同类型,如果是,则向下转型

例如:

将obj向下转型为String

Object obj = "hello";
if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.toUpperCase());
}

使用instanceof判断,是否为同类型,相同则进入条件,输出大写

在Java14之后,可以直接使用instanceof直接转型为制定变量。可以改写如下:

public class Main {
    public static void main(String[] args) {
        Object obj = "hello";
        if (obj instanceof String s) {
            // 可以直接使用变量s:
            System.out.println(s.toUpperCase());
        }
    }
}

9.继承和组合

继承是“is”的关系,例如,Student继承Person,是“is”的关系,若有一个Book实体,则按逻辑来说,是“have”的关系,所以可以在Stduent类中定义一个Book的实例对象。

class Student extends Person {
    protected Book book;
    protected int score;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值