Java中的super()

Moh*_*han 215 java super

super()用来调用父类的构造?请解释一下super().

pak*_*ore 257

super() 调用没有参数的父构造函数.

它也可以用于参数.即super(argument1)它将调用接受类型argument1(如果存在)的1个参数的构造函数.

它也可用于从父级调用方法.即super.aMethod()

更多信息和教程在这里

  • 注意:在第一种情况下,父类必须有一个无参数构造函数,否则会抛出编译错误. (8认同)
  • @VivekChavda,确保一个孩子*可以*成为父母,就像学生可以成为一名教师一样.但我认为你理解与Animal相比的差异 - > Dog.狗必然是动物.父/子通常是**有*关系("父母*有*孩子"),而动物/狗是*"是"*关系.见http://aioo.be/2016/06/29/a-child-is-not-always-a-parent.html (2认同)
  • @ AaronFranke,*“在哪里可以使用super?是否有限制?” *-是的,`super(...)`只能用作构造函数中的第一条语句。 (2认同)

Sim*_*tes 151

一些事实:

  1. super() 用于调用直接父级.
  2. super() 可以与实例成员一起使用,即实例变量和实例方法.
  3. super() 可以在构造函数中用于调用父类的构造函数.

好的,现在让我们实际上实现这些要点super().

查看程序1和2之间的区别.这里,程序2证明了我们super()在Java中的第一个语句.

计划1

class Base
{
    int a = 100;
}

class Sup1 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(a);
        System.out.println(a);
    }
    public static void main(String[] args)
    {
        new Sup1().Show();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

200
200

现在查看程序2并尝试找出主要区别.

计划2

class Base
{
    int a = 100;
}

class Sup2 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(super.a);
        System.out.println(a);
    }
    public static void main(String[] args)
    {
        new Sup2().Show();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

100
200

在程序1中,输出仅是派生类.它无法打印基类和父类的变量.但是在程序2中,我们在打印输出时使用super()变量a,而不是打印a派生类的变量值,而是打印a基类变量的值.因此,它证明super()用于呼叫直接父母.

好的,现在查看程序3和程序4之间的区别.

计划3

class Base
{
    int a = 100;
    void Show()
    {
        System.out.println(a);
    }
}

class Sup3 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(a);
    }
    public static void Main(String[] args)
    {
        new Sup3().Show();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

200

这里的输出是200.当我们调用时Show(),调用Show()派生类的函数.但是如果我们想要调用Show()父类的函数,我们应该怎么做?查看程序4以获得解决方案.

计划4

class Base
{
    int a = 100;
    void Show()
    {
        System.out.println(a);
    }
}

class Sup4 extends Base
{
    int a = 200;
    void Show()
    {
        super.Show();
        System.out.println(a);
    }
    public static void Main(String[] args)
    {
        new Sup4().Show();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

100
200

这里我们得到两个输出,100和200.当Show()调用派生类的函数时,它首先调用Show()父类的Show()函数,因为在派生类的函数内部,我们Show()通过put函数调用父类的函数super函数名前的关键字.

  • 你为什么不缩进你的源代码示例?有具体原因吗? (4认同)
  • `super()`不是关键字.它是一个构造函数调用.`super`是一个关键字,#1和#2只对该定义有意义. (2认同)

aio*_*obe 36

是.super(...)将调用超类的构造函数.

看看这个例子:

class Animal {
    public Animal(String arg) {
        System.out.println("Constructing an animal: " + arg);
    }
}

class Dog extends Animal {
    public Dog() {
        super("From Dog constructor");
        System.out.println("Constructing a dog.");
    }
}

public class Test {
    public static void main(String[] a) {
        new Dog();
    }
}
Run Code Online (Sandbox Code Playgroud)

打印:

Constructing an animal: From Dog constructor
Constructing a dog.
Run Code Online (Sandbox Code Playgroud)


Hei*_*nzi 28

是否使用super()来调用父构造函数?

是.

请解释一下Super().

super()是一个特殊用途的super关键字,您可以调用无参数的父构造函数.通常,super关键字可用于调用重写方法,访问隐藏字段或调用超类的构造函数.

这是官方教程

  • `super()`用于调用父构造函数,`super.myMethod()`用于调用重写方法. (5认同)
  • 我不认为super()用于调用基类方法.你可以使用super.method(). (3认同)
  • @seanizer或超类的任何其他方法(包括静态),如果它在范围内.super只是对您的基类的引用. (2认同)

Rol*_*lig 7

调用无参数超级构造函数只是浪费屏幕空间和程序员时间.无论你是否编写代码,编译器都会生成完全相同的代码.

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 6

是,super()(小写)调用父类的构造函数.您可以包含参数:super(foo, bar)

还有一个super关键字,您可以在方法中使用它来调用超类的方法

一个快速的谷歌"Java超级"导致这一点