JavaSE基础学习|Java基础——this关键字与super关键字

Java基础——this关键字与super关键字 ??有关this关键字与super关键字的介绍及区别,可以参考:this与super关键字详解,这里只重点强调this关键字与super关键字中一些关键的知识点。 ??首先,this关键字与super关键字的定义:

??this:代表了所属函数的调用者对象,代表了对象的内存地址
??this是指向本类中某一个对象的一个变量,this相当于文章中第一人称的“我”,所有人描述自己的时候都会说“我”,只要读“我”的这个人发生变化,这个“我”指向的人就变了;而this关键字与之类似,this是抽象的,刚开始并不知道是指代谁,this是每一个对象携带的变量,这个变量所指向的都是自己,this只是起到了一个描述的作用:只要有一个具体的对象来执行的时候,this就用这个对象的this,换一个对象,this就变成另一个对象的this,所以只有在执行的时候才知道指向谁。就像文章中的“我”,只有确定了谁是读这篇文章的,才能确定这个“我”指代谁;
??super:代表了父类空间的引用
??说到this,首先先说一下命名遮挡
【JavaSE基础学习|Java基础——this关键字与super关键字】??命名遮挡(name shadow):局部变量、形参或者其他,与属性、方法或者其他重名导致直接通过名字访问出现歧义。
??因此可以通过this调用本类方法及属性: ???通过this<关键字>调用本类属性:只要在类中访问类的属性,一定要加上this关键字。 ???类的某个构造方法通过this()<方法>调用其他的构造方法,this调用构造方法必须出现在构造方法的第一行(编译期错误),也不允许成环(编译期错误)
class Person{ public Person() { this(15); } public Person(int value) { } }

???通过this<关键字>调用本类中普通方法(this.方法名(参数)):当有类的继承关系时,表示本类方法一定要加上this关键字区别于super本类中没有找子类中的同名方法。 ??this就如上面描述的一样,代表这个类对象本身。实际上就是那个"我",但具体这个"我"指的是谁,和该类的对象密切相关。下面说一下super关键字,super关键字大多作用于方法之上。 ???当super()<方法>用于子类构造方法时: ????当子类调用父类无参构造时(系统默认会调用),super()可写可不写,表示调用父类的无参构造方法。 ????当子类调用父类有参构造时,super(参数列表)必须要写,要告诉编译器调用的到底是父类的哪个有参构造方法。 ???特别要注意的是: ????当父类中没有无参构造器(无论是默认生成还是自己手写),子类构造器中必须使用super(参数列表)调用父类的有参构造方法。且必须是出现在子类构造方法的第一行语句。 ????如果是父类存在自定义的无参构造(无论有无有参构造,只要存在无参构造系统就会默认调用),子类可以不直接使用super(),系统默认会调用父类无参构造的。
class Person{ public Person() { } public Person(int value) { } } class Student extends Person{ public Student() { } }

????若父类没有无参构造,就必须得使用super()调用父类有参构造。
class Person{ public Person(String value) { } } class Student extends Person{ public Student() { super("hello"); } }

????this()和super()不能同时出现在构造方法中(都要出现在第一行),注意:此处指的是this()这个函数(调用本类其他构造方法),而不是this(值当前类的实例对象) ???当super<关键字>用于子类普通方法时:用于在子类中明确调用父类被覆写的方法。如果不使用super进行调用,子类调用的是子类重写父类的方法。
class Person{ public void fun(){ System.out.println("我是学生"); } public void show(){ System.out.println("你好人类"); } } class Student extends Person{ public void fun(){ System.out.println("我是学生"); // 此处调用的show()是子类覆写父类的方法 show(); } public void show(){ System.out.println("你好学生"); } }

class Person{ public void fun(){ System.out.println("我是学生"); } public void show(){ System.out.println("你好人类"); } } class Student extends Person{ public void fun(){ System.out.println("我是学生"); // 此处调用的show()是子类明确调用父类被覆写的方法 super.show(); } public void show(){ System.out.println("你好学生"); } }

    推荐阅读