this和super的详谈

发布时间:2024年01月23日

this是当前对象的引用

1.形参名与成员变量名相同时

public class Date {
 public int year;
 public int month;
 public int day;

public void setDay(int year, int month, int day) {
  this.year = year;
  this.month = month; 
  this.day = day;
}

public void printDate() {
System.out.println(this.year + "/" + this.month + "/" + this.day);
}

}

this.year指的是成员变量中的year;这样程序就知道了是给成员变量赋值的

2.继承背景下的

super相当于是子类对象从父类对象继承下来的部分成员引用

? ? ? ?当子类和父类中出现了相同名字的成员变量时,优先是访问子类的,如果就是要访问父类的那么可以用super.data来访问父类中的普通成员变量

class Animal {
            public String name;
            public int  age;

            public Animal(String name, int age) {
                this.name = name;
                this.age = age;
            }

            public  void eat() {
                System.out.println(name + "吃饭!");
            }

        }

        class Dog extends Animal{
            //傻狗  是狗的属性
            public boolean silly;
            //public String name = "hello";

            public Dog(String name,int age,boolean silly) {
                //1. 先帮助父类部分初始化 必须放到第一行
                super(name,age);
                //super(); 不写构造方法 默认就是这个不带任何参数的,会调用父类的构造方法
                this.silly = silly;
            }

            public void houseGuard () {
                System.out.println(super.name+"正在看家护院!");
                //实例内部当中 才会包含外部类的this
                //System.out.println(Animal.this.name+"正在看家护院!");
                //eat();
            }

            @Override
            public void eat() {
                System.out.println(name+"正在吃狗粮!");
            }

        }

? ? ? ? 注意上述代码:Animal被Dog继承了,那么当我实例化Dog这个对象的时候,从父类(Animal)继承过来的数据如何进行初始化呢?

1.对象的初始化一定得调用构造方法,如果自己不写你们编译器会自己调用一个不带任何参数的构造方法

2.在子类构造完成之前得先帮父类完成初始化

3.在子类构造方法中,并没有写任何关于基类构造的代码,但是在构造子类对象时,先执行基类的构造方法,然后执行子类的构造方法,这是因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 ??。父子父子肯定是先有父再有子,所以在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整

总结

相同点

  1. 都是Java中的关键字
  2. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
  3. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段

不同点

  1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
  2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
  3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
  4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有
文章来源:https://blog.csdn.net/weixin_43497876/article/details/135715216
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。