0 0

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

为什么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只调用一次?

谢谢,麻烦不忙时候讲讲
OO 
2011年8月23日 21:07

6个答案 按时间排序 按投票排序

0 0

采纳的答案

简单解释:其实构造函数也是一个链条一样的东西,会调用最上面的那层钩子,然后依次不重复的往下。每个构造函数虽然原理是先调用super,但是当构造函数形成一个链条的时候,不会每次去调用,就和js的原型差不多。

之所以你的super放在哪里不对的原因是,编译器认为,你既然调用了this(3)这个构造器,那么这个构造器肯定会找到你的super并且调用,那么你在这里调用super是想迫使它调用两次父类的构造器,根据我上面的那个原理,是不成立的,所以编译不通过。

  欢迎采纳,不懂的可以联系我。

2011年8月23日 22:46
0 0

我已经给你回信了 你仔细看一下咯。

2011年8月24日 09:25
0 0

  B a=new B(); 
当这样new一个a的时候
  B() 
  { 
  -- super(); //默认的调用父类的构造函数 
  this(3); //这个地方不会再去掉父类的构造函数啊可以通俗的理解,这个只是调用本类的一个方法,与父类无关,不知道可不可以这样通俗理解
  System.out.println("B");   
  } 

2011年8月23日 23:43
0 0

1.this和super的调用都必须是放第一句,所以不能同时调用,会冲突、、、只能选一个

2011年8月23日 23:14
0 0

因为this()里面还会调用(显式或者隐式调用)一次super(),如果允许,就会导致不容易发现的问题,如赋值被覆盖等等

2011年8月23日 21:29
0 0

构造函数中第一条语句可以调用父类的构造函数或本身的其它构造函数,但只能调用一个;
如果构造函数中没有显性的调用其它构造函数,编译器会在构造函数中默认加上super()。

你的例子中,B()中第一条语句调用了自身的B(3),B(3)中编译器默认加上了super(),于是结果就是A  B2 B

2011年8月23日 21:25

相关推荐

    18_构造函数 视频

    例如,一个构造函数可以调用另一个具有不同参数的构造函数,通过`this(参数列表)`来实现。 在Java中,我们还可以使用构造函数的引用来创建对象。例如,通过`new 类名(参数列表)`,可以调用匹配的构造函数并创建一个...

    Java中this与super的区别

    super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。 this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。 要记住的几个关键点是: 在构造方法中this...

    Java中两个非常特殊的变量:this和super

    另外,`this`还可以用于在构造函数之间进行调用,特别是当一个构造函数需要调用另一个带有不同参数的构造函数时。例如: ```java class UserInfo { String userName; int userNumber; public UserInfo(String ...

    Java中的this和super的用法 

    1. super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 在 Java 中,super 关键字用于访问父类中的成员变量和方法。当我们想要访问父类中的某个成员变量或方法时,我们可以使用 super ...

    枚举类型与构造函数.doc

    在上面的代码中,我们使用了两个构造函数来实例化ming对象,第一个构造函数没有参数,第二个构造函数有两个参数likes和hope。 在子类中,我们可以使用super关键字来调用父类的构造函数,例如: ```java public ming...

    js定义类 对象 构造函数,类的继承

    在JavaScript中,类(Class)、对象(Object)和构造函数(Constructor)是面向对象编程的基础。这篇文章将深入探讨这三个概念,以及如何实现类的继承。 首先,让我们理解什么是JavaScript中的对象。在JavaScript中...

    14_构造函数 视频

    6. **构造函数与final字段**:对于声明为`final`的成员变量,必须在构造函数中或者在声明时初始化,因为`final`变量一旦赋值后就不能再改变。 7. **构造函数与static字段**:静态字段属于类,不属于类的任何实例,...

    Java中this与super的用法

    在上面的代码中,我们使用 this 关键字来调用当前对象的另一个构造函数。 现在,让我们来看一下 super 关键字。super 关键字是用来访问父类的成员变量或方法的。例如: ```java public class Person { public int...

    this和super

    在 Java 编程语言中,`this` 和 `super` 是两个非常重要的关键字,它们都是特殊的引用变量,用于处理对象间的关系。下面我们将详细讲解这两个关键字的用途、使用场景以及如何在实际编程中有效地利用它们。 一、`...

    java中this与super用法

    在上面的例子中,this(2, 0) 调用了另一个构造函数的方法。 super 用法 super 用在构造函数时要放在第一行,相当于调用 super 刷新了构造函数。super.g() 调用的成员引用当前对象的直接父类中的成员(用来访问直接...

    Java中static、this、super、final用法简谈

    Java中的`static`、`this`、`super`和`final`是四个非常重要的关键字,它们在编程中扮演着至关重要的角色。这篇文章将简要介绍这些关键字的基本用法及其应用场景。 1. **static** `static`关键字用于声明类级别的...

    Java:构造函数与对象

    例如,假设我们有一个名为`Car`的类,用于表示汽车,那么我们可以为这个类定义一个构造函数,以接收汽车的基本属性,如制造商(make)、型号(model)和生产年份(year),并将这些属性的值赋给相应的实例变量。...

    Java语言基础入门教程 Java实训教程 4.类构造函数-this-静态属性方法-instanceof运算符共55页.pptx

    - 在构造函数中可以通过`this`关键字调用其他构造函数,通过`super`调用父类构造函数。 - 调用其他构造函数时,必须首先调用该构造函数,然后再定义本构造函数的主体部分。 #### 三、`this`关键字 `this`关键字...

    java中this/super用法

    在同一个类中,如果存在多个构造函数,可以通过 `this()` 来调用另一个构造函数,传递参数进行初始化。 - 在非静态方法中,`this` 默认代表当前对象实例,通常在没有歧义的情况下,可以省略不写。 2. `super` ...

    在Java中有两个非常特殊的关键词: this和super

    this和super ,这两个变量在使用前都是不需要声明的.this变量使用在一个成员函数的内部,指向当前对象,当前对象指的是调用当前正在执行方法的那个对象.super变量是直接指向超类的构造函数,用来引用超类中的变量和方法....

    Java中this、super用法.pdf

    例如,如果`Person`类有一个带参数的构造函数,子类`DemoSuper`在自己的构造函数中需要通过`super(name, age)`来调用父类的构造器,传递必要的参数。 总结来说,`this`和`super`是Java中用来处理对象和继承的关键...

    java中this&super的区别.txt

    - 在一个类的构造函数中,可以使用`this`来调用同一个类中的另一个构造函数,实现代码复用。 - 示例:在`Chinese`类中,`Chinese(String name, int age)`构造函数通过`this(name);`调用了`Chinese(String name)`...

    Java中static、this、super、final用途

    - **构造函数链**:在构造函数中,可以使用`this()`调用同一类中的另一个构造函数,简化代码。 ### 3. `super` `super`关键字用于访问和调用父类的成员。它与`this`相对,但用于访问超类(父类)的属性和方法。...

Global site tag (gtag.js) - Google Analytics