继承的详解

继承

ctr + h 能够看到各个类之间的继承关系(IDEA)

继承概念

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

多个类可以称为子类,单独这个类称为父类、超类或者基类。

子类可以直接访问父类中的非私有的属性和行为。

通过 extends 关键字让类与类之间产生继承关系。

class subDemo extends Demo{} // subDemo 继承 Demo

继承的特点

  1. Java 支持单继承不支持多继承
  2. Java 支持多重继承
class A{}
class B extends A{} // B继承A
class C extends B{} // C继承B会有A的特性
  1. java之类不支持访问父类的私有属性但是可以通过公共方法访问私有属性,其他修饰符均可自由访问。
  2. java中所有的类直接或者简介继承与object类

superthis 的区别

super是一个关键字,代表父类的存储空间标识。(可以理解为父亲的引用)提供了在子类中访问父类的关键字

super和this的用法相似。

this代表对象的引用(谁调用就代表谁);
super代表当前子类对父类的引用。

1.成员变量

this.变量    --    本类的
super.变量    --    父类的

2.构造方法

this(...)    --    本类的
super(...)    --    父类的

3.成员方法

this.方法名()    --    本类的    
super.方法名()    --    父类的

super()this() 调用无参构造不能同时调用

在Java中,superthis关键字在构造方法中有一些限制。其中一个限制是,在同一个构造方法中,不能同时使用super()this()来调用其他构造方法。

这是因为构造方法的调用必须是构造方法体内的第一条语句。当使用super()this()调用其他构造方法时,它们都必须作为构造方法体内的第一条语句。这是为了确保在创建对象之前,先初始化对象的状态。

如果在构造方法中同时使用了super()this(),就会导致两个调用语句之间存在冲突,无法确定调用哪个构造方法。这样会导致编译错误。

例如,下面的代码会导致编译错误:

public class MyClass {
    public MyClass() {
        super(); // 编译错误,super()和this()不能同时使用
        this(); // 编译错误,super()和this()不能同时使用
    }
}

如果需要在构造方法中同时使用super()this(),可以通过重载的方式来实现。

public class MyClass {
    public MyClass() {
        this(0); // 调用另一个构造方法
    }
    
    public MyClass(int value) {
        super(); // 调用父类的构造方法
        // 进行其他的初始化操作
    }
}

super()和this()的冲突详解

在Java中,this()super()之间的冲突主要涉及构造方法的调用顺序和构造方法体的第一条语句要求。

以下是冲突的主要方面:

  1. 构造方法调用顺序:当一个类的构造方法使用this()super()调用另一个构造方法时,构造方法的调用顺序变得非常重要。如果在构造方法中同时使用了this()super()来调用其他构造方法,会导致循环调用的问题,从而导致编译错误。

  2. 构造方法体的第一条语句:Java要求在构造方法中,构造方法体内的第一条语句必须是对其他构造方法的调用(使用this()super())。这是为了确保在创建对象之前,先初始化对象的状态。如果在构造方法体内的第一条语句之前有其他的代码,例如变量声明、赋值等,就会导致编译错误。

综合这两个方面,如果在同一个构造方法中同时使用了this()super(),会产生冲突,因为无法确定先调用哪个构造方法。这将违反了构造方法调用的顺序要求和构造方法体的第一条语句要求。

例如,考虑以下的类层级结构:

public class Parent {
    public Parent() {
        // ...
    }

    public Parent(int value) {
        // ...
    }
}

public class Child extends Parent {
    public Child() {
        this(0); // 编译错误,this()和super()冲突
        super(); // 编译错误,this()和super()冲突
    }

    public Child(int value) {
        super(value); // 正确,调用父类构造方法
    }
}

在上述示例中,子类Child的构造方法中同时使用了this()super(),这将导致编译错误。为了解决这个冲突,可以选择只使用this()super()来调用其他构造方法,或者通过重载构造方法来处理。

需要遵循Java的构造方法调用规则,确保构造方法的调用顺序和构造方法体内的第一条语句的要求,以避免this()super()之间的冲突。

在上述示例中,通过重载构造方法,使得在无参构造方法中通过this(0)调用另一个构造方法,然后在另一个构造方法中通过super()调用父类的构造方法。

需要注意的是,在使用super()this()调用其他构造方法时,需要遵循语法规则,确保调用语句作为构造方法体内的第一条语句。这样可以保证对象的状态得到正确的初始化。

java类的方法重写

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值