Java super关键字

1 什么是Java的super关键字

Java中的super关键字是一个引用变量,用于引用父类对象。

每当你创建子类的实例时,都会隐式创建父类的实例,该父类的实例由super引用变量进行引用。

2 Java的super关键字用法

  1. super可用于引用父类实例变量。
  2. super可用于调用直接父类的方法。
  3. super() 可用于调用直接父类构造方法。

2.1 super引用父类实例变量

我们可以使用super关键字访问父类的数据成员或字段。如果父类和子类具有相同的字段,则使用它。

/**
 * 一点教程网 - http://www.yiidian.com
 */
class Animal{
    String color="white";
}
class Dog extends Animal{
    String color="black";
    void printColor(){
        System.out.println(color);//打印Dog的颜色
        System.out.println(super.color);//打印Animal的颜色
    }
}
class TestSuper1{
    public static void main(String args[]){
        Dog d=new Dog();
        d.printColor();
    }
}

输出结果为:

black
white

在上面的示例中,Animal和Dog这两个类都具有相同的color属性。如果我们打印color属性,它将默认打印当前类的颜色。要访问父类的属性,我们需要用到super关键字。

2.2 super调用直接父类的方法

super关键字也可以用于调用父类方法。如果子类包含与父类相同的方法,则应使用它。换句话说,如果方法被覆盖,则使用它。

/**
 * 一点教程网 - http://www.yiidian.com
 */
class Animal{
    void eat(){
        System.out.println("在吃...");
    }
}
class Dog extends Animal{
    void eat(){
        System.out.println("吃面包...");
    }
    void bark(){
        System.out.println("洗澡...");
    }
    void work(){
        super.eat();
        bark();
    }
}
class TestSuper2{
    public static void main(String args[]){
        Dog d=new Dog();
        d.work();
    }
}

输出结果为:

在吃...
洗澡...

在上面的示例Animal和Dog中,如果我们从Dog类调用eat() 方法,则这两个类都具有eat() 方法,默认情况下它将调用Dog类的eat() 方法,因为本类优先级较高。

要调用父类方法,我们需要使用super关键字。

2.3 super()调用直接父类构造方法

super关键字也可以用于调用父类的构造函数。让我们看一个简单的例子:

/**
 * 一点教程网 - http://www.yiidian.com
 */
class Animal{
    Animal(){
        System.out.println("Animal被创建了");
    }
}
class Dog extends Animal{
    Dog(){
        super();
        System.out.println("Dog被创建了");
    }
}
class TestSuper3{
    public static void main(String args[]){
        Dog d=new Dog();
    }
}

输出结果为:

Animal被创建了
Dog被创建了

注意:如果没有super() 或this() 方法,super()会由编译器自动添加到每个类构造函数中。

众所周知,如果没有构造方法,则默认的构造方法由编译器自动提供。但是,它也将super()添加到构造方法的第一条语句。

下面是super关键字的另一个示例,其中super()由编译器隐式提供。

/**
 * 一点教程网 - http://www.yiidian.com
 */
//super()被隐式调用
class Animal{
    Animal(){System.out.println("Animal被创建了");}
}
class Dog extends Animal{
    Dog(){
        System.out.println("Dog被创建了");
    }
}
class TestSuper4{
    public static void main(String args[]){
        Dog d=new Dog();
    }
}

输出结果为:

Animal被创建了
Dog被创建了

3 super关键词示例

让我们看看super关键字的实际用法。在这里,Emp类继承了Person类,因此默认情况下,Person的所有属性都将继承给Emp。要初始化所有属性,我们在子类调用父类构造函数。这样,我们就可以重用父类的构造函数。

/**
 * 一点教程网 - http://www.yiidian.com
 */
//super()的实际应用
class Person{
    int id;
    String name;
    Person(int id,String name){
        this.id=id;
        this.name=name;
    }
}
class Emp extends Person{
    float salary;
    Emp(int id,String name,float salary){
        super(id,name);//调用父类构造方法
        this.salary=salary;
    }
    void display(){
        System.out.println(id+" "+name+" "+salary);
    }
}
class TestSuper5{
    public static void main(String[] args){
        Emp e1=new Emp(1,"张三",45000f);
        e1.display();
    }
}

输出结果为:

1 张三 45000.0

 

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码