Java中的this和super

要说this和super就不得不说java的封装和继承了,首先说封装,这是一种思想,算不上一种技术,核心思想就是将对象的同一行为和状态看成是一个整体,将无需对外界暴露的属性和方法隐藏起来,比如一些方法的具体实现和一些私有的变量,通过公共的方法提供对属性的操作,从而提高安全性。

class Person {
    private String name = "无名氏";//私有的内部成员变量
    private int age = 20;//私有的内部成员变量
    public void sayHello(){//公有的方法,外界可以通过调用这个方法获得需要的功能
        System.out.println("我的名字是"+name+",今年"+age+"了");
    }
    public String getName() {//公有的方法,外界通过操作这个方法获取私有变量值
        return name;
    }
    public void setName(String name) {//公有方法,外界通过操作这个方法设置公有变量的值
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

然而这种封装也不是绝对的,当我们需要一些很相似的类的时候,往往希望能够通过一个类派生出许多的拥有共同的特性的类,比如通过动物这个类,派生出猫狗鸡鸭这些类,他们都拥有动物的特性,但是又各有特点。这就是Java中的继承,通过继承,我们可以获得父类所暴露给子类的所有成员,而又可以在父类的基础上构建自己特有的属性。

public class StaticDemo {
    public static void main(String[] args) {
        Student s = new Student();
        s.age = 20;//从父类继承的属性
        s.name = "张同学";
        s.stuNumber = 10;//子类特有的成员变量
        s.sayHello();//从父类继承的方法
        s.study();
    }
}

class Person {
    protected String name = "无名氏";// 子类共享的成员变量
    protected int age = 20;// 子类共享的成员变量

    public void sayHello() {// 公有的方法,外界可以通过调用这个方法获得需要的功能
        System.out.println("我的名字是" + name + ",今年" + age + "了");
    }

}

class Student extends Person {
    public int stuNumber = 20;// 学生特有的学号

    public void study() {// 学生特有的方法,学习
        System.out.println("好好学习!");
    }
}

至此,我们已经大概了解封装和继承,那下面就来看看this和super关键字是什么意思。
super关键字代表的是父类对象,this关键字代表的是当前对象。要理解这些,首先我们要看看子类在创建对象的时候执行了什么。为了方便起见,在此都使用无参构造方法。

  1. 编译器找到子类无参构造方法。
  2. 执行子类无参构造方法。
  3. 在子类无参构造方法的方法体中,第一句代码是隐藏得super();这句代码的意思是执行父类构造方法。
  4. 跳转到父类构造方法中,执行父类构造方法,注意,此时子类构造方法并未执行完毕,并且若父类还有父类,则一直执行上一层父类的构造方法,直到找到所有类的祖宗Object类。
  5. 将父类的对象的引用存入子类的super中,即子类中的super代表的是父类实体。然而在父类中,super代表的又是父类的父类的实体。
  6. 将创建出的当前类的引用存入this。
public class StaticDemo {
    public static void main(String[] args) {
        GirlStudent g = new GirlStudent();
        g.sayName();
    }
}

class Person {
    protected String name = "无名氏";// 子类共享的成员变量
    protected int age = 20;// 子类共享的成员变量

    public void sayHello() {// 公有的方法,外界可以通过调用这个方法获得需要的功能
        System.out.println("我的名字是" + name + ",今年" + age + "了");
    }

}

class Student extends Person {
    public int stuNumber = 20;// 学生特有的学号
    public String name = "张同学";
    public String getSuperName() {//获取当前类的父类名字的方法,对于student是父类,对于girlstudent则是爷爷类
        return super.name;//父类中的super代表的是父类的父类,即student的父类即person类,可以看出子类一旦初始化,将会创建出所有父类对象,一直到object
    }
}
class GirlStudent extends Student{
    public String name = "小红";
    public void sayName(){
        System.out.println("自己的名字是:"+this.name+",父类的名字是:"+super.name+",爷爷类的名字是:"+super.getSuperName());
    }
}

由此可以看出super的用途:用于调用子类隐藏的父类的属性,比如上述代码中的name属性,还有一个比较重要的用途就是用于调用被子类覆写的方法,此时方法名相同,必须使用super才能调用父类的方法。
this的用途:在变量定义不明确时,用来确定调用的具体是哪个变量。

    public void setName(String name){
        this.name=name;
    }

在上面的代码中由于传入的变量也是name,类中本来就存在一个变量也叫name,此时将不明确name是哪个,所以使用this进行区分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值