this() 必须写在构造器的第一行!(因为在构造器之前是没有对象的):这句话应该怎么理解?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了this() 必须写在构造器的第一行!(因为在构造器之前是没有对象的):这句话应该怎么理解?相关的知识,希望对你有一定的参考价值。

如果两个类之间发生了继承关系,那么在实例化子类的时候,JVM隐式的会为我们创建一个父类对象,子类的构造器会调用父类的构造器(super()),先实例化父类对象,然后再实例化子类对象,此时父类中的this就是子类对象;如果是直接实例化的父类对象,那么父类构造器中的this就是父类对象,先实例化父类对象,然后再实例化子类对象(子类中的this),然后调用子类构造器,在子类构造器中调用父类构造器(子类中的super)。
"因为在构造器之前是没有对象的",这句话体现在哪呢?
但是this()必须放在第一行,是因为在构造器之前是没有对象,为什么是这样解释的呢?

终上所述,这两个问题可以这样理解:构造器之前确实是没有对象的,但构造器里面是可以产生对象的,当你new对象的时候this()或者super()就要起作用了,而且必须是第一时间起作用,可以看出其实this()和super()的作用就是实例化对象。仔细阅读上面的总结你会发现,是实例化产生对象之后才能调用构造器,所以必须把this()或者super()放在第一行,实例化产生对象之后,才能执行构造器第二行,第三行的内容。
希望可以帮到你!
假期愉快&新年快乐!
参考技术A this() super()
是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。

为什么要在第一排呢?
example:
class A
A()
System.out.println("You call super class non-args constructor!");


class B extends A
B()
//这里,编译器将自动加上 super();
System.out.println("You call subclass constructor!");

B(int c)
System.out.println("wrong,wrong");

B(String n)
这里为空 // super();
System.out.println("想想就是这样");
this();
//实际就是调用了B()...,而B()...已经调用过一次,super();所以super()就被调用两次,也就是对A进行了两次初始化。而在实例化一个对象时,一 个 构造方法只能调用一次,这然显然是不对的.


B(double c)
this();
this(3);
//这里实际上也是调用两次super(),也就是对A进行两次初始化,所以其结果也不对



注:任意一个类,它都一定有父类,如果你没有建立该类的父类,那么该类的父类为Object;追问

"因为在构造器之前是没有对象的",这句话体现在哪呢?

追答

产生对象 一般都是通过构造器啊
也就是
A a = new A();

追问

通过构造器产生对象我也是理解的!
但是this()必须放在第一行,是因为在构造器之前是没有对象,为什么是这样解释的呢?
我最不明白就是这里!

本回答被提问者和网友采纳

在java中this和super的使用

在java中this和super的使用

this的使用

1.this使用在本身的调用类中,可以调用本类的构造方法、方法和属性。
2. 当使用this来调用本类的构造方法时,this只能放在构造方法的第一句。

super的使用

1.super调用的是父类的构造方法,必须在子类构造方法的第一行,如果子类没写,默认调用父类无参构造,即第一行:super();
2.super只能用在子类的方法或者构造方法中。
3.当super和this调用构造方法时都需要放在构造方法的第一行,所以不能同时使用。

this和super的区别

1.this代表本身调用者对象,super代表本身调用者的父类对象
2.this可以直接在本身对象中使用,super只能在发生调用时在本身对象即子类对象中使用。
3.this()代表的本类无参构造,super()代表的是父类无参构造。

如:

public class Person {//父类
    String name = "yyq";//属性

    public Person() {//无参构造
        System.out.println("调用Person的无参构造器");
    }

    public void print(){//普通方法
       System.out.println("Person");
   }
}
public class Student extends Person {//子类继承上面的父类
     String name = "fool";//属性
    public Student() {//无参构造 这里虽然没写super()但是相当于在第一行写了super()
        //super();
        System.out.println("调用Student的无参构造器");
    }
    public void print(){
        System.out.println("Student");
    }
    public void test2(){//测试普通方法的方法
        print();
        this.print();	//调用本类的print()
        super.print();	//调用父类的print()
    }
    public void test(String name){//测试参数
        System.out.println(name); //调用形参
        System.out.println(this.name);//调用本类name
        System.out.println(super.name);//调用父类name
    }

技术图片

IDEA快捷键积累:ctrl + h 树形的展示当前类的子父类

以上是关于this() 必须写在构造器的第一行!(因为在构造器之前是没有对象的):这句话应该怎么理解?的主要内容,如果未能解决你的问题,请参考以下文章

this与super的区别

Java基础

Java中this关键字在构造方法中的使用

继承中的构造方法

Java基础——this构造器转发 & 实例块静态块

super详解