从零开始学Java(九) super

super this 的对比

this
this 是一个引用,保存内存地址指向自己。
 
this 出现在实例方法中,谁调用这个实例方法, this 就代表谁, this 代表当前正 在执行这个动作的对象。
 
this 不能出现在静态方法中。
 
this 大部分情况下可以省略,在方法中区分实例变量和局部变量的时候不能省 略。
 
this( 实际参数列表 ) ”出现在构造方法第一行,通过当前的构造方法去调用 本类当中其它的构造方法。
 
super
严格来说, super 其实并不是一个引用,它只是一个关键字, super 代表了当前 对象中从父类继承过来的那部分特征。 this 指向一个独立的对象, super 并不 是指向某个“独立”的对象,假设张大明是父亲,张小明是儿子,有这样一句 话:大家都说张小明的眼睛、鼻子和父亲的很像。那么也就是说儿子继承了父 亲的眼睛和鼻子特征,那么眼睛和鼻子肯定最终还是长在儿子的身上。假设 this 指向张小明,那么 super 就代表张小明身上的眼睛和鼻子。换句话说 super 实是 this 的一部分。如下图所示:张大明和张小明其实是两个独立的对象,两 个对象内存方面没有联系, super 只是代表张小明对象身上的眼睛和鼻子,因 为这个是从父类中继承过来的,在内存方面使用了 super 关键字进行了标记, 对于下图来说“ this. 眼睛”和“ super. 眼睛”都是访问的同一块内存空间。
 
 
super this 都可以使用在实例方法当中。
 
super 不能使用在静态方法当中,因为 super 代表了当前对象上的父类型特征, 静态方法中没有 this ,肯定也是不能使用 super 的。
 
super 也有这种用法:“ super( 实际参数列表 ); ”,这种用法是通过当前的构造 方法调用父类的构造方法。
 

super用于构造方法中

 
super( 实际参数列表 ); ”语法表示调用父类的构造方法,代码复用性增强了,另外一方面也是模拟现实世界当中的“要想有儿子,必须先有父亲”的道理。不过 这里的“ super( 实际参数列表 ) ”在调用父类构造方法的时候,从本质上来说并不是创建一个“独 立的父类对象”,而是为了完成当前对象的父类型特征的初始化操作。
 
当一个构造方法第一行没有显示的调用“ super( 实际参数 列表 ) ”的话,系统默认调用父类的无参数构造方法“ super() ”。当然前提是“ this( 实际参数列 ) ”也没有显示的去调用(因为 super() this() 都只能出现在构造方法第一行,所以不能并存)。
public class People {
    String name;
    boolean sex;
    public People(String name,boolean sex){
        this.name = name;
        this.sex = sex;
    }
}

public class Worker extends People {
    //子类特有的工资属性
    double salary;
    public Worker(String name,boolean sex,double salary){
        super(name,sex);
        this.salary = salary;
    } 
}

public class WorkerTest {
    public static void main(String[] args) {
        Worker w = new Worker("jack",true,10000.0);
        System.out.println("姓名:" + w.name);
        System.out.println("性别:" + w.sex);
        System.out.println("工资:" + w.salary);
    } 
}

super用于实例方法中

父类和子类中有同名实例变量或者有同名的实例方法,想在子类中访问父类中的实例变量或实例方法,则 super 是不能省略的,其它情况都可以省略。
 
//纸质书
public class PaperBook extends Book {
    String name; //在子类中也定义了一个 name 属性
    //构造方法
    public PaperBook(){
        super();
    }
    public PaperBook(String name){
        super();
        this.name = name;//这里的 this.name 代表子类的 name
    }
    //打印书名
    public void printName(){
        System.out.println("this.name->书名 : " + this.name);
        System.out.println("super.name->书名 : " + super.name);
    } 
}

public class BookTest {
    public static void main(String[] args) {
        PaperBook book1 = new PaperBook("零基础学 Java 卷 I");
        book1.printName();
    } 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值