在Java中,当子类重写了父类的方法后,子类对象将无法访问父类被重写的方法。
super关键字用于访问父类的成员,包括成员变量,成员方法和构造方法:
一:
使用super关键字调用父类的成员变量和成员方法。
1 //定义父类 2 class Father 3 { 4 int age=40; 5 //定义父类方法 6 void introduce() 7 { 8 System.out.println("父亲今年"+age+"岁了。"); 9 } 10 } 11 12 //定义子类 13 class Child extends Father 14 { 15 //重写父类的方法 16 void introduce() 17 { 18 //访问父类的成员方法 19 super.introduce(); 20 int age=18; 21 System.out.println("孩子今年"+age+"岁了"); 22 //访问父类的成员变量 23 System.out.println("父亲已经"+super.age+"岁了。"); 24 } 25 } 26 27 class Test 28 { 29 public static void main(String[] args) 30 { 31 Child c1 = new Child(); 32 c1.introduce(); 33 } 34 }
运行结果为:
由运行结果可以看出,子类通过super关键字可以访问父类的成员变量和成员方法。
二:
通过super关键字调用父类的构造方法。
//定义父类 class Father { //父类有参的构造方法 public Father(int age) { System.out.println("父类的成员方法被调用了"); System.out.println("父亲今年"+age+"岁了。"); } } //定义子类 class Child extends Father { //子类的构造方法 public Child() { //调用父类有参的构造方法 super(40); } } class Test { public static void main(String[] args) { Child c1 = new Child();//创建对象,调用子类的构造方法 } }
运行结果为:
从运行结果可以看出,子类的构造方法被调用时父类的构造方法也被调用了。
如果我们把子类构造方法中"super(40);"这一句注释掉,编译就会出现以下错误:
原因是在子类的构造方法中一定会调用父类的构造方法,这时可以通过super来指定调用哪一个构造方法,如果没有指定,则默认调用父类无参的构造方法,可是在代码中父类并没有定义无参的构造方法,所以会报错。所以,在类中一旦定义了有参的构造方法,最好也定义一个无参的构造方法。
另外,和this关键字相似的地方有:
通过super调用父类的构造方法的代码必须位于子类构造方法的第一行,且只能出现一次!