一.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修饰的类,也不能被重写