我想知道以下代码中this
和super
做了什么。我知道this
引用当前对象,super
用于调用重写方法以及调用超类构造函数。但我无法弄清楚以下代码在执行类C
时的作用。
public class A {
public A(int id) {
super();
this.id = id;
System.out.println("A created");
}
private int id = 0;
@Override protected void finalize() throws Throwable {
System.out.println("A finalised");
super.finalize();
}
}
public class B extends A {
public B(int id) {
super(id);
System.out.println("B created");
}
public B() {
this(42);
System.out.println("B created with default id 42");
}
@Override protected void finalize() throws Throwable {
System.out.println("B finalised");
super.finalize();
}
}
public class C {
public static void main(String[] args) throws Exception{
new B();
System.gc();
Thread.sleep(1000);
}
}
我主要是指this(42)
课程中的super(id)
,super.finalize()
和B
- this(42)
是否意味着B
使用值42进行实例化,并将A
ID设置为42?
-Does super(id)
将B
实例化的值传递给它的超类A
?有效地将id
中A
的值设置为42?
-Does super.finalize()
将垃圾收集器调用到超类A
?
答案 0 :(得分:0)
这里是对呼叫序列的解释:
new B()
调用类B
的无参数构造函数,该构造函数调用this(42)
,类int
的一个B
参数构造函数,传入42
作为参数,调用super(id)
,类int
的一个A
参数构造函数,传入42
作为参数,调用super()
,类Object
的无参数构造函数。A
的构造函数使用A.id
初始化42
。答案 1 :(得分:0)
this(42)
是否意味着B使用值42进行实例化,并将A
id
设置为42?super(id)是否将B实例化的任何值传递给它的超类A?有效地将A中的id值设置为42?
这是部分正确的。 B
实例化了值42,但从技术上讲,它将B
' s id
设置为42.您从未创建{{1}对象。继承导致超类中的所有内容都被复制了#34;对于派生类,从技术上讲,它是A
对象的id
。
提示:当您看到B
或this(...)
时,只需找到它们所指的构造函数,并将其替换为构造函数所说的内容。例如:
super(...)
变成:
public B() {
this(42);
System.out.println("B created with default id 42");
}
然后变成:
public B() {
super(42); <-- replaced this(42)
System.out.println("B created"); <-- replaced this(42)
System.out.println("B created with default id 42");
}
现在你看到到底发生了什么。
super.finalize()是否将垃圾收集器调用到超类A?
你真的不需要自己打电话给public B() {
super(); <---\
this.id = 42; <---|
System.out.println("A created");<---|-----replaced super(42)
System.out.println("B created");<---/
System.out.println("B created with default id 42");
}
,JVM会为你做。 GC不是可以调用的东西。它只是查找没有引用它的对象,并在任意时间全部收集它们。
答案 2 :(得分:0)
首先你应该知道这个和超级的
的此强>:
1)这总是指当前的类对象
2)我们可以用它来调用相同的类构造函数
3)我们可以用它来调用相同的类方法
4)如果它们具有相同的名称,则用于区分本地变量和类的实例变量。
<强>超强>:
1)super总是从子类中引用超类对象
2)我们可以使用super来调用超类构造函数
3)我们可以用super来调用超类方法
4)超级用于引用超类成员,如果他们在子类中有访问权限。
现在回答你的问题,你已经问过了
B类中的this(42), super(id)
和super.finalize()
注意:您只能从构造函数调用this()调用或super()调用。因为this和super调用都应该是构造函数的第一个语句。所以你只能使用一个这个电话或超级电话。
this(42) :
指的是在您的情况下采用单个参数的同一个类构造函数,它是int
类型。因此,如果你调用new B()
它将转到B类没有arg构造函数,那么你已经写了this(42)
所以它将调用B类构造函数,它接受单个参数。
super(id) :
类似地,您调用了super(id),因此它将调用超类构造函数,该构造函数接受该类型的单个参数。如果不存在则会抛出错误。
注意:如果你没有写这个调用,那么默认情况下super()
将在构造函数中调用超级调用。所以它将调用超类的no arg构造函数。