super关键字与this关键字区别

定义

super关键字通过子类访问父类,有三种用法:

通过子类的方法,访问父类的成员变量,成员函数,构造函数。

this 关键字用来访问本类内容,用法也有三种:

在本类的成员方法中,访问本类的成员变量、成员函数、构造函数。

区别

this指向的是当前对象的调用,super指向的是当前调用对象的父类
因为 super 不是一个对象的引用, 不能将 super 赋给另一个对象变量, 它只是一个指示编译器调用超类方法的特殊关键字。

使用方法

第一行默认为构造函数
构造函数间的调用只能放在第一行,只能调用一次
super()和this()不能同时存在构造函数第一行

super

1.子类不写super()构造函数,编译器会自动添无参数super(),子类默认调用父类无参的构造函数。如果子类为实参构造函数,父类必须要有无参构造函数,子类才可以调用父类的构造函数

//父类
class father{
    father(){}//父类无参构造函数
}
//子类继承并且调用父类构造函数
class Son extends father{
        Son(){super();}
        }
class Test {
    public static void main(String[] args) {
        Son son = new Son();

    }
}

2.子类写含参构造函数,子类会调用父类的含参构造函数
3.自定义一个类,没有类的继承,该类中成员函数可以使用super关键字(继承了Object类,Object类是所有类的父类)

//子类
class father {
    int a=2;
    father(){System.out.println("父类构造函数");}
    public void method(){

        System.out.println("父类方法");
    }
}

class Son extends father {
    int a = 1;
    Son(){super();} //定义构造函数
    public void  method_Son(){
        System.out.println(super.a); //父类中的a
    }
    public void method(){ //子类的method覆盖父类的method
        super.method(); //访问父类中的method
        System.out.println("子类方法");
    }
}
class Test{
    public static void main(String [] args){
        Son son =new Son();
        son.method_Son();
        son.method();

        
    }
}

this

this()调用也必须是构造函数的第一条语句
super和this不能同时使用在同一个方法中,选择其一

class father {
    int a=2;
    father(){System.out.println("父类构造函数");}
    public void method(){

        System.out.println("父类方法");
    }
}

class Son extends father {
    int a = 1;
    String name;
    Son(){this.name="gaokaoli";System.out.println(name);} //定义构造函数
    Son(String n){name=n; System.out.println(name);}


    public void  method_Son(){

        System.out.println(super.a); //父类中的a
        System.out.println(this.a); //子类中的a
    }
    public void method(){
        super.method(); //访问父类中的method
        System.out.println("子类方法");
    }
}
class Test{
    public static void main(String [] args){
        Son son =new Son();
        Son son1=new Son("lxs");


        son.method_Son();
        son.method();


    }
}

还可以这样使用this
以下为简介版

//在子类中定义
	int a = 1;
    String name;
    Son(){this("lxs");} //定义构造函数
    Son(String n){name=n; System.out.println(name);}
   
//在函数中定义为
 Son son =new Son();

与c++的继承比较

1.在 Java 中使用关键字 super 调用超类的方法,而在 C++ 中则采用超类名加上::操作符的形式
2.在 C++ 的构造函数中,使用初始化列表语法调用超类的构造函数,而不调用super

总结

由于Son 类的构造器不能访问 Father 类的私有域,所以必须利用 Father 类的构造器对这部分私有域进行初始化,我们可以通过 super 实现对超类构造器的调用。使用super 调用构造器的语句必须是子类构造器的第一条语句。

如果子类的构造器没有显式地调用超类的构造器,则将自动地调用超类默认(没有参数 )的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中又没有显式地调用超类的其他构造器,则 Java 编译器将报告错误。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值