Java学习17-- super类

重点:super类 & 方法重写

super类

super指的是本级的上一级,即father class父类

很好理解,比如Person class>Student class
当前在Student class执行,那么就写this.xxx
需要在Student程序里面调用Person,那就写super.xxx

比如下面的例子:

建立一个叫做kids的class它的上级是human class,从主程序testjan05来调用kids class里面的method my_prt它可以打印输出kids class里的变量name以及this.name和super.name。注意将kids内部的name设为private,观察输出的结果


public class testjan05{
public static void main(String args[]) {

kids x = new kids();

x.my_prt("emma");}
}


public class kids extends human{

    private String name = "kids_name";

    public kids() {
        super();//这句如果用户不写,也可以。这是一句隐藏指令,代表去调用父类的constructor,一定在子类的constructor最开始出现。
		//这一句就是表示在运行kids constructor的下面内容之前,需要先去运行human constructor的内容。并且human constructor必须是无参的。
		//如果human constructor有参,那么它会覆盖同名的human constructor,继而引申到kids constructor也会报错,参见下一例。
        System.out.println("这里是kids.class内部");
    }


    public void my_prt(String coming_name) {
        System.out.println(coming_name);//这里应该是my_prt从主程序来的输入信号emma
        System.out.println(this.name);//这里因该是本级的kids_name
        System.out.println(super.name);//human_name

    }

}


public class human {

    public String name = "human_name";
    public human() {
        System.out.println("这里是human.class内部");
    }


}

运行结果

这里是human.class内部
这里是kids.class内部
emma
kids_name
human_name

刚才举例中,介绍了当子类constructor运行时,必然会首先默认跑一遍父类的constructor,那句代码通常是隐藏在子类constructor第一行 写做super();
问题思考:
如果父类constructor其实被用户更改了,变成了一个有参的costructor,会发生什么。
tips:根据之前的知识,一旦出现有参的constructor,它会覆盖同名的无参constructor



public class testjan05{
public static void main(String args[]) {

kids x = new kids();}
}


public class kids extends human{

    private String name = "kids_name";


    public kids() {
        super();
		//这个super是去父类human class里面调用human constructor
		//系统默认这个父类的constructor肯定是无参的,现在人为加了参数a
		//这里一定会报错,错误见下图
        System.out.println("inside kids constructor");

    }
}



public class human {

    public String name = "human_name";

    public human(String a) {
        System.out.println("inside human constructor");
		//注意这里用户自定义的human constructor被用户增加了一个参数String a
		//原本系统在后台默默建立的无参human constructor会被用户这个有参的覆盖掉
    }
}

错误图示:
在这里插入图片描述

错误提示
Expected 1 arguments but found 0

解决方法,给super()添加一个符合父类human constructor要求的参数即可

public class kids extends human{

    private String name = "kids_name";


    public kids() {
        super("sth_random");
		//父类human constructor需要String作为输入,
		//这里随意给了一个String立刻就不报错了
        System.out.println("inside kids constructor");
    }

}


super注意点:
1.super表示调用父类的构造方法,肯定在构造方法的第一个出现,系统会偷偷加上
2.super必须只能在子类的方法或者构造方法中
3.super 和 this不能同时调用构造方法,同时写出来,肯定有一个报错

super VS this:

代表的对象不同
this:本身调用的这个对象
super:代表父类对象的应用

前提
this:没有继承人也可以用
super:只能在继承条件下才可以用

构造方法的区别
this(); 本类的构造
super(); 父类的构造

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值