在java中使用this和super()

时间:2017-06-13 05:26:08

标签: java

我想知道以下代码中thissuper做了什么。我知道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?有效地将idA的值设置为42?

-Does super.finalize()将垃圾收集器调用到超类A

3 个答案:

答案 0 :(得分:0)

这里是对呼叫序列的解释:

  1. new B()调用类B的无参数构造函数,该构造函数调用
  2. this(42),类int的一个B参数构造函数,传入42作为参数,调用
  3. super(id),类int的一个A参数构造函数,传入42作为参数,调用
  4. super(),类Object的无参数构造函数。
  5. 班级A的构造函数使用A.id初始化42
  6. 所有构造函数都按照与调用它们相反的顺序将奇特的字符串打印到控制台。

答案 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

提示:当您看到Bthis(...)时,只需找到它们所指的构造函数,并将其替换为构造函数所说的内容。例如:

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构造函数。