个人对Java中super关键字的理解

在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调用父类的构造方法的代码必须位于子类构造方法的第一行,且只能出现一次!

原文地址:https://www.cnblogs.com/yangwanhao/p/7647858.html