继承
ctr + h 能够看到各个类之间的继承关系(IDEA)
继承概念
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
多个类可以称为子类,单独这个类称为父类、超类或者基类。
子类可以直接访问父类中的非私有的属性和行为。
通过 extends 关键字让类与类之间产生继承关系。
class subDemo extends Demo{} // subDemo 继承 Demo
继承的特点
- Java 支持单继承不支持多继承
- Java 支持多重继承
class A{}
class B extends A{} // B继承A
class C extends B{} // C继承B会有A的特性
- java之类不支持访问父类的私有属性但是可以通过公共方法访问私有属性,其他修饰符均可自由访问。
- java中所有的类直接或者简介继承与object类
super
和 this
的区别
super是一个关键字,代表父类的存储空间标识。(可以理解为父亲的引用)提供了在子类中访问父类的关键字
super和this的用法相似。
this代表对象的引用(谁调用就代表谁);
super代表当前子类对父类的引用。
1.成员变量
this.变量 -- 本类的
super.变量 -- 父类的
2.构造方法
this(...) -- 本类的
super(...) -- 父类的
3.成员方法
this.方法名() -- 本类的
super.方法名() -- 父类的
super()
和this()
调用无参构造不能同时调用
在Java中,super
和this
关键字在构造方法中有一些限制。其中一个限制是,在同一个构造方法中,不能同时使用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()
之间的冲突主要涉及构造方法的调用顺序和构造方法体的第一条语句要求。
以下是冲突的主要方面:
-
构造方法调用顺序:当一个类的构造方法使用
this()
或super()
调用另一个构造方法时,构造方法的调用顺序变得非常重要。如果在构造方法中同时使用了this()
和super()
来调用其他构造方法,会导致循环调用的问题,从而导致编译错误。 -
构造方法体的第一条语句: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()
调用其他构造方法时,需要遵循语法规则,确保调用语句作为构造方法体内的第一条语句。这样可以保证对象的状态得到正确的初始化。