为什么this和super不能同时出现在一个构造函数里面?

问题描述

为什么this和super不能同时出现在一个构造函数里面?class A{ A() { System.out.println("A"); } }class B extends A{ B() { // super(); //error this(3); System.out.println("B"); } B(int x) { System.out.println("B2"); } public static void main(String[] args) { B a=new B(); }}关于this,super不是很理解。。就像上面那个例子。问1:不是每个构造函数默认第一条语句都是调用super么?反正默认也是加上,可是我加了super()以后反而会出错。。。不加没事。问2:是不是所有构造函数里面第一条语句都会调用super?还是只要一个构造函数调用一个super()其它的就不在调用了?如果按照上面的运行。我想是否应该是 先运行B()中默认的super(),这样,要先执行一次A()中的System语句,然后在回到B()中,继续运行this(3),在进入B(int x)进入后在B(int x)中在默认运行super(),在回到B()中。。。那么输出应该是 A A B2 B可是结果输出却是 A B2 B这好像说明super()只运行了一次。。那么是说this(3)中的super()没有运行么?是不是不管子类有多少个构造方法,但调用super只调用一次?谢谢,麻烦不忙时候讲讲

解决方案

简单解释:其实构造函数也是一个链条一样的东西,会调用最上面的那层钩子,然后依次不重复的往下。每个构造函数虽然原理是先调用super,但是当构造函数形成一个链条的时候,不会每次去调用,就和js的原型差不多。 之所以你的super放在哪里不对的原因是,编译器认为,你既然调用了this(3)这个构造器,那么这个构造器肯定会找到你的super并且调用,那么你在这里调用super是想迫使它调用两次父类的构造器,根据我上面的那个原理,是不成立的,所以编译不通过。 欢迎采纳,不懂的可以联系我。
解决方案二:
我已经给你回信了 你仔细看一下咯。
解决方案三:
B a=new B(); 当这样new一个a的时候 B() { -- super(); //默认的调用父类的构造函数 this(3); //这个地方不会再去掉父类的构造函数啊可以通俗的理解,这个只是调用本类的一个方法,与父类无关,不知道可不可以这样通俗理解 System.out.println("B"); }
解决方案四:
1.this和super的调用都必须是放第一句,所以不能同时调用,会冲突、、、只能选一个
解决方案五:
因为this()里面还会调用(显式或者隐式调用)一次super(),如果允许,就会导致不容易发现的问题,如赋值被覆盖等等
解决方案六:
构造函数中第一条语句可以调用父类的构造函数或本身的其它构造函数,但只能调用一个;如果构造函数中没有显性的调用其它构造函数,编译器会在构造函数中默认加上super()。你的例子中,B()中第一条语句调用了自身的B(3),B(3)中编译器默认加上了super(),于是结果就是A B2 B

时间: 2024-07-30 09:48:12

为什么this和super不能同时出现在一个构造函数里面?的相关文章

Java 关键字super和this的使用及区别

"this",作为一个特殊的关键字,它的规则如下: 1.可以表示构造函数传递.this(a,b)表示调用另外一个构造函数.这里面的this就是一个特殊语法,不是变量,没有什么类型.  2.可以在一个类的非static成员内部使用,表示当前这个对象.此时,this就是一个final的普通变量,它有静态类型,就是这个类本身:它有动态类型,就是当前这个对象的类型.你可以对它调用成员函数,把它传递给别的函数等. "super"和"this"类似,但是也有

Java中this和super的用法总结

这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this的用法在java中大体可以分为3种: 1.普通的直接引用 这种就不用讲了,this相当于是指向当前对象本身. 2.形参与成员名字重名,用this来区分: class Person { private int age = 10; public Person(){ 运行结果: 初始化年龄:10 Harr

Java中super的使用

一.super调用超类构造函数 super(parameter-list): parameter-list指定超类中构造函数所需的任何形参,super()必须是在子类构造函数中执行的第一个语句.超类定义的任何形式的构造函数都可以被super()调用,被执行的构造函数就是与实参相匹配的那一个. 当存在多重继承时,super总是引用最靠近的超类的构造函数.例如:C类继承B类,B类继承A类,则C类的构造函数中使用super,引用B类的构造函数. 如果不使用super(),那么就会执行每个超类的默认(无

Java中的super和this

        1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)         2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)         3)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名    super.成员函数据名(实参)        4)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来

Java中this()和super()的注意点

使用super和this应该注意这些: 1)调用super()必须写在子类构造方法的第一行,否则编译不通过.每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错. 2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法. 3)super()和this()均需放在构造方法内第一行. 4)尽管可以用this调用一个构造器,但却不能调用两个. 5)this和super不能同时

详解Java中super的几种用法并与this的区别_java

1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 复制代码 代码如下: class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { Checket() { super();//调用父类的构造方法,一定要放在方法的首个语句 System.out.println("Checket"); }   public static v

JAVA拾遗录

本系列博文主要收录Java中一些常见的但是平常又容易忘记.记错或者记混的知识点的集合.各个知识点之间没有必然的联系,可以随意跳着看,希望能够对各位同学有所帮助. 本博文持续更新.修改,转载请保留原文链接. 1. JAVA堆和栈的区别 堆和栈都是内存的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存.众所周知,所有的JAVA程序都运行在JVM上,这里所说的自然是JVM中的堆和栈. 最主要的区别就是栈内存用来存储局部变量和方法调用.而堆内存用来存储Java中的对象.无论是成员变量,局部变

Java之关于super的用法

 昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识.还是把它写下来,为大家更好的认识提供一点思路. 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建属性的初始化,这样在一个构造函数中调用另外一个构造函数,可以避免重复的代码量,减少工作量: 2)在一个构造函数中调用另外一个构造函数的时候应该用的是同一块内存空间,在默认的构造函数中先初始化变量,调用另一个的时候覆写已经初始化的变量的值: 3)整个调用的过程和递归调用函数有点类似,不断充

解析java中super的用法分析_java

昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识.还是把它写下来,为大家更好的认识提供一点思路.1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建属性的初始化,这样在一个构造函数中调用另外一个构造函数,可以避免重复的代码量,减少工作量:2)在一个构造函数中调用另外一个构造函数的时候应该用的是同一块内存空间,在默认的构造函数中先初始化变量,调用另一个的时候覆写已经初始化的变量的值:3)整个调用的过程和递归调用函数有点类似,不断充气球,直