this引用,final,super,protected关键字(深入浅出+详细理解)

2024-10-09 15:28:11 浏览数 (3)

一.this引用:

1.为什么要有this引用 :

可能出现的问题:1.形参名不小心与成员变量名相同?2.在调用方法时,方法里面没有,任何的对象的指引,函数不知道调用哪个对象,和打印哪个对象?

下图是第二个问题的体现:(指代不明确)

代码语言:javascript复制
public class Date {
public int year;
public int month;
public int day;
public void setDay(int y, int m, int d){
year = y;
month = m;
day = d;
}
public void printDate(){
System.out.println(year   "/"   month   "/"   day);
}

第一个问题的体现:(这里的year,month,day,是局部变量,会导致自己给自己赋值,从而导致对象被赋值为0,的问题)

2.什么是 this引用:

this 引用指向当前对象 ( 成员方法运行时调用该成员方法的对象 ) ,在成员方法中所有成员变量的操作,都是通过该 引用去访问 。只不过所有的操作对用户是透明的,即用户不需要来传递, 编译器自动完成。

注意: this 引用的是调用成员方法的对象 。从图中可以看出。this的地址调用了该构造方法的 对象 ,的地址相同。

这个是我的理解,如图:

3.this 引用的特性

(1) this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

(2) this只能在"成员方法"中使用,不能在静态方法中使用

(3)在"成员方法"中,this只能引用当前对象,不能再引用其他对象

(5)this还可以调用构造方法,和非静态的,成员方法

如图:

这里this,调用,有参数的构造方法,必须写在第一行

4 . this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收,如图这个隐藏参数,可写可不写

二.super关键字:

由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成员时,该如何操作?直接访问是无法做到的,Java 提供了 super 关键字,该关键字主要作用:在子类方法中访问父 类的成员

这里通过super,可以给父类成员,赋值(和this,调用构造方法一样,必须写在第一行)

注意:和this一样

1. 只能在非静态方法中使用

2. 在子类方法中,访问父类的成员变量和方法

三.super和 this的异同:

同:

1. 都是Java中的关键字

2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段

3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

异:

1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成 员的引用。

2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性

3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现

4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加但是this(...)用户不写则没有

四.代码块,继承后的执行顺序:(看加载我在前面博客说过:如果不知道请点击,查看 类和对象一(从封装开始讲述)-CSDN博客

1.静态代码块先执行,并且只执行一次,在类加载阶段执行,(并且,只加载一次)

2. 当有对象创建时,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行

如下:

仔细看运行结果:

五.protected 关键字:

在类和对象章节中,为了实现封装特性, Java中引入了访问限定符,主要限定:类或者类中成员能否在类外或者其他包中被访问。(这里也有,请click: 类和对象一(从封装开始讲述)-CSDN博客 )

1.用法:protected 在同一个包地下可以,任意使用,在 不同包下则,只有在 子类才能使用

看运行图:

六.final 关键字

1.1. 修饰变量或字段,表示常量 ( 即不能修改 )

代码语言:javascript复制
final int a = 10;
a = 20; // 编译出错

2. 修饰类:表示此类不能被继承 (被final修饰的类不能被继承,被其修饰的类,叫做密封类)

3.被final修饰的类,也不能被重写

0 人点赞