super()用于调用父构造函数吗? 请解释super()。
当前回答
还有其他一些用途。
引用继承接口的默认方法:
import java.util.Collection;
import java.util.stream.Stream;
public interface SkipFirstCollection<E> extends Collection<E> {
@Override
default Stream<E> stream() {
return Collection.super.stream().skip(1);
}
}
还有一种很少使用的情况,在实例化静态子类时,使用限定的超类为超类构造函数提供一个外部实例:
public class OuterInstance {
public static class ClassA {
final String name;
public ClassA(String name) {
this.name = name;
}
public class ClassB {
public String getAName() {
return ClassA.this.name;
}
}
}
public static class ClassC extends ClassA.ClassB {
public ClassC(ClassA a) {
a.super();
}
}
public static void main(String[] args) {
final ClassA a = new ClassA("jeff");
final ClassC c = new ClassC(a);
System.out.println(c.getAName());
}
}
然后:
$ javac OuterInstance.java && java OuterInstance
jeff
其他回答
如前所述,在默认构造函数内部,在构造函数的第一行调用隐式super()。
这个super()自动调用从类层次结构顶部开始的构造函数链,并向下移动层次结构。
如果程序的类层次结构中有两个以上的类,顶层类的默认构造函数将首先被调用。
下面是一个例子:
class A {
A() {
System.out.println("Constructor A");
}
}
class B extends A{
public B() {
System.out.println("Constructor B");
}
}
class C extends B{
public C() {
System.out.println("Constructor C");
}
public static void main(String[] args) {
C c1 = new C();
}
}
以上将输出:
Constructor A
Constructor B
Constructor C
我已经看到了所有的答案。但大家都忘了提一个非常重要的问题:
Super()应该在构造函数的第一行中调用或使用。
Super是一个关键词。在子类方法定义中使用它来调用父类中定义的方法。父类的私有方法不能被调用。只有public和protected方法可以被super关键字调用。类构造函数也使用它来调用父类的构造函数。
点击这里查看进一步的解释。
这是正确的。Super用于调用父构造函数。假设你有这样一个代码块
class A{
int n;
public A(int x){
n = x;
}
}
class B extends A{
int m;
public B(int x, int y){
super(x);
m = y;
}
}
然后你可以给成员变量n赋一个值。
来源文章:Java:调用super()
是的。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();
}
}
打印:
Constructing an animal: From Dog constructor
Constructing a dog.
推荐文章
- 如何有效地从数组列表或字符串数组中删除所有空元素?
- 比较JUnit断言中的数组,简洁的内置方式?
- codestyle;把javadoc放在注释之前还是之后?
- 如何在Spring中定义List bean ?
- 将Set<T>转换为List<T>的最简洁的方法
- 在JavaScript中,什么相当于Java的Thread.sleep() ?
- 使用Java重命名文件
- URL从Java中的类路径加载资源
- .toArray(new MyClass[0]) or .toArray(new MyClass[myList.size()])?
- Hibernate中不同的保存方法之间有什么区别?
- Java 8流和数组操作
- Java Regex捕获组
- Openssl不被视为内部或外部命令
- 如何添加自定义方法到Spring Data JPA
- 如何在Ubuntu中设置Java环境路径