Java笔记 —— this 关键字
Java笔记 —— this 关键字
h2{
color: #4ABCDE;
}
a{
color: blue;
text-decoration: none;
}
a:hover{
color: red;
text-decoration: underline;
}
pre{
border: solid 1px #CCCCCC;
border-radius: 3px;
background-color: #F8F8F8;
margin: 15px;
overflow: auto;
font-size: 13px;
font-family: consolas, courier, monospace;
line-height: 20px;
padding: 6px 10px;
tab-size: 4;
}
p.textRight{
text-align: right;
}
p.header{
color: #787878;
font-size: 20px;
font-family:楷体,"微软雅黑",arial;
font-weight:bold;
}
一、一般形式
this 有两种形式:
1)不含参数列表,例如:this.age , this.speak() , this 等等
2)含参数列表,例如:this(10) , this("Hello World !") 等等
[ 返回顶部 ]
二、不含参数列表
this 关键字的由来
package com.example; public class Person{
public void speak(String s){
System.out.println(s);
}
}
package com.example; public class Test{
public static void main(String[] args){
Person p1 = new Person();
Person p2 = new Person(); p1.speak("This is p1");
p2.speak("This is p2");
}
}
1)这里用 new 创建了两个 Person 对象,对象的引用分别是 p1 和 p2
2)p1 和 p2 都调用了 speak 方法,那么 speak 方法怎么知道是 p1 对自己进行调用还是 p2 对自己进行调用呢?其实编译器暗自把 “对象的引用” 作为第一个参数传递给 speak 方法,所以实际上 speak 方法调用的形式为:
- Person.speak(p1, "This is p1")
- Person.speak(p2, "This is p2")
这是内部的表示形式,但是我们对 speak 方法进行调用的时候不能这样写
3)从上面表述中我们知道,在 speak 方法中有对象的引用,那么我们怎么才能得到这个引用呢?答案是:使用 this 关键字。
返回对象的引用
package com.example; public class Animals{
private int number; public void setNumber(int n){
number = n;
}
public int getNumber(){
return number;
}
public Animals getObject(){
return this; //返回对象的引用
}
}
package com.example; public class Test{
public static void main(String[] args){
Animals A1 = new Animals();
A1.setNumber(100);
System.out.println("A1: number=" + A1.getNumber()); Animals A2 = A1.getObject(); // 使得 A2 与 A1 引用的对象相同
System.out.println("A2:number=" + A2.getNumber()); Animals A3 = new Animals();
System.out.println("A3:number=" + A3.getNumber());
}
}
运行结果: A1: number=100
A2:number=100
A3:number=0
1)可以看到,A1 和 A2 中 number 的值都是100,而 A3 中 number 的值是0
2)看 Animals A2 = A1.getObject(); 这一行,A1 调用 getObject()方法,所以返回的 this 就是 A1,该行代码等同于 A2 = A1;
3)A1 和 A2 指向同一个对象,A3 指向另外一个对象,不同对象的内存区域不同,所以 A3 中 number 的值才会是默认值0
防止属性名称与局部变量名称冲突
package com.example; public class Person{
public String name; // 属性
public int age; public Person(String name, int age){ // 局部变量
this.name = name;
this.age = age;
}
}
package com.example; public class Test{
public static void main(String[] args){
Person p = new Person("张三", 20);
System.out.println("name: " + p.name);
System.out.println("age: " + p.age);
}
}
运行结果: name: 张三
age: 20
1)可以看到,属性名称和构造器中的局部变量名称都是一样的
2)在构造器中用 this.name、this.age 表示属性名称,这样来和局部变量中的 name、age 加以区分
[ 返回顶部 ]
三、含参数列表
作用
含有参数列表的 this 的作用是:在一个构造器中调用另外一个构造器
使用注意事项
1)只能在构造器中调用
2)最多每个构造器只能调用一个
3)必须位于构造器的第一行
package com.example; public class Man{
private int age;
private String name; public Man(){
this(20);
//this("张三"); // error,构造器中最多只能调用一个
System.out.println("Man()");
}
public Man(int age){
this("张三");
System.out.println("age: " + age);
}
public Man(String name){
System.out.println("name: " + name);
//this(); // error,必须位于构造器的第一行
} public int getAge(){
//this(); // error,只能在构造器中调用
return age;
}
}
package com.example; public class Test{
public static void main(String[] args){
Man m = new Man();
}
}
运行结果: name: 张三
age: 20
Man()
1)可以看到,调用含有参数的 this 时,必须遵守相应的原则才能够正确编译执行
2)事实上,this 的不同参数列表对应不同的构造器,例如:this(20) 对应的是 public Man(int age){...} 这个构造器
[ 返回顶部 ]
参考资料:
《Java 编程思想》第4版
End~
Java笔记 —— this 关键字的更多相关文章
- Java笔记:关键字
关键字 描述 abstract 抽象方法,抽象类的修饰符 assert 断言条件是否满足 boolean 布尔数据类型 break 跳出循环或者label代码段 byte 8-bit 有符号数据类型 ...
- JAVA笔记4__static关键字/对象数组/foreach/方法的可变参数
/** * static关键字:修饰属性(实质就是全局变量).方法(无需本类的对象即可调用此方法).类. * 1.static方法只能调用static方法 * 2.static方法只能访问static ...
- JAVA笔记 -- this关键字
this关键字 一. 基本作用 在当前方法内部,获得当前对象的引用.在引用中,调用方法不必使用this.method()这样的形式来说明,因为编译器会自动的添加. 必要情况: 为了将对象本身返回 ja ...
- JAVA笔记4-static关键字
1.static方法中不能使用this关键字 2.例题:static成员变量用于计数
- JAVA笔记11-Final关键字
相当于C++中的const (1)final的变量值(成员变量.局部变量(形参))不可被改变: (2)final的方法不能被重写: (3)final的类不能被继承.
- JAVA笔记3-this关键字
1. 2.例题
- Java复习笔记--java中this 关键字
Java中this关键字,this可以调用类的成员变量和成员方法,this还可以调用类中的构造方法.使用这种方式值得注意的是, 只可以在无参构造方法中的第一句使用this关键字调用有参构造方法. pu ...
- Thinking in Java 笔记
大二就买了这本书,如今再看这本书,看到了一些以前没看的细节,也有了不同的体会.本文使用第4版,整理每章的笔记心得.老外的书有个特点,他会花费大量的文字去阐述一个概念,这比堆代码强多了. 第 1 章 对 ...
- TIJ读书笔记05-this关键字
TIJ读书笔记05-this关键字 概述 this的用法 static方法 概述 两个对象同时调用一个方法,那么jvm怎么知道是哪个方法调用的呢. 我们在书写的时候会写成a.fun(1) 或者b.fu ...
随机推荐
- springboot整合activemq(二),消费均匀分析
问题分析:当如果多个消费者是什么情况呢 topic消费是友多个消费者的,是支持的,但是queue是支持,但是不能保证多个消费均匀消费,在分布式环境下怎么操作呢: 看案例: 在前面整合代码执行: 浏览器 ...
- SpringMVC from 表单标签和 input 表单标签
刚学习很懵 不知道还有springmvc 自己的表单 于是乎就上网查了一下 这个真的好用多啦 刚学习很懵 不知道还有springmvc 自己的表单 于是乎就上网查了一下 这个真的好用多啦 ...
- JavaBean简介和用法
一.JavaBean的含义 JavaBean是使用Java语言开发的一个可重用组件,能使Html代码与JAVA代码分离,并节省开发时间,简单的说就是一个包含了setter和getter以及至少一个无参 ...
- PhpStrom 和 wamp 配置 xdebug
本地服务器: 1.php.ini 添加内容: ;设置xdebug的端口为9000 xdebug.remote_handler = dbgp xdebug.remote_host= localhost ...
- 学习C/C++需要掌握哪些知识
初级阶段 1.C语言 数据类型.变量.内存布局.指针基础: 字符串.一维数组.二维数组: 一级指针,二级指针,三级指针,N级指针概念,指针数组和数组指针: 结构体.文件的使用: 动态库的封装和设计: ...
- 关于c++中const的基本用法
c++中的const 有点类似于c里的宏定义#define,但是似乎是在宏定义基础上的代码优化,具体我解释不清,下面主要提到的是 const 在c++中的3中基本用法: 1.指向常量的指针 例如:co ...
- 5月 28日css前端知识
a:link {color : #FF0000} #未访问连接时设置颜色 a:visited {color: #FF0000} #访问过得连接设置颜色 a:hover {color: #F ...
- mgo01_window server 2012上安装mongo4.0
目前mongo最新版为4.0(2018-07-18),下载地址 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-4 ...
- vue环境搭建(一)
1.Vue依赖node npm命令执行,需要下载node 下载地址 2.安装全局vue-cli脚手架(搭建环境所需要模板), window+ r 打开命令工具,输入cmd ,这时显示命令行工具,输 ...
- Silverlight 减小 Xap 的大小
当Silverlight工程引用了很多dll后,加载的速度就会很慢,通过下面方式可以减小xap包的大小 勾选 “通过使用应用程序库缓存减小xap大小”,勾选此项后vs会自动将微软自身和外部引用不变的d ...