黑马程序员——Java基础---this和super关键字

时间:2021-07-24 00:43:11

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


一.this关键字

每当一个对象创建后,Java虚拟机会给这个对象分配一个引用自身的指针,这个指针的名字就是 this。因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this的用法。成员方法是可以访问成员属性的,对于一个类中的"成员属性",是每个对象都拥有一份独立存储空间,对于"成员方法",是所有对象共享一个"方法空间";

需要注意的是:
1.this是一个隐式的变量;任何类都有的;
2.this是在实例化此类对象时,会被赋值成当前对象的地址;
3.一般情况下,this 是Java内部隐式使用的。
4.有些时候我们需要必须显示的使用:局部变量覆盖成员变量时,如果要访问成员变量,可以使用:this.成员变量名

举例:

<span style="white-space:pre"></span>class Student
<span style="white-space:pre"></span>{<span style="white-space:pre"></span>
String stuName;
int num;
void show(){
int num = 1;
num = 10;
System.out.println("大家好,我叫:" + stuName);
System.out.println("num = " + num);//局部变量覆盖成员变量。默认使用"就近原则",访问的是局部变量的num。
System.out.println("this.num = " + this.num);
System.out.println("this.stuName = " + this.stuName);//访问的就是被覆盖的成员变量;
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>class Test1
<span style="white-space:pre"></span>{
public static void main(String[] args)
{
Student stu = new Student();
stu.show();//大家好,我叫:null
stu.stuName = "张三";
stu.show();//大家好,我叫:张三

Student stu2 = new Student();
stu2.stuName = "李四";
stu2.show();
}
}
运行结果:

黑马程序员——Java基础---this和super关键字

二.super关键字

在子类继承父类时,当子类成员变量覆盖父类成员变量时,我们还需要访问父类的成员变量时用super才能访问;子类构造函数调用父类构造函数时用super()调用,在子类中的构造方法,默认情况下会在第一行自动添加一句:super();该语句调用父类的无参的构造方法;.super始终是指向父类的空间,通过super可以访问父类的成员

举例:

<span style="white-space:pre"></span>class A{
A(int a){
}
}
class B extends A{
B(int n){
super(n);
}
}
注意事项:
1.如果父类没有无参的构造方法,那么子类的构造方法中,就必须使用super()去显示的去调用父类的某个带参的构造方法;
2.在子类的构造方法中调用父类的构造方法使用super().这里也要求super()必须是这个构造方法的第一句话;
3.在子类的构造方法中,不能即使用this()又使用super();因为都需要在第一句话;

举例:

<span style="white-space:pre"></span>class A{
int num = 10;
A(int b){
System.out.println("a2");
}
A(String a){
System.out.println(a);
}
void fun(){
System.out.println("父类的fun()方法");
}
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>class B extends A
<span style="white-space:pre"></span>{
B(int n){
super(n);//调用了父类的带一个int参数的构造方法;
System.out.println("a3");

}
B(String a ){
super(a);
}
int num = 20;
void show(){
System.out.println("num = " + super.num);//父类的num
super.fun();//父类的fun()方法
}
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>class Demo
<span style="white-space:pre"></span>{
public static void main(String[] args)
{
B b1=new B(1);
b1.show();
B b=new B("aaaaa");
}
<span style="white-space:pre"></span>}
运行结果:

黑马程序员——Java基础---this和super关键字

三.this和super的区别

1.this: 1)始终指向当前对象的引用,
2)访问当前对象的成员属性、成员方法、构造方法;
3)查找是从当前类中查找,如果没有,向父类查找;
4)必须使用this的场景:
(1).局部变量覆盖成员变量:使用this去访问成员变量
(2).一个构造方法调用另一个构造方法,必须使用this()去调用;必须放在此构造方法的第一句话;
  2.super:1)始终指向父类对象的引用:
    2)访问父类对象的成员属性、成员方法、构造方法;
    3)必须使用super的场景:
(1).子类的成员变量覆盖父类的成员变量,使用super去访问父类的成员变量;
(2).父类没有无参构造方法,子类的构造方法必须显示的使用super()去调用父类带参的构造方法;必须放在此构造方法的第一句话;