Java教程-详解Java super 关键字

在Java中,关键字super
是一个引用变量,用于引用直接父类的对象。
每当我们创建一个子类的实例时,都会隐式地创建一个父类的实例,并由super
引用所引用。
使用Java中的super关键字
super
可用于引用直接父类的实例变量。super
可用于调用直接父类的方法。super()
可用于调用直接父类的构造函数。
1) 使用super引用直接父类的实例变量
我们可以使用super
关键字来访问父类的数据成员或字段。如果父类和子类具有相同的字段,我们可以使用super
来引用父类的字段,以避免混淆和歧义。
class Animal{
String color="白色的";
}
class Dog extends Animal{
String color="黑色的";
void printColor(){
System.out.println(color); // 打印 Dog 类的颜色
System.out.println(super.color);//打印Animal类的颜色 class
}
}
class TestSuper1{
public static void main(String args[]){
Dog d=new Dog();
d.printColor();
}}
输出:
黑色的
白色的
在上述示例中,Animal类和Dog类都具有一个共同的属性color。当我们打印color属性时,默认会打印当前类的color值。如果我们想访问父类的属性,我们需要使用super
关键字。
2) 使用super调用父类的方法
super
关键字还可以用于调用父类的方法。当子类包含与父类相同的方法时,我们可以使用super
关键字来引用父类的方法。换句话说,当方法被覆盖时,我们可以使用super
来调用父类的方法。这允许我们在子类中对父类方法的行为进行扩展或修改,同时仍然能够访问父类的实现。
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类都具有eat()方法。当我们从Dog类调用eat()方法时,默认会调用Dog类的eat()方法,因为本地方法具有优先权。
要调用父类的方法,我们需要使用super
关键字。使用super.eat()
可以显式地调用父类的eat()方法,以便在子类中执行特定的操作后,再调用父类的方法。
3) 使用super调用父类的构造函数
super
关键字还可以用于调用父类的构造函数。当子类需要在构造过程中初始化父类的实例变量时,我们可以使用super()
来调用父类的构造函数。这样可以确保父类的构造函数在子类的构造过程中得到正确调用,从而完成必要的初始化工作。
class Animal{
Animal(){System.out.println("动物被创建");}
}
class Dog extends Animal{
Dog(){
super();
System.out.println("狗被创建");
}
}
class TestSuper3{
public static void main(String args[]){
Dog d=new Dog();
}}
输出:
动物被创建
狗被创建
注意:如果没有 super() 或 this(),编译器会自动在每个类的构造函数中添加 super()。
众所周知,如果没有构造函数,编译器会自动提供默认构造函数。但是,它还添加了 super() 作为第一条语句。
super 关键字的另一个示例,其中 super() 由编译器隐式提供。
class Animal{
Animal(){System.out.println("动物被创建");}
}
class Dog extends Animal{
Dog(){
System.out.println("狗被创建");
}
}
class TestSuper4{
public static void main(String args[]){
Dog d=new Dog();
}}
输出:
动物被创建
狗被创建
超级示例:实际使用
让我们来看看super
关键字的实际用法。在这个例子中,Emp类继承了Person类,因此Emp类会默认继承Person类的所有属性。为了初始化所有属性,我们使用子类的父类构造函数。这样一来,我们就可以重用父类的构造函数来完成属性的初始化。
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