super关键字的使用:
三种情况:
1.在子类中使用父类的成员变量(同名)。
2.子类重写了父类的方法时,本来应该直接调用子类的方法,用super来执行父类中的方法。
3.子类不会继承父类的构造方法(构造方法不会被继承也不会被重写),使用super来用父类的构造方法。(写在子类构造方法的第一句!!!)
第一个例子:(情况1和情况2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | class Sum{ int n; float f() { float sum=0; for(int i=0;i<=n;i++) { sum=sum+i; } return sum; } } class Average extends Sum{ int n; //子类重写父类的方法 float f() { float c; super.n=n; //情况1:把100传给父类的n c=super.f(); //情况2:调用父类的f()方法,n=100,返回sum的值给c,此时c=5050.0 return c/n; //返回5050.0/100的值给result_1 } //子类新增的方法 float g() { float c; c=super.f(); //情况2:调用父类的f()方法,此时c=5050.0 return c/2; //返回c/2的值给result_2 } } public class Example4_17{ //一切从main方法开始。。。 public static void main(String args[]) { Average aver=new Average(); //创建aver对象 aver.n=100; //给子类的n赋值100 float result_1=aver.f(); //调用子类的f()方法,结果赋给result_1 float result_2=aver.g(); //调用子类的g()方法,结果赋给result_2 System.out.println("result_1="+result_1); System.out.println("result_2="+result_2); } } |
结果:
1 2 | result_1=50.5 result_2=2525.0 |
第二个例子:(情况3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class Student{ int number; String name; //无参的构造方法(默认构造方法) Student(){} //有两个参数的构造方法(重载) Student(int number,String name){ this.number=number; this.name=name; System.out.println("I am"+name+",my number is"+number); } } class Univer_Student extends Student{ boolean 婚否; Univer_Student(int number,String name,boolean b){ super(number,name); //情况3:调用父类的Student(int number,String name)方法 婚否=b; System.out.println("婚否:"+婚否); } } public class Example4_18 { //一切从main开始。。。 public static void main(String[] args) { //用子类创建对象Zhang Univer_Student Zhang=new Univer_Student(25,"xiaoming",false); } } |
结果:
1 2 | I amxiaoming,my number is25 婚否:false |
第三个例子:(不重要)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | class Students{ int age; String name; Students(int age,String name){ this.age=age; this.name=name; } public void learning(){ System.out.println("学生的学习方法"); } public void show(){ System.out.println("姓名:"+name+",年龄:"+age); } } class Undergraduate extends Students{ String major,degree; Undergraduate(int age, String name,String major,String degree) { super(age, name); this.major=major; this.degree=degree; } public void learning(){ System.out.println("本科生的 学习方法"); } public void show(){ System.out.println("姓名:"+name+",年龄:"+age+",主修:"+major+",学位:"+degree); } } class Graduate extends Undergraduate{ String direction; Graduate(int age, String name,String major,String degree,String direction){ super(age,name,major,degree); this.direction=direction; } public void learning(){ System.out.println("研究生的学习方法"); } public void show(){ System.out.println("姓名:"+name+",年龄:"+age+",主修:"+major+",学位:"+degree+",研究方向:"+direction); } } public class Test4{ public static void main(String args[]){ Students A=new Students(14,"小明"); A.learning(); A.show(); Undergraduate B=new Undergraduate(20,"小芳","英语","本科生"); B.learning(); B.show(); Graduate C=new Graduate(23,"小红","数学","研究生","统计学"); C.learning(); C.show(); } } |
结果:
1 2 3 4 5 6 | 学生的学习方法 姓名:小明,年龄:14 本科生的 学习方法 姓名:小芳,年龄:20,主修:英语,学位:本科生 研究生的学习方法 姓名:小红,年龄:23,主修:数学,学位:研究生,研究方向:统计学 |
ps:
1.关于继承中构造方法的执行:若父类的构造方法无参,首先执行父类的构造方法,再执行子类的(在创建子类的对象前,必须保证先创建父类的对象);若父类的构造方法有参,则用super关键字代指父类来调用父类的构造方法,并且super的语句必须是子类构造方法的第一条语句!!!