java this的深入理解

1.引入
  • 构造器的参数与属性命名的冲突:
public class Test{

	String name;
	int age;

	public Test(String name, int age){
		name = name;
		age = age;
	}
}
  • 假如像上述代码一样来定义构造器,是不会报错的,局部变量允许与属性同名,但是判定规则是就近原则,构造方法中的name都与构造器的参数列表中的变量更近,因此,这个构造器就是自己给自己赋值,完全没有访问到属性。
  • 因此,我们引入this关键字,this表示本对象,代码改为这样就可以达到目的:
public class Test{

	String name;
	int age;

	public Test(String name, int age){
		this.name = name;
		this.age = age;
	}
}
2.this可以做什么?
public class Test{

	String name = "胖虎";
	int age;

	// 1.this可以出现在属性中
	char fName = this.name.charAt(0);//假设只有一个字的姓

	// 2.在代码块中使用this
	{
		System.out.println("代码块中使用this..." + this.name);
		System.out.println("属性中使用this的结果 fName = " + this.fName);
	}

	// 3.在构造器中使用this
	public Test(String name, int age){
		this.name = name;
		this.age = age;
	}

	// 4.在方法中使用this
	public void setAge(int age){
		this.age = age;
	}

	// 5.在构造器中利用this来调用构造器
	public Test(){
		this("panghu", 8);//可以这样调用上面的那个构造器,但是这句话必须在第一句,不然会报错
	}

	public static void main(String[] args) {

		Test t = new Test();
		System.out.println("name = " + t.name + "  age = " + t.age);
	}//main结束

}//类结束

以下是运行结果:
代码块中使用this...胖虎
属性中使用this的结果 fName = 胖
name = panghu  age = 8
  • 从上述代码我们发现,this可以在类的任何地方被访问到,这与类的属性特性非常像。实际上,this可以理解为类隐藏的一个属性,This this = 本对象地址,它指向对象本身。
  • 我们获取this的类型如下:
public class Test{

	{
		System.out.println(this.getClass().getName());
	}

	public static void main(String[] args) {
		new Test();
	}
}
以下是运行输出结果:
Test

这段代码表明this的数据类型就是Test

  • 接下来证明this是指向本对象的:
    思路是: 新建一个对象获得其地址,再获得该对象内部this地址,我们都早知道java屏蔽了底层地址,但是提供了对象的哈希码值
    以下是Object.hashCode()函数的说明:
    在这里插入图片描述
    以下是Object.equals(Object)函数的说明:
    在这里插入图片描述代码及运行结果如下:
public class Test{

	{//代码块
		System.out.println(this.hashCode());
	}

	public static void main(String[] args) {

		Test t = new Test();

		System.out.println(t.hashCode());

		System.out.println(t.thisClass(t));
		
	}

	public boolean thisClass(Test thisClass){

		if(this.equals(thisClass)){//判断是否是同一对象
			return true;
		}else{
			return false;
		}
	}
}
运行结果如下:
366712642
366712642
true

这段代码证明了两者是同一个对象。

  • 我们也可以做一些非常好玩的事情,如下:
public class Test{

	String name;
	int age;
	Test my = this;

	public Test(String name, int age){
		my.name = name;
		my.age = age;
	}
}
  • 其实这个this真的很像我们平时说的“我的”,就给this换个名字也未尝不可,是不是很好玩^ V ^
3.this的特性
  • this是类隐藏的属性
  1. 属性一般是怎么定义的?
[static] [public\private\protected] [dataType] [name] = [初始化值]
  1. 对于this而言是怎么定义的呢?
private ThisClass this = thisObject;
  1. private决定了,this只能在类内部使用,不能在类外部被直接访问;非静态决定了,在静态代码块是不可以访问到this的,就比如main方法就不可以:
/**
 * 本章测试类
 */

public class Test{

	String name = "胖虎";
	int age = 8;

	String tName = this.this.name;

	public static void main(String[] args) {
		
		Test t = new Test();

		System.out.println(this.age);

		System.out.println(t.this.name);
	}
}
以下是运行结果:(部分报错需分批出现)
Test.java:10: 错误: 从发行版 8 开始, 'this' 只能作为接收方类型的参数名, 
该参数必须为第一个参数
        String tName = this.this.name;
                            ^
Test.java:16: 错误: 无法从静态上下文中引用非静态 变量 this
                System.out.println(this.age);
                                   ^
Test.java:18: 错误: 找不到符号
                System.out.println(t.this.name);
                                   ^
  符号:   类 t
  位置: 类 Test
10行那个奇思妙想很好玩,可惜JDK 8.0 后就玩不了了;
18行那个找不到符号的错误,我猜测可能是找不到可以调用this的类吧,
毕竟this必须作为第一个参数出现,只能有this.语法出现,不能出现.this的情况。
  • this是对本对象的引用
  1. 在其他类中也可以定义对Test类的引用,但this是在类内部对本对象的引用,这殊荣是独一份儿,这也就意味着,this也可以访问到对象中private限制的属性或方法,这是非常方便的。
  • this调用构造器
  1. 语法:this(parameterList);来调用类中对应的构造器
  2. this调用构造器只能在构造器中使用,并且只能是构造器的第一条语句,这意味着,只能使用一条this调用构造器的语句。
/**
 * 本章测试类
 */

public class Test{

	String name = "胖虎";
	int age;

	public Test(String name, int age){
		this.name = name;
		this.age = age;
	}

	public Test(){
		// this.name = "panghu";
		// this("xiaofeng", 6);
		this("panghu", 8);
	}

	public static void main(String[] args) {

		Test t = new Test();
		System.out.println("name = " + t.name + "  age = " + t.age);
	}//main结束
}//类结束
输出结果:
name = panghu  age = 8

若在调用构造器语句前有任何语句都会报错:
Test.java:18: 错误:this的调用必须是构造器中的第一个语句
                this("panghu", 8);
                    ^
1 个错误
5. more…

打字不易,如果对你有用,给个赞再走哦^ V ^

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值