1、用super关键字操作被隐藏的成员变量和方法:
子类一旦隐藏了继承的成员变量,那么子类创建的对象就不再拥有该变量,该变量将归关键字super所有,同样,子类一旦隐藏了继承的方法,那么子类创建的对象就不能调用被隐藏的方法,该方法的调用由关键字super负责。
如果在子类中想使用被子类隐藏的成员变量或方法,就需要使用关键字super。
举例:
package super和final关键字;
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;//调用的是被隐藏的n
c=super.f();//调用的是被隐藏的方法f()
return c/n;
}
float g() {
float c;
c=super.f();//调用的是被隐藏的方法f()
return c/2;
}
}
public class E5_7 {
public static void main(String[] args) {
Average aver=new Average();
aver.n=100;
float resultOne=aver.f();
float resultTwo=aver.g();
System.out.println("resultOne="+resultOne);
System.out.println("resultTwo="+resultTwo);
}
}
package super和final关键字;
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;//调用的是被隐藏的n
c=super.f();//调用的是被隐藏的方法f()
return c/n;
}
float g() {
float c;
c=super.f();//调用的是被隐藏的方法f()
return c/2;
}
}
public class E5_7 {
public static void main(String[] args) {
Average aver=new Average();
aver.n=100;
float resultTwo=aver.g();
float resultOne=aver.f();
System.out.println("resultOne="+resultOne);
System.out.println("resultTwo="+resultTwo);
}
}
2、使用super调用父类的构造方法:
当用子类的构造方法创建一个子类对象时,子类的构造方法总是先调用父类的某个构造方法,也就是说,如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法。
由于子类不继承父类的构造方法,因此,子类在其构造方法中需使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句,即如果在子类的构造方法中,没有明显地写出super关键字来调用父类的某个构造方法,那么默认地有:super();
举例:
package super和final关键字;
class Student{
int number;
String name;
Student(){
}
Student(int number,String name){
this.number=number;
this.name=name;
System.out.println("名字是"+name+" "+"学号是"+number);
}
}
class Ustudent extends Student{
boolean 婚否;
Ustudent(int number,String name,boolean b){
super(number,name);
婚否=b;
System.out.println("婚否="+婚否);
}
}
public class E5_8 {
public static void main(String[] args) {
Ustudent zhang=new Ustudent(520,"后绍园",false);
}
}
将子类的构造方法中省略super:
package super和final关键字;
class Student{
int number;
String name;
Student(){
}
Student(int number,String name){
this.number=number;
this.name=name;
System.out.println("名字是"+name+" "+"学号是"+number);
}
}
class Ustudent extends Student{
boolean 婚否;
Ustudent(int number,String name,boolean b){
//super(number,name);
婚否=b;
System.out.println("婚否="+婚否);
}
}
public class E5_8 {
public static void main(String[] args) {
Ustudent zhang=new Ustudent(520,"后绍园",false);
}
}
3、final关键字:
final关键字可以修饰类、成员变量和方法中的局部变量。
(1)final类:
final class A{
.........
}
final类不能被继承,即不能有子类。比如java.long包中的String类
(2)final方法:
不允许子类隐藏可以继承的final方法(老老实实继承,不允许做任何篡改)。
(3)常量:
如果成员变量或局部变量被修饰为final,那么它就是常量。由于常量在运行期间不允许再发生变化,所以常量在声明时没有默认值,这就要求程序在声明常量时必须指定该常量的值。
举例:
package super和final关键字;
class A{
final double PI=3.1415926;//PI是常量
public double getArea(final double r) {
//r=r+1;非法,不允许对final变量进行更新操作
return PI*r*r;
}
public final void speak() {
System.out.println("您好,How is everything here?");
}
}
public class E5_9 {
public static void main(String[] args) {
A a=new A();
System.out.println("面积:"+a.getArea(100));
a.speak();
}
}