Supper关键字

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

每当创建子类的实例时,父类的实例被隐式创建,由super关键字引用变量引用。

java super关键字的用法如下:

  • super可以用来引用直接父类的实例变量。
  • super可以用来调用直接父类方法。
  • super()可以用于调用直接父类构造函数。

1. super用于引用直接父类实例变量

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

class Animal {
    String color = "white";
}

class Dog extends Animal {
    String color = "black";

    void printColor() {
        System.out.println(color);// prints color of Dog class
        System.out.println(super.color);// prints color of Animal class
    }
}

class TestSuper1 {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.printColor();
    }
}

Java

执行上面代码,输出结果如下 -

black
white

Java

在上面的例子中,AnimalDog都有一个共同的属性:color。 如果我们打印color属性,它将默认打印当前类的颜色。 要访问父属性,需要使用super关键字指定。

2. 通过 super 来调用父类方法

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

class Animal {
    void eat() {
        System.out.println("eating...");
    }
}

class Dog extends Animal {
    void eat() {
        System.out.println("eating bread...");
    }

    void bark() {
        System.out.println("barking...");
    }

    void work() {
        super.eat();
        bark();
    }
}

class TestSuper2 {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.work();
    }
}

Java

执行上面代码,输出结果如下 -

eating...
barking...

Java

在上面的例子中,AnimalDog两个类都有eat()方法,如果要调用Dog类中的eat()方法,它将默认调用Dog类的eat()方法,因为当前类的优先级比父类的高。
所以要调用父类方法,需要使用super关键字指定。

3. 使用 super 来调用父类构造函数

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

class Animal {
    Animal() {
        System.out.println("animal is created");
    }
}

class Dog extends Animal {
    Dog() {
        super();
        System.out.println("dog is created");
    }
}

class TestSuper3 {
    public static void main(String args[]) {
        Dog d = new Dog();
    }
}

Java

注意:如果没有使用super()this(),则super()在每个类构造函数中由编译器自动添加。

我们知道,如果没有构造函数,编译器会自动提供默认构造函数。 但是,它还添加了super()作为第一个语句。

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

class Animal {
    Animal() {
        System.out.println("animal is created");
    }
}

class Dog extends Animal {
    Dog() {
        System.out.println("dog is created");
    }
}

class TestSuper4 {
    public static void main(String args[]) {
        Dog d = new Dog();
    }
}

Java

执行上面代码,输出结果如下 -

animal is created
dog is created

Java

super实际使用示例

下面来看看super关键字的实际用法。 在这里,Emp类继承了Person类,所以Person的所有属性都将默认继承到Emp。 要初始化所有的属性,可使用子类的父类构造函数。 这样,我们重用了父类的构造函数。

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);// reusing parent constructor
        this.salary = salary;
    }

    void display() {
        System.out.println(id + " " + name + " " + salary);
    }
}

class TestSuper5 {
    public static void main(String[] args) {
        Emp e1 = new Emp(1, "ankit", 45000f);
        e1.display();
    }
}

Java

执行上面代码,输出结果如下 -

1 ankit 45000
时间: 2024-10-11 03:29:02

Supper关键字的相关文章

supper 关键字

supper应用场景: 子类具有特殊功能,子类重写父类的方法,并且想保留父类的方法时使用supper关键字(因为如果采用self的话,则会导致死循环) supper的注意点: supper会自动区分类方法跟对象方法,如果在类方法中使用supper调用对象方法,那么会报错! supper与self关键字的区别: supper关键字是直接在父类中查找相应的方法:而self关键字是在子类中查找方法,如果找不到则在父类中进行查找

[转] Java程序员学C#基本语法两个小时搞定(对比学习)

Java程序员学C#基本语法两个小时搞定(对比学习) 对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. 1.引包 using System;java用import2.构造函数和java语法相同3.析构函数  变量和类的对象都有生命周期,生命周期结束,这些变量和对象就要被撤销.  类的对象被撤销时,将自动调用析构函数.一些善后工作可放在析构函数中完成.  析构函数的名字为~类名,无返回类型,也无参数.Per

Java SE 第十六讲----面向对象特征之继承

1.继承(inheritance):Java是单继承的,意味着一个类只能从另一个类继承(被继承的类叫做父类也叫[基类 baseclass]),继承的类叫做子类,java中的继承使用extends关键字. public class Child extends Parent{ public Child(){ System.out.println("child"); } public static void main(String[] args){ Child child = new Chi

Java程序员学C#基本语法两个小时搞定(对比学习)

对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. 1.引包 using System;java用import2.构造函数和java语法相同3.析构函数  变量和类的对象都有生命周期,生命周期结束,这些变量和对象就要被撤销.  类的对象被撤销时,将自动调用析构函数.一些善后工作可放在析构函数中完成.  析构函数的名字为~类名,无返回类型,也无参数.Person类的析构函数为~ Person().  C#中类

浅析java基本程序

1.包 package package语法:包名.类名 ;包名的写法规范:所有字母需小写. 当然也可以采用静态导入  例如 import static java.lang.Math.* 有包的对象不能使用默认包的对象. import java.lang  包是java虚拟机自动导入的包,在使用java.lang包时我们可以不需要导包:例如:Thread类,Exception类,System类,String类等,可以相应的查看Api. java.util.*  这里的*表示java.util下的所

Scala知识点总结(上半部分)

深度解析Scala -----------语法精细篇 1.安装Scala: 1.将安装包解压 2.配置环境变量 E:\program\scala-2.11.8 系统变量中配置:变量名:SCAL_HOME 变量值:E:\program\scala-2.11.8 确定 编辑环境变量中:新建 ==>%SCALA_HOME%/bin===>确定 注意:如果在配置完了Scala,需要从新打开cmd.exe 2.配置IDEA 2.1点击Configure--->Plugins----->Ins

《Java程序设计》第四周学习总结

学号 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 1.子类与父类:由继承得到的类称为子类,被继承的类称为父类 2.在类的声明过程中,通常用关键字extend来定义一个类的子类 ,如 class 子类名 extend 父类名 3.如果子类和父类在同一个包中,子类继承了其父类中不是private的成员变量作为自己的成员变量,也继承了其父类中不是private的方法作为自己 的方法,继承的成员变量和方法的访问权限保持不变 4.子类对象的特点:如果子类和父类不在同一个

python基础篇16-面向对象初级

面向对象三大特性 面向对象的三大特性是指:封装.继承和多态. 一.封装 封装,顾名思义就是将功能封装到对象中,需要调用功能时,直接通过调用对象中的功能即可. 所以,在使用面向对象的封装特性时,需要: 将内容封装到某处 从某处调用被封装的内容 第一步:将内容封装到某处. self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1:当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2:内容其实被封装到了对象 o

Javascript中的关键字和保留字

ECMA-262中描述了一组具有特定用途的关键字,可用于表示控制语句的开始或结束,或者用于执行特定操作等.规定:关键字属于语言保留,不可以用于标示符. ECMAScript的全部关键字(*为第五版新增): break do instanceof typeof case else new var catch finally return void continue for switch while debugger*   function this with default if throw de