Java笔记_this关键字
2024-10-21 12:58:05
this关键字
引出this的使用场景:
案例一(通过案例一来引出this的使用场景):
/**
* @ClassName This02
* @Description TODO
* @Author Orange
* @Date 2021/4/21 15:17
* @Version 1.0
**/
public class This02 {
public static void main(String[] args) {
Cat cat1 = new Cat("大壮", 3);
cat1.info();
}
}
class Cat {
int age;
String name;
//如果我们的构造器的形参能够直接写成属性名,就更加方便了(起名更加简单)
// public Cat(String dName,int dAge) {// 构造器
// name = dName;
// age = dAge;
// }
//输出结果如下:
//大壮 3
//于是有以下的尝试 ↓
// public Cat(String name, int age) {//构造器
// name = name;
// age = age;
// }
//输出结果如下:
//null 0
// 原因分析:因为一个是name是形参name,一个是属性name,
// 这里只是将属性name(值为null)再赋给属性name了而已!
//于是我们可以引出相应的解决方法— — — — this!
public Cat(String name, int age) { //构造器
this.name = name; //this.name指的是所调用对象的属性
//而name指的则是形参 name !
this.age = age;
}
//输出结果如下:
//大壮 3
public void info() { //成员方法,用来输出成员信息
System.out.println(name + "\t" + age + "\t");
}
}
案例二(通过案例二来深入了解this在内存中的使用情况):
/**
* @ClassName This01
* @Description TODO
* @Author Orange
* @Date 2021/4/21 14:12
* @Version 1.0
**/
public class This01 {
public static void main(String[] args) {
//hashCode是一种哈希表值,它虽不是真是的地址值
//但是它是由地址生成的一个特殊的对应值,可以通过它来观察this在使用原理
Dog_dog FG = new Dog_dog("峰哥",3);
System.out.println("FG的hashCode = " + FG.hashCode());
FG.info();
Dog_dog FGNB = new Dog_dog("峰哥牛逼!", 4);
System.out.println("FGNB的hashCode = " + FGNB.hashCode());
FGNB.info();
}
}
class Dog_dog {
int age; //属性age
String name; //属性name
public Dog_dog(String name, int age) { //构造器
//this.name就是当前对象的属性name,当前对象就是那个对象在调用,就是指那个对象的属性
this.name = name;
//this.age就是当前对象的属性age
this.age = age;
System.out.println("this.hashCode = " + this.hashCode());
}
public void info() { //成员方法,输出成员X的信息
System.out.println(name + "\t" + age);
}
}
/*
程序运行结果:
-------------------------------
this.hashCode = 460141958
FG的hashCode = 460141958
峰哥 3
this.hashCode = 1163157884
FGNB的hashCode = 1163157884
峰哥牛逼! 4
-------------------------------
*/
练习
/**
* @ClassName This_Exercise01
* @Description TODO
* @Author Orange
* @Date 2021/4/22 10:06
* @Version 1.0
**/
//定义一个Person类,里面有name,age属性,并提供compareTo比较方法,
// 用于判断是否和另外一个人相等,提供测试类TestPerson用于测试,
//名字和年龄完全一样,就返回true,否则返回false
public class This_Exercise01 {
public static void main(String[] args) {
Person p1 = new Person("峰哥", 20);
Person p2 = new Person("峰哥", 20);
System.out.println("p1和p2比较的结果 = " + p1.compareTo(p2));
}
}
class Person {
String name;
int age;
public Person (String name, int age) {
this.name = name;
this.age = age;
}
//compareTo比较方法
public boolean compareTo(Person p) {
//名字和年龄完全一样
// if(this.name.equals(p.name) && this.age == p.age) {
// return true;
//
// }else {
// return false;
// }
return this.name.equals(p.name) && this.age == p.age;
}
}
/*
程序运行结果:
-----------------------
p1和p2比较的结果 = true
----------------------
*/
小结
通过案例二可以知道this就是访问本类的成员方法
但有点不好理解,我的理解就是this相当于一个“对象的形参”,当外部创建了一个本类的新对象时,会将那个对象所指向的堆地址(对象所在的区域)值赋给this,让其也指向相同的堆地址区域,从而实现对象的属性和方法传递的效果,如果外部又有新的对象被创建,那么this又可以指向新对象所指向的地址区域。
最最最通俗易懂的说法:
青哥(对象一)说:“我的眼睛很大”,这个"我"(this)指的是青哥(对象一),眼睛(属性)是青哥的眼睛,大(方法)是青哥的眼睛大;
而峰哥(对象二)说:"我的眼睛很小",同样是"我",这个"我"(this)却指的是峰哥(对象二),眼睛(属性)是峰哥的眼睛,小(方法)是峰哥的眼睛小.
最新文章
- Unable to make the session state request to the session state server处理
- twitter点赞动画详解
- jmx : ClientCommunicatorAdmin Checker-run
- J2EE 第二阶段项目(八)
- 关于使用Jsonp做跨域请求
- AngularJs练习Demo6
- 【Android Developers Training】 41. 向另一台设备发送文件
- scrapy回调函数传递参数
- ITU-T Technical Paper: QoS的构建模块与机制
- 看图说话,idea 远程调试 tomcat下项目
- .net上的 jpa
- Servlet会话管理三(HttpSession)
- MySQL快速建立测试表
- java对存放实体的list进行排序
- 【考古向翻译】Pwn2Own 2010 Windows 7 Internet Explorer 8 exploit
- 关于 javascript:void(0) 的问题.
- fft 远程服务器返回错误 550返回码
- java开发注解大全
- Visual Staudio 2015 打开指定文件,定位到指定文件目录下
- 前端 javascript 定时器