Java关键字this和super浅析

一.关键字this

this是指向当前类对象的一个变量,当前哪个对象调用,this就指向哪个成员

特点

  1. this可以访问当前对象中的属性、方法、构造器;
  2. 当局部变量和当前类的属性同名时,this可以区分两者;
  3. 可以通过this.属性名访问类中的属性;
  4. 可以通过this.方法名(实参列表)访问类中的方法;
  5. this只能在构造器中访问其它形式的构造器,通过this(实参列表)来访问构造器;
  6. this只能在类定义的方法中使用,不能在类外使用;
  7. this调用其它形式的构造器时,只能放在当前构造器中的第一行;
    示例:
package This;

public class Base {
    Base(){}
    Base(int num){
        //通过this区分同名的局部变量和属性
        this.num = num;
    }
    Base(int num1, int... nums){
        //this在当前构造器的第一行调用单个参数的构造器
        this(num1);
    }
    
    private int num;
    public void showNum() {
        //this调用属性
        System.out.println(this.num);
    }
    
    public void printNum(){
        System.out.println("Study hard, Work hard");
        //this调用方法
        this.showNum();
    }
}

二.关键字super

super是父类对象的引用,通过super可以调用父类的属性、方法、构造器

特点

  1. super访问的父类并不仅仅是直接父类,而是所有的上层具有继承关系的类;
  2. super可以访问父类的属性,通过super.属性名来访问;
  3. super可以访问父类的方法,通过super.方法名(实参列表)来访问;
  4. super访问父类的构造器,但是只能放在构造器的第一行;
  5. super和this两者不能出现在同一行,也就是通过super调用父类构造器时,不能通过this调用当前类的其它形式的构造器。
    示例:
package Super;

public class Father {
    String character;   //性格
    String hairColor;   //发色
    int IQ;             //智商

    Father(){}

    Father(String character, String hairColor, int IQ){
        this.character = character;
        this.hairColor = hairColor;
        this.IQ = IQ;
    }

    Father(int IQ){
        this.character = "自由生成";
        this.hairColor = "黑色";
        this.IQ = IQ;
    }
}

package Super;

public class Son extends  Father{
    String temperament;     //气质

    Son(){
        //什么都不写等价于 super();
    }

    Son(String character, String hairColor, int IQ, String temperament){
    	//调用父类构造
        super(character, hairColor, IQ);
        this.temperament = temperament;
    }

    Son(String temperament){
    	//这里不能使用this,因为this和super在构造器的第一行只能有一方存在
        super();
        this.temperament = temperament;
    }
}
  1. super向上查找属性或方法时,遵循就近原则,也就是上层最近的哪个父类中有对应的属性和方法就调用该属性或方法;
    super查找遵循就近原则示例:
package Super;

//祖先类
public class Ancestor {
    public int num = 1;
}

package Super;

//父类
public class Base extends Ancestor{
    //public int num = 2;
}


package Super;

//子类
public class Derive extends Base{
    public int num = 3;

    void showNum(){
        System.out.println(super.num);
    }
}

package Super;

//主线程类
public class Main {
    public static void main(String[] args) {
        Derive derive = new Derive();
        derive.showNum();
    }
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值