/**
* 关于java语言当中的this关键字:(其内存图见下图)
* 1、this是一个关键字,翻译为:“这个”
* 2、this是一个引用,它是一个变量,this变量中保存的内存地址指向了自身,this存储在JVM堆内存java对象的内部
* 3、每个java对象中都有this这个变量,创建多少个对象,就有多少个this。
* 4、this出现在“实例方法”当中,this指向当前正在执行这个动作的对象。(this代表当前对象)
* 5、多数情况下this是可以省略的。
* 6、this不能在带有static的方法中直接使用,在静态方法中不能直接访问实例变量和实例方法,因为访问实例变量和实例方法都需要对象的存在
* 7、this什么时候不能省略:用来区分实例变量和局部变量的时候“this”不能省略(比如:有参构造方法和setter方法中this不能省略)
* 8、this可以使用在构造方法当中,作用是通过当前的构造方法调用其他构造方法,作用是代码复用
* - 语法格式:this(实参);
* - this()这种语法只能出现在构造方法的第一行
*/
public class ThisText {
// 实例变量
int i = 20;
// 静态变量
static int k = 10;
// 静态方法
public static void doSome(){
System.out.println("do some!");
}
// 实例方法
public void doOther(){
System.out.println("do other!");
}
// 静态方法
public static void method1(){
// 在静态方法中调用静态方法doSome 完整的方式
ThisText.doSome();
// 同一个类中静态方法调用静态方法doSome 的省略方式
doSome();
// 在静态方法中调用实例方法doOther 需要有对象的参与 完整的方式如下
// 创建ThisText对象
ThisText t1 = new ThisText();
t1.doOther();
// 在静态方法中调用实例方法doOther 没有省略的方式
// 在静态方法中访问静态变量k的完整方式
System.out.println(ThisText.k);
// 在静态方法中访问静态变量k的省略方式(省略"类名.")
System.out.println(k);
// 在静态方法中访问实例变量i 需要有对象的参与 完整的方式
System.out.println(t1.i);
// 在静态方法中访问实例变量i 没有省略的方式
}
// 实例方法
public void method2(){
// 在实例方法中调用静态方法doSome 完整的方式
ThisText.doSome();
// 在实例方法中调用静态方法doSome 省略的方式
doSome();
this.doSome();// 带有static关键字的静态方法应该采用"类名."的正规方式访问,但是通过"引用."的方式访问也是可以的,
// 只不过实际执行的时候和引用指向的对象无关,并且当引用为空的时候,也不会出现空指针异常。
// 当采用"引用."来访问静态方法的时候“IDEA软件”会出现警告,程序仍然可以执行。
// 在实例方法中 调用实例方法doOther 完整的方式 因为实例方法method被调用的时候已经有了对象,此位置的this就是指向这个对象,
this.doOther();
// 在实例方法中调用实例方法doOther 省略的方式 (省略了this)
doOther();
// 在实例方法中访问静态变量k 完整的方式
System.out.println(ThisText.k);
System.out.println(this.k);//这里访问静态变量是使用的"引用.",虽然可以,但是不建议这样使用
// 在实例方法中访问静态变量k 省略的方式
System.out.println(k);//这里省略了"类名."
// 在实例方法中访问实例变量i 完整的方式
System.out.println(this.i);
// 在实例方法中访问实例变量i 省略的方式
System.out.println(i);
}
// 主方法(也是静态方法)
public static void main(String[] args) {
// 编写程序调用静态方法method1 完整方式调用
ThisText.method1();
// 编写程序调用静态方法method1 省略方式调用
method1();
// 创建ThisText对象
ThisText tt = new ThisText();
// 编写程序调用method2 完整方式调用
tt.method2();
// 编写程序调用method2 没有省略方式
}
}