Java中super关键字详解

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关键字详解

你可能感兴趣的:(java基础)