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
是类隐藏的属性
- 属性一般是怎么定义的?
[static] [public\private\protected] [dataType] [name] = [初始化值];
- 对于
this
而言是怎么定义的呢?
private ThisClass this = thisObject;
- 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
是对本对象的引用
- 在其他类中也可以定义对
Test
类的引用,但this
是在类内部对本对象的引用,这殊荣是独一份儿,这也就意味着,this
也可以访问到对象中private
限制的属性或方法,这是非常方便的。
this
调用构造器
- 语法:
this(parameterList);
来调用类中对应的构造器 - 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 ^