目录
一、前言
对于学习Java的同学们来说,了解this、super我们学习Java的必经之路,只有我们真正的深入了解之后,我们才能将其化为自己的工具,加以使用。本篇博客,将带大家由浅入深,循序渐进的了解他们的本质,脱去其专有名词的外衣,让其与生活接轨。
二、this关键字
关键字this表示每个实例对象指向自己的引用,可以出现在实例方法和构造方法当中,不能出现在static修饰的类方法(静态方法)当中。
原因:因为,this相当于对象自己的内存地址,用this就是去找对象那一块空间,static修饰的变量或者方法已经超然脱离对象这一内存范围,你再去对象那一块空间找,肯定找不见。【static关键字的详解见博主的另一篇文章】
1.疑点解答
(1)什么是实例对象
Java中new出来的对象叫做实例,说白了就是这个new出来的“东西”,叫它对象也可以,叫它实例也可以。举个例子:当我们有一个Person类,在这时我们Person zhangsan=new Person()那么zhangsan就是一个实例对象,当我们这个宽范围的类去new出一个实例化的东西(对象)时,那个东西就叫做实例对象。
(2)什么是引用
当我们每实例化一个对象时,我们的Java就会在内存当中开辟出一块空间来存放这个对象。而引用就是找到这块空间的一张地图。我们就可粗略的将引用当作是一个变量,一个保存这块空间内存地址的一个变量。
(3)实例方法和构造方法以及成员变量和局部变量
实例方法和构造方法总的来说都为类中的方法,他们只不过有着作用上以及形式上的区别,但回归本质,其都为方法。在此处我们可粗略的认为,在类当中不带static修饰符修饰的方法都可以使用this。(原因见后文)
成员变量就在类声明之后一开始创建的那几个变量,他们可以作用于类这个成员的任意位置,所以成员变量可以作用在整个类中。而局部变量就是创建在方法这个局部空间中,一旦出了这个局部空间就会失效,故,局部变量只在方法体内有效。
2.简单理解
this其实就是一个变量,一个保存内存地址的一个变量,而这个内存地址就是其对应new出来的那个东西的。我们可以通过这个“变量”来找到这块内存(对象),从而可以对这个内存当中的对象进行调整。
3.使用场景
1.用在实例方法和构造方法当中
我们类中的有些方法有时候需要我们的成员变量的一些数据,这些成员变量如同实例对象一样放在了那块内存当中。如果我们要用,我们就得通过this这个保存那块地址的东西才能找见那些数据从而修改使用。
2.区分成员变量和局部变量
我们有时候在一个方法中定义了一个变量x(局部变量),但类一开始创建的时候也定义了一个x(成员变量),我们有时候就想在这个方法里面就去用或者修改那个成员变量x,这个时候我们就能用this告诉计算机,你用我给你这个地址去找一下实例对象当中的那个成员变量x,这样就区分了局部变量和成员变量。
4.案例讲解
package com.Linhai.Test2;
public class demo {
public static void main(String[] args) {
GetSum getSum = new GetSum();
getSum.getSum(1,2); //调用getSum方法,并传入1和2两个值
}
}
class GetSum {
int x=20; //成员变量x
int y;
int sum;
public int getSum(int x, int y) { //局部变量x
sum=x+y;
System.out.println("成员变量x的值为:"+this.x); //用在实例方法当中访问成员变量的值
System.out.println("局部变量x的值为:"+x);
System.out.println("getsum这个实例对象的内存地址为:"+this);
return sum;
}
}
//输出结果
成员变量x的值为:20
局部变量x的值为:1
getSum这个实例对象的内存地址为:com.Linhai.Test2.GetSum@49e4cb85Process finished with exit code 0
三、super关键字
1.使用场景
子类在继承父类时,可能会出现变量隐藏、方法覆盖等现象。如果在这时子类需要调用或者访问父类被隐藏的变量或者方法时,就会需要super关键字。
- 用来访问父类被覆盖的方法
- 用来调用父类中被隐藏的成员变量
- 用来调用父类当中的构造方法(包括有参、无参等)
2.疑点解答
变量隐藏:指子类的成员变量与父类的成员变量具有相同的名字时,此时,调用该成员变量,默认调用子类的成员变量,而父类的成员变量亦被称作是“变量被隐藏”。
方法覆盖:子类的方法名和父类的方法名一样,方法的返回值类型,入口参数的数目、类型、数据均相同,只是方法的实现功能不同时,此时父类的方法就会被隐藏,而在调用该方法时,默认调用子类的方法,而父类的方法因被隐藏而无法调用。
不严谨分析:我们也可以将super类似this的理解方式,super也是一个变量,这个变量保存的是父类的实例对象的地址,我们可以根据这个地址的,精确的寻找到父类藏起来的方法以及变量,将其揪出,修改使用。
3.案例分析
package com.Linhai.Test2;
public class Test {
public static void main(String[] args) {
Students students = new Students();
}
}
class People {
String address = "中国"; //默认中国人地址在中国
public void toDo() {
System.out.println("这是父类toDo方法");
}
}
class Students extends People {
String address = "山西"; //默认太原理工大学人在山西
public Students() {
System.out.println("调用子类的局部变量" + address);
System.out.println("调用被隐藏父类的局部变量" + super.address);
super.toDo(); //调用父类的toDo方法
toDo(); //没使用super调用的是子类的toDo方法
}
@Override//方法重写
public void toDo() {
System.out.println("这是子类toDo方法");
}
}
输出结果:
调用子类的局部变量山西
调用被隐藏父类的局部变量中国
这是父类toDo方法
这是子类toDo方法
编写不易,如有帮助点赞收藏,如有问题可联系博主qq2280006919
@Hanpig编写