java继承,super关键字,方法的重写

本文介绍了Java中的继承机制,包括其目的、语法、优点(提高代码复用和扩展性)、注意事项(访问权限、构造器调用和方法重写),以及如何正确使用`super`和`this`关键字。
摘要由CSDN通过智能技术生成

继承

为什么需要继承

继承可以解决代码复用,让我们的编程更加靠近人类思维. 当多个类存在相同的属性(变量)和方法时,可以从这些类中 抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来声明继承父类即可

语法

class 子类 extends 父类{
    
}
  1. 子类就会自动拥有父类定义的属性和方法。

  2. 父类又叫超类,基类。

  3. 子类又叫派生类。

继承的好处

  1. 代码的复用性提高了

  2. 代码的扩展性和维护性提高了

继承的注意事项

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问

  2. 子类必须调用父类的构造器, 完成父类的初始化

  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,即默认有super();如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过

  4. 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)

  5. super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)

  6. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器

  7. Java 所有类都是 Object 类的子类, Object 是所有类的基类.

  8. 父类构造器的调用不限于直接父类! 将一直往上追溯直到 Object 类(顶级父类)

    1. 子类在调用父类属性时,会一直往上找,直至找到,中途找到该属性且不可访问,就会停止寻找,并报错

  9. 子类最多只能继承一个父类(指直接继承) ,即Java 中是单继承机制。

    1. 如何让 A 类继承 B 类和 C 类?

      可以让A 继承 B , B 继承 C

  10. 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系

    1. Cat extends Person x

    2. Cat extends Animal √

练习题

题目一

class A {
    A() {
        System.out.println("a");
    }
    A(String name) {
        System.out.println(" a name");
    }
}
​
class B extends A {
    B() {
        this(" abc");
        System.out.println("b");
    }
    B(String name) {
        System.out.println("b name");
    }
}
​

在main中: B b=new B();会输出什么? 答案: a b name b

题目二

class A {//A 类
    public A() {
        System.out.println("我是 A 类");
    }
​
    public static void main(String[] args) {
        C c =new C();
    }
}
​
class B extends A { //B 类,继承 A 类
    public B() {
        System.out.println("我是 B 类的无参构造");
    }
​
    public B(String name) {
        System.out.println(name + "我是 B 类的有参构造");
    }
}
​
class C extends B {//C 类,继承 B 类
    public C() {
        this("hello");
        System.out.println("我是 c 类的无参构造");
    }
​
    public C(String name) {
        super("hahaha");
        System.out.println("我是 c 类的有参构造");
    }
}

在main中: C c =new C();会输出什么内容?

答案:我是 A 类 hahaha我是 B 类的有参构造 我是 c 类的有参构造 我是 c 类的无参构造

super关键字

基本介绍

super 代表父类的引用,用于访问父类的属性、方法、构造器

基本语法

  1. 访问父类的属性,但不能访问父类的private属性 super.属性名;

  2. 2.访问父类的方法,不能访问父类的private方法 super.方法名(参数列表);

  3. 访问父类的构造器(这点前面用过): super(参数列表);

    1. 只能放在构造器的第一句,只能出现一句!

注意事项

  1. 调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)

  2. 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super、this、 直接访问是一样的效果!

  3. super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则。A-> B->C,当然也需要遵守访问权限的相关规则

super 和 this 的比较

No.区别点thissuper
1访问属性访问本类中的属性,如果本类没有此属性则从父类中继续查找从父类开始查找属性
2调用方法访问本类中的方法,如果本类没有此方法则从父类继续查找从父类开始查找方法
3调用构造器调用本类构造器,必须放在类构造器的首行调用父类构造器,必须放在子构造器的首行
4特殊表示当前对象子类中访问父类对象

this访问属性和调用方法

  1. 先找本类,如果有,则调用

  2. 如果没有,则找父类(如果有,并可以调用,则调用)(super直接从这里开始)

  3. 如果父类没有,则继续找父类的父类,整个规则,就是一样的,直到Object类

    1. 提示:如果查找方法的过程中,找到了,但是不能访问,则报错,cannot access

    2. 如果查找方法的过程中,没有找到,则提示方法不存在

方法重写/覆盖(override)

基本介绍

简单的说:方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法

注意事项

方法重写也叫方法覆盖,需要满足下面的条件

  1. 子类方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样。

  2. 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类。比如父类返回类型是Object ,子类方法返回类型是String

  3. 子类方法不能缩小父类方法的访问权限 。public > protected >默认> private

方法的重写和重载比较

名称发生范围方法名形参列表返回类型修饰符
重载(overload)本类必须一样类型,个数或者顺序至少有一个不同无要求无要求
重写(override)父子类必须一样相同子类重写的方法,返回的类型和父类的一致,或者是其子类子类方法不能缩小父类方法的访问范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值