从0到1,Java基础(9)——继承与组合

继承(Inheritance)

定义

  • 子类对父类进行扩展,从一般到特殊的关系,父类-共性,子类-特性
  • 继承表达的是一种“是(is-a)”的关系

语法格式

        在定义子类(sub class)的时候使用 extends 来表明自己继承于哪一个父类(super class)

class SubClass extends SuperClass {
// 子类特有的字段和方法
}

作用

  • 描述一个体系
  • 其次解决代码重复

注意

  • 类只允许单继承,不允许多继承,支持多重继承
  • java.lang.Object 类是 Java 语言的根类,任何类都是 Object 类的子类 / 间接子类

子类可以访问的父类成员

  • 可访问
    • public 或 protected 修饰的成员
    • 同包中缺省访问权限修饰符的成员
  • 不可以直接访问
    • 不同包中缺省访问权限修饰符的成员
    • private 修饰成员

子类初始化过程

  • 调用子类构造器之前一定会调用父类中可以被子类访问的构造器,完成父类字段初始化操作,隐式调用父类无参数构造器 super();(从该类所在继承树最顶层类的构造器开始执行)
  • 若父类没有可以被子类访问的无参数构造器,那么子类必须显式通过 super 语句调用父类带参数的构造器

super 关键字

定义

  • 代表当前对象的父类对象

作用

  • 在子类的构造方法中调用父类的指定构造器 super(name, age);(必须作为构造方法中的第一条语句)
  • 在子类中访问父类的被隐藏的实例变量或调用父类的被覆盖的实例方法 super.name super.fly();

方法覆盖 Override

作用

  • 解决子类继承父类之后,可能父类的某一个方法不满足子类的具体特征,此时需要重新在子类中定义该方法,并重写方法体

原则

  • 一同:实例方法签名必须相同
  • 两小
    • 子类方法的返回值类型和父类方法的返回类型相同或者是其子类
    • 子类方法声明抛出的异常类和父类方法声明抛出的异常类相同或者是其子类(运行时异常除外)
      • 子类方法中声明抛的异常小于或等于父类方法声明抛出异常类
      • 子类方法可以同时声明抛出多个属于父类方法声明抛出异常类的子类(子类也可以不声明抛出)
  • 一大:子类方法的访问权限比父类方法访问权限更大或相等(防止父类方法失传)

  • @Override 标签

注意

  • 书写方法覆盖直接拷贝父类的方法定义,修改方法体
  • 只有非 private、final 修饰的实例方法才有覆盖的概念
  • 隐藏:父类类方法、父类字段(字段名相同,不管类型)、本类字段(局部变量)
class SuperClass {
    public String name = "superClass.name";

    public static void info() {
    }
}

class SubClass extends SuperClass {
    public int name = 18; // 隐藏了父类的 name 字段

    public void work() {
        boolean name = false; //隐藏了本类中的 name 字段
        System.out.println(name); // false
        System.out.println(this.name); // 18
        System.out.println(super.name); //superClass.name
    }

    // 隐藏,不是方法覆盖
    public static void info() {
    }
}

组合(Composite)

  •  旧类对象 作为 新类的成员变量 组合进来,用以实现新类的功能
  • 在 类 B 中创建一个 类 A 类型的对象,通过该对象调用类 A 的方法
  • 组合表达的是“有(has-a)”的关系
public class OldClass {
    public void method() {
        System.out.println("旧类中的功能");
    }
}

public class NewClass {
    // 将旧类组合到新类,作为新类的一个组合成分
    private OldClass obj = new OldClass();
    // 重新定义自己的 method() 方法
    public void method() {
        // 直接复用 OldClass 提供的 method() 方法来实现自己的 method() 方法
        obj.method();
    }
}

public class CompositeDemo {
    public static void main(String[] args) {
        NewClass n = new NewClass();
        n.method();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是憧憬呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值