继承和super

子类可以继承,可以重写父类的方法

 

不同的包中,子类不继承父类的友好成员变量

同一个包中,子类不继承父类的私有成员变量,也不继承父类的私有方法。但是!!!子类从父类继承来的方法,可以操作这部分未继承的变量。

package com.demo16;

public class People {
	private int averHeight=166;
	public int getAverHeight() {
		return averHeight;
	}

}
package com.demo16;

public class ChinesePeople extends People{
	int height;
	public void setHeight(int h) {
		height=h;
	}
	public int getHeight() {
		return height;
	}

}
package com.demo16;

public class Test {
	public static void main(String[] args) {
		ChinesePeople zhangSan=new ChinesePeople();
		System.out.println("子类对象未继承的averHeight的值是:"+zhangSan.getAverHeight());
		zhangSan.setHeight(178);
		System.out.println("子类对象的实例变量height的值是:"+zhangSan.getHeight());
	}

}

/*
运行结果:
子类对象未继承的averHeight的值是:166
子类对象的实例变量height的值是:178
*/

 

如果父类的成员变量被子类的成员变量所隐藏(名字相同),子类对象仍然可以调用从父类继承来的方法来操作被子类隐藏的成员变量;子类新定义的方法则无法操作被子类隐藏的成员变量,此时需使用super关键字来操作子类隐藏的成员变量。

super关键字

作用1:用super操作被隐藏的成员变量和方法

子类一旦隐藏了继承的成员变量/方法,那么子类创建的对象就不再拥有该变量/不能再调用被隐藏的方法,需用super来访问/调用。

package com.demo31;

public class Sum {
	int n;
	float f() {
		float sum=0;
		for (int i=1;i<=n;i++) {
			sum=sum+i;
		}
		return sum;
	}

}
package com.demo31;

public 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;
	}

}
package com.demo31;

public class Test {
	public static void main(String[] args) {
		Average aver=new Average();
		aver.n=100;
		float result1=aver.f();
		float result2=aver.g();
		System.out.println("result1="+result1);//50.5
		System.out.println("result2="+result2);//2525.0
	}
	
}


/*
package com.demo31;

public class Test1 {
	public static void main(String[] args) {
		Average aver=new Average();
		aver.n=100;
		
		float result2=aver.g();
		float result1=aver.f();
		
		System.out.println("result1="+result1);//50.5
		System.out.println("result2="+result2);//0.0
	}

}

 

作用2:调用父类的构造方法

 当用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法,由于子类不继承父类的构造方法,所以使用super()来调用父类的构造方法,写在子类构造方法中的第一句。

package com.demo32;

public class Student {
	String name;
	int number;
	
	Student(){		//当在父类中定义多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略super时出现错误(?)

	}
	
	Student(String name,int number){
		this.name=name;
		this.number=number;
		System.out.printf("我的名字是%s,学号是%d\n",name,number);
	}

}
package com.demo32;

public class UniverStudent extends Student{
	boolean hunfou;
	UniverStudent(String name, int number, boolean b){
		super(name,number);
		hunfou=b;
		System.out.println("婚否="+hunfou);
		
	}

}
package com.demo32;

public class Test {
	public static void main(String[] args) {
		UniverStudent zhang=new UniverStudent("何晓林",2203,false);
	}

}

/*
我的名字是何晓林,学号是2203
婚否=false
*/

 

posted @ 2022-03-16 22:25  SherryYuan  阅读(48)  评论(0)    收藏  举报