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

每当我们创建一个子类的实例时,都会隐式地创建一个父类的实例,并由super引用所引用。

使用Java中的super关键字

  1. super可用于引用直接父类的实例变量。
  2. super可用于调用直接父类的方法。
  3. 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

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想