super 关键字详解

super 关键字主要有三个作用:

  • 从子类访问父类的成员变量
  • 从子类访问父类的成员方法
  • 从子类构造器访问父类的构造器

下面我将从这三个方面做一些细节说明和注意事项。

从子类访问父类的成员变量

使用 super 关键字从子类访问父类的成员变量需要遵循访问修饰符的限制。如下图所示,父类的私有变量子类是无法访问到的,其他类型的变量也都有一定的作用域。

20161223101955854

从子类访问父类的成员方法

使用 super 关键字从子类访问父类的成员方法需要遵循访问修饰符的限制。如下图所示,父类的私有方法子类是无法访问到的,其他类型的方法也都有一定的作用域。

20161223101955854

从子类构造器访问父类的构造器

使用 super 关键字从子类构造器访问父类的构造器我们需要注意以下两点:

  • 在子类构造器中使用 super() 调用父类中的其他构造器时,该语句必须处于构造器的首行,否则编译器会报错
  • 子类构造器如果没有显示使用 super() 调用父类的构造器,那么会默认调用 super() 的无参构造器

下面我会写一些案例来帮助理解以上两点注意事项。

  1. 父类有一个 public 无参构造器,代码如下:

    public class Parent {
        public Parent() {
            System.out.println("我是父类的无参构造器");
        }
    }
    
    public class Son extends Parent {
        public Son() {
            super();
            System.out.println("我是子类的无参构造器");
        }
    
        public static void main(String[] args) {
            Son son = new Son();
        }
    }
    

    控制台输出如下:

    我是父类的无参构造器
    我是子类的无参构造器
    
  2. 父类有一个 public 有参构造器,代码如下:

    public class Parent {
        public Parent(int a) {
            System.out.println("我是父类的有参构造器,参数为" + a);
        }
    }
    
    public class Son extends Parent {
        public Son() {
            super(6);
            System.out.println("我是子类的无参构造器");
        }
    
        public static void main(String[] args) {
            Son son = new Son();
        }
    }
    

    控制台输出如下:

    我是父类的有参构造器,参数为6
    我是子类的无参构造器
    
  3. 父类只有一个 private 无参构造器

    如果父类只有一个 private 无参构造器,那么子类在创建子类构造器时会报错。因为子类构造器在创建时一定要调用一个父类构造器(无论是显示调用还是隐式调用都可以),但父类只有一个 private 无参构造器,而这个构造器因为是 private 的,所以子类是访问不到的,也就是说子类没有可以调用的父类构造器,所以会报错。

注意

super 关键字不能用在 static 方法中。因为 super 代表对父类对象的引用,指向父类对象,而静态方法是属于类范畴的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值