欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

super和this的区别以及注意事项

程序员文章站 2022-05-20 10:33:50
...

super和this的区别

区别

- 代表的对象不同

this:本身调用这个对象

super:代表父类对象的应用

- 前提不同

this:没有继承也能使用

super:只有在继承的条件下才能使用

- 构造方法不同

this():本类的构造

super():父类的构造

super注意点

1. super调用父类的构造方法,必须在构造方法的第一个

首先创建一个父类Person和子类Student,并分别添加参数为空的构造方法。

//父类Person
public class Person {
    public Person()
    {
        System.out.println("父类的构造方法");
    }
}

//子类Student
public class Student extends Person{

    public Student()
    {
        System.out.println("子类的构造方法");
    }
}

然后实例化子类Student对象

public class Demo1 {
    public static void main(String[] args) {
        Student s = new Student();
    }
}

查看测试结果:

super和this的区别以及注意事项

可以看到在实例化了子类以后,父类的构造方法也执行了,这说明父类构造方法在子类构造方法之前就已经执行,可以理解为隐式调用了super()语句,类似于下方的代码:

//子类Student
public class Student extends Person{

    public Student()
    {
        super();  //在子类构造方法执行前,隐式的调用父类的构造方法
        System.out.println("子类的构造方法");
    }
}	

但是如果将上述的super ()调到输出语句的下方就会报错:

super和this的区别以及注意事项

错误提示说明父类的构造方法只能是构造方法的第一个。

同样的,如果我们将父类的构造方法改为有参构造,如果子类想调用此构造方法那么就必须显式调用,否则系统还是会默认调用父类的无参构造方法:

首先我们看看子类在显式调用了父类的有参构造方法后:

//父类Person
public class Person {
    public Person()
    {
        System.out.println("父类的构造方法");
    }
    public Person(String name) //声明父类的有参构造方法
    {
        System.out.println(name);
    }
}

//子类Student
public class Student extends Person{

    public Student()
    {
        super("Test");//子类在显式调用父类的有参构造方法

        System.out.println("子类的构造方法");
    }
}

测试结果:

super和this的区别以及注意事项

将super(“Test”)注释以后:

    public Student()
    {
        //super("Test");//子类在显式调用父类的有参构造方法
        System.out.println("子类的构造方法");
    }

测试结果:

super和this的区别以及注意事项

2. super必须只能出现在子类的方法或者构造方法中
3. super和this不能同时调用构造方法

如果看懂了以上的代码这一点就很好理解,因为this()和super()一样,都必须在构造方法的第一行,如果在同一个构造方法中同时调用这两个方法就会出现冲突,所以它们不能同时调用构造方法。

上一篇: 多态

下一篇: 重写