super
super操作被隐藏的成员变量和方法
子类一旦隐藏了继承的成员变量或继承的方法,那么子类创建的对象或继承的方法就不再拥有该变量或方法。此时如果子类中想使用子类隐藏的成员变量或方法就要使用关键字super。
示例如下:
package com.text;
class Father{
public int num=10;
public void f(){
num =20;
System.out.println(num);
}
}
class Child extends Father{
public int num = 30;
public void f(){
System.out.println(super.num);//num=10
super.f();//num=20
System.out.println(num);//num=30
}
}
public class Based {
public static void main(String[] args) {
Child child =new Child();
child.f();
}
}
当子类的对象创建时,其中包含一个子类的对象还有一个父类的对象。我们通过this来访问子类对象,通过super访问父类对象。
分析一下输出结果:
第一个输出语句super.num 结果为10,super.num很明显是在访问父类的成员变量,在父类中的num被初始化为10。此时并没有访问父类中的f方法所以f方法依旧是被隐藏的。若sum不初始化,则系统会自动初始化为0。
第二个输出语句 super.f();此时对象访问父类的f方法,输出num为f方法中的20。
第三个输出语句 sum .没有使用super关键字,则访问子类的成员变量,子类中将num初始化为30,所以输出结果为30。
注意 :若前俩个输出语句互换位置执行,则输出结果为 20 20 30
package com.text;
class Sum {
int n;
float f() {
float sum =0;
for(int i=1;i<=n;i++) {
sum =sum +i ;
}
return sum ;
}
}
class Average extends Sum {
int n ;
float f() {
float c ;
super.n=n ;
c=super.f();
return c/n;
}
float g() {
float c;
c=super.f();
return c/2;
}
}
public class Based {
public static void main(String[] args) {
Average aver = new Average ();
aver.n=100;
float result1 =aver.f();//编号为1
float result2 =aver.g();//编号为2
System.out.println(result1);
System.out.println(result2);
}
}
该程序输出结果为 50.5 ,2525.0
当编号为1,2 的语句调换位置执行,输出结果为 50.5,0.0
使用super调用父类的构造方法:
当子类的构造方法创建一个子类对象时,子类构造方法总是先调用父类的构造方法。子类的构造方法没有明显的指出使用父类的哪个构造方法时 子类就默认调用父类不带参数的那个构造方法。
由于子类不继承父类的构造方法,因此子类在其构造方法中需要使用super调用父类的构造方法,而且super必须是子类构造方法中的第一条语句。
示例程序:
package com.text;
class Student {
int number;
String name ;
Student(){
}
Student (int number ,String name){
this.number=number;
this.name=name;
System.out.println("我的名字是"+name+"学号是"+number);
}
}
class Normalstudent extends Student {
boolean 婚否;
Normalstudent (int number,String name,boolean b ){
super(number,name);
婚否=b;
System.out.println("婚否:"+婚否);
}
}
public class Example {
public static void main(String[] args) {
Student zhang =new Student(1001, "zhang");
Normalstudent li =new Normalstudent(1002, "li", false);
}
}
输出结果为:
我的名字是zhang学号是1001
我的名字是li学号是1002
婚否:false
注意 :如果父类中定义了一个或多个构造方法,最好定义一个不带参数的构造方法,防止子类省略super出现错误。
补充:Java中五种创建对象的方式
创建方式 | 是否调用构造函数 |
---|---|
使用new关键字 | 是 |
使用Class类的newInstance方法(反射) | 是 |
使用Constructor类的newInstance方法(反射) | 是 |
使用clone方法 | 否 |
使用反序列化 | 否 |
以上均为个人理解,有错误的地方还请各位指正,欢迎交流~
有关this关键字详解请点击----:java中this关键字详解