每日一题之(super) 学习java

在Java中,super关键字用于引用直接父类对象的实例变量、方法或构造函数。它在继承机制中起着至关重要的作用,帮助解决命名冲突,并允许子类访问被隐藏的父类成员。以下是关于super关键字的一些关键细节:

1. 引用父类的实例变量

        当子类和父类有相同名称的实例变量时,可以使用super来明确地引用父类中的变量。

class Parent {
    String name = "Parent";
}

class Child extends Parent {
    String name = "Child";

    void printNames() {
        System.out.println(super.name); // 使用父类的name
        System.out.println(this.name); // 使用当前类的name
    }
}

2. 调用父类的方法

        同样,如果子类重写了父类的方法,可以使用super调用父类版本的方法。

class Parent {
    void display() {
        System.out.println("Parent's display method");
    }
}

class Child extends Parent {
    @Override
    void display() {
        super.display(); // 调用父类的display方法
        System.out.println("Child's display method");
    }
}

3. 调用父类的构造器

        在子类的构造器中,可以通过super()调用父类的构造器,这必须是子类构造器中的第一条语句。

class Parent {
    Parent() {
        System.out.println("Parent Constructor");
    }

    Parent(String message) {
        System.out.println(message);
    }
}

class Child extends Parent {
    Child() {
        super(); // 显式调用父类无参构造器
        System.out.println("Child Constructor");
    }

    Child(String message) {
        super(message); // 调用父类带参数的构造器
        System.out.println("Child Constructor with parameter");
    }
}

需要注意的是,如果没有显式调用super(),Java编译器会自动插入对父类无参构造器的调用。

4. super()this()的区别

  • super():用于调用父类的构造器。

  • this():用于在同一类的不同构造器之间进行调用。

这两个调用都必须作为构造器的第一条语句出现,因此在一个构造器中不能同时出现super()this() 

5. 使用场景

  • 避免命名冲突:当子类成员与父类成员同名时,使用super来区分。
  • 初始化:确保子类构造器正确初始化从父类继承来的属性。
  • 链式构造器:通过super()this()实现构造器之间的调用链,简化代码结构。

6. 注意事项 

  • super只能在构造器、实例方法或实例初始化块中使用。

  • super()不能出现在静态上下文中(如静态方法或静态初始化块)。

  • 在一个构造器内部,super()this()必须作为第一行出现,且两者不可同时存在。

你可能感兴趣的:(java,学习,开发语言)