Java基础——this关键字与super关键字 ??有关this关键字与super关键字的介绍及区别,可以参考:this与super关键字详解,这里只重点强调this关键字与super关键字中一些关键的知识点。 ??首先,this关键字与super关键字的定义:
??this:代表了所属函数的调用者对象,代表了对象的内存地址??说到this,首先先说一下命名遮挡
??this是指向本类中某一个对象的一个变量,this相当于文章中第一人称的“我”,所有人描述自己的时候都会说“我”,只要读“我”的这个人发生变化,这个“我”指向的人就变了;而this关键字与之类似,this是抽象的,刚开始并不知道是指代谁,this是每一个对象携带的变量,这个变量所指向的都是自己,this只是起到了一个描述的作用:只要有一个具体的对象来执行的时候,this就用这个对象的this,换一个对象,this就变成另一个对象的this,所以只有在执行的时候才知道指向谁。就像文章中的“我”,只有确定了谁是读这篇文章的,才能确定这个“我”指代谁;
??super:代表了父类空间的引用
【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("你好学生");
}
}
推荐阅读
- Java基础|JAVA中的位运算操作
- Java基础|mybatis plus一对多查询(经典案例)
- Java基础|spring/spring boot 自定义日志注解输出请求参数和结果
- Java基础|高并发线程/锁/内存处理模型
- 物联网|物联网平台通用后端架构设计
- Java基础|Servlet+Filter+Listenler基础入门
- Java基础|mybatisPlus代码生成器
- java基础|TCC分布式事务——设计思想及其可能遇到的问题
- java基础|mq消息积压怎么对应