Java中 super关键字

super关键字:在对象的内部使用,可以代表父类对象。

1.访问父类的属性
super.age;
2.访问父类的方法
super.eat();

新建java项目演示:
这里写图片描述

Init.java 是项目入口文件:

package com.mydev;


public class Init {

    /**
     * 入口函数
     * @param args
     */
    public static void main(String[] args){
        Dog dog = new Dog();
        dog.method();
    }
}

Animal.java 的动物类(父类):

package com.mydev;

public class Animal {
    public int age = 10;
    public void eat(){
        System.out.println("父类eat方法");
    }
}

Dog.java 继承自Animal.java:

package com.mydev;


public class Dog extends Animal{
    public void method(){
        // 访问父类的属性
        System.out.println("父类的age=" + super.age);
    }
}

程序逻辑:我们在入口文件的main 函数里实例化了一个Dog 类对象,然后调用本类的method() 方法。该方法中访问了父类的age 属性,使用super.age 的方式。
这里写图片描述

如果子类有和父类的同名方法,比如说eat() 方法,在子类中如何区分调用呢?

public class Dog extends Animal{
    public void eat(){
        System.out.println("子类的eat方法");
    }

    public void method(){
        // 访问父类的属性
        System.out.println("父类的age=" + super.age);

        // 调用父类的方法
        super.eat();

        // 调用本类的方法
        eat();
    }
}

执行打印结果:

父类的age=10
父类eat方法
子类的eat方法

super关键字和构造方法的关系

子类的构造的过程当中必须调用其父类的构造方法。
我们之前已经总结了,当我们创建子类的对象的时候,其实会自动调用父类的构造方法,并且创建父类对象。这里实质上就隐式地使用了super关键字。

我们在父类Animal类中创建一个构造方法:

    public Animal(){
        System.out.println("Animal类(父类)的构造方法执行了");
    }

子类Dog类中也创建一个构造方法:

    public Dog(){
        System.out.println("Dog类(子类)的构造方法执行了");
    }

然后我们实例化子类Dog类的时候发现,父类的构造方法也执行了,而且上先于子类的构造方法执行的。

Dog dog = new Dog();

程序执行打印结果:

Animal类(父类)的构造方法执行了
Dog类(子类)的构造方法执行了

如果子类的构造方法中没有显示地调用父类的构造方法,则系统默认调用父类无参数的构造方法

    public Dog(){
        super(); //这里写和不写效果上一样的。不写会隐式调用。
        System.out.println("Dog类(子类)的构造方法执行了");
    }

如果显示地调用父类的构造方法,必须上在子类的构造方法等第一行
这里写图片描述

如果父类没有指定无参的构造方法,而子类的构造方法中也没有显式地调用父类的构造方法,则会编译报错

/*    public Animal(){
        System.out.println("Animal类(父类)的构造方法执行了");
    }*/

    public Animal(int age){
        this.age = age;
    }

父类只有有参数的构造方法,
现在子类就不能隐式地(不写super())调用父类的构造方法了
这里写图片描述
显式地调用就可以了:

    public Dog(){
        super(10);
        System.out.println("Dog类(子类)的构造方法执行了");
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值