在从子类继承父类的过程中,可能需要在子类中调用父类中的成员,如属性、方法或者构造器,这个时候,可以使用super关键字来完成。
super的作用是用于引用父类的成员,如属性、方法或者是构造器。
调用父类构造器
用于调用父类的构造器,是super的用法之一,它的基本格式是:
super([arg_list])
直接用super()加上父类构造器所需要的参数,就可以调用父类的构造器了。
如果父类中有多个构造器,系统将自动根据super()中的参数个数和参数类型来找出父类中相匹配的构造器。
我们来看下面这个例子,类“Dog”继承了父类“Animal”,并在它的构造器中调用了父类的构造器:
public class Dog extends Animal{
public Dog() {
super(0);
}
//其他代码
… …
}
在Dog这个子类中,有一个构造器Dog(),它里面有一个super(0)的语句,这句话的意思是用参数0来调用父类的构造器,也就是说,如果我们调用Dog的构造器来构建一个对象,它将会去调用父类的构造器来完成这个任务,所以,这个时候,父类中的weight属性的值现在被初始化成0了。
父类必须自己负责初始化它自己的状态而不是让子类来做,因此,如果子类的构造器中没有显式地调用父类构造器,也没有在构造器中调用重载的其它构造器,则系统将会默认调用父类中无参数的构造器。
此时,如果父类中没有无参的构造器,则编译将会出错。
例如,如果将Person类定义成如下:
public class Person {
private String name;
private int age;
private String sex;
public Person(String theName) {
name = theName;
}
public Person(String theName, int theAge, String theSex) {
name = theName;
age = theAge;
sex = theSex;
}
// 其他代码
}
则对于它的子类Teacher来说,如果定义为如下的方式:
public class Teacher extends Person {
private String department;
public void setDepartment(String dept) {
department = dept;
}
public String getDepartment() {
return department;
}
// 其他代码
}
那么,编译这个类的时候,将会出现如下的错误:
Teacher.java:1: cannot resolve symbol
symbol : constructor Person ()
location: class Person
public class Teacher extends Person
^
1 error
这就是因为在调用类Teacher的默认无参数的构造器创建对象的时候,它会去调用父类Person的不带参数构造器,而在类Person中,因为我们没有定义不带参数的构造器,所以,编译器因为无法成功调用Person的不带参数的构造器而报错。
调用父类方法、属性
当super用于引用父类中的属性或方法时,使用下面的形式:
super.属性
super.方法()
例如,我们可以在Teacher这个子类中通过下面的方式来调用父类中方法:
super.getSex();
注意,在这个时候,父类的属性或方法必须是那些protected(受保护)或者public(公共)等可以让子类访问的属性或者方法。
super用于调用父类中的方法主要用于在子类中定义了和父类中同名的属性、或进行了方法的覆盖,而又要在子类中访问父类中的同名属性或覆盖前的方法的时候。
public class Person {
private String name;
private int age;
private String sex;
public String showName() {
return name;
}
// 其他代码
}
在这个例子中,我们假设Person类中的属性都是private的,通过各自的public的方法来存取。
public class Teacher extends Person {
private String department;
public void setDepartment(String dept) {
department = dept;
}
public String getDepartment() {
return department;
}
// 方法覆盖
public String showName() {
// ! return name+"老师";
return super.showName() + "老师";
}
// 测试
public static void main(String[] args) {
Teacher t = new Teacher();
t.setName("Alex");
System.out.println(t.showName());
}
}
在子类Teacher中,如果覆盖方法showName()还是用下面的代码段所示直接返回父类中的属性name,将会因为访问权限问题而出错(private属性只能在本类中被访问):
return name+"老师";
在编译的时候,将会出现下面的错误:
Teacher.java:17: name has private access in Person
return name+"老师";
^
1 error
这个时候,可以在这个覆盖方法中调用被覆盖方法,得到我们需要的“name”属性的值:
public String showName(){
return super.showName()+"老师";
}
这样就解决了访问权限的问题,也清晰的指明了在这个覆盖方法中调用的showName()方法是父类中的方法。
如果不指明此处调用的showName()方法的出处,系统将会当作是类Teacher中的方法,当运行此程序时,将会递归地调用方法本身,引起程序错误。
相关推荐
24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24...
Java 中 super 关键字的三种用法 Java 中的 super 关键字有三种用法:在子类的构造函数中调用父类的构造方法、在子类中访问父类的成员变量或方法、在子类的构造函数中直接传递参数给父类的构造方法。 首先,在子类...
3. 类与对象关键字:`public`, `private`, `protected`, `static`, `final`, `abstract`, `void`, `this`, `super`, `new`, `instanceof`。它们用于定义类的访问权限、修饰成员变量和方法、创建对象、进行类型检查等...
在Java编程语言中,`super`关键字是一个非常重要的概念,它允许我们引用当前对象的父类中的成员。这个关键字在处理继承关系时尤其有用,帮助我们实现多态性并访问被隐藏或重写的成员。本篇文章将深入探讨`super`...
22. **Extends, Inherit, Base class, Super class, Overloaded method, Overridden method**:继承、重载和重写,是面向对象的特性。 23. **Public, Private, Protected, Static, Abstract, Interface, Implements...
1. **构造器与super关键字**:在子类的构造器中,可以通过`super()`语句来调用父类的构造器,确保父类的状态在子类对象创建时得到初始化。这是Java强制子类构造器必须首先调用父类构造器的原因,除非父类有默认无参...
Java super关键字用法实战案例分析 Java super关键字是Java编程语言中的一种特殊关键字,用于访问父类的成员变量和方法。在Java中,子类继承父类时,需要使用super关键字来调用父类的构造方法、属性和方法。本文将...
在Java编程语言中,`super`关键字是一个非常重要的概念,它用于引用当前对象的父类。`super`关键字主要用于以下几种情况:调用父类的构造器、访问父类的成员变量以及调用父类的非私有方法。下面我们将详细探讨`super...
Java 中的 super 关键字的三种用法 Java 中的 super 关键字是非常重要的,它可以用于访问父类的成员变量和方法。下面我们将讨论 super 关键字的三种用法。 第一种用法:在子类的构造函数中调用父类的构造方法 在...
在Java编程中,`super`关键字是一个非常重要的概念,它允许子类引用其直接父类的实例变量、方法,甚至调用父类的构造函数。理解并熟练运用`super`关键字是成为一名合格的Java开发者的关键技能之一。 首先,`super`...
理解this与super关键字的用法有助于程序员编写出更加规范、严谨的代码,并能够有效管理继承体系中类的属性和方法,避免歧义和错误。 在Java编程实践中,正确运用this与super关键字,可以提高代码的可读性和可维护性...
博文链接:https://gml520.iteye.com/blog/129124
Java中的super关键字详解 Java中的super关键字是用于访问父类的成员变量或成员方法的关键字。super关键字的使用可以让子类访问父类的成员变量或成员方法,从而实现继承的效果。 1. super关键字的使用 super关键字...
### Java中的this与super关键字详解 #### 一、引言 在Java编程语言中,`this`和`super`是两个非常重要的关键字,它们在面向对象编程中扮演着不可或缺的角色。正确理解和使用这两个关键字对于编写高质量、易于维护...
在 Java 编程语言中,`super` 关键字是一个非常重要的概念,它主要用于处理类之间的继承关系。Java 是一种面向对象的编程语言,支持类的继承,这意味着一个类(子类)可以继承另一个类(父类)的属性和方法。`super`...
5. 使用 `super` 关键字可以调用同类的其他构造方法,这有助于代码复用,减少维护工作。 6. 使用 `static` 关键字修饰的成员变量是类变量,它们在类加载时被初始化,所有对象共享同一份存储。类变量可以通过类名....
一、super关键字的使用 1. **为什么需要super?** 当子类继承父类后,可能出现以下情况: - 子类重写了父类的方法,但仍需在子类中调用父类的原始实现。 - 子类和父类中有同名的属性,需要在子类中明确区分这...