Java this关键字详解
- public class Demo{
- public int x = 10;
- public int y = 15;
- public void sum(){
- // 通过 this 点取成员变量
- int z = this.x + this.y;
- System.out.println("x + y = " + z);
- }
- public static void main(String[] args) {
- Demo obj = new Demo();
- obj.sum();
- }
- }
运行结果:
x + y = 25
上面的程序中,obj 是 Demo 类的一个实例,this 与 obj 等价,执行 int z = this.x + this.y;,就相当于执行 int z = obj.x + obj.y;。
注意:this 只有在类实例化后才有意义。
使用this区分同名变量
成员变量与方法内部的变量重名时,希望在方法内部调用成员变量,怎么办呢?这时候只能使用this,例如:
- public class Demo{
- public String name;
- public int age;
- public Demo(String name, int age){
- this.name = name;
- this.age = age;
- }
- public void say(){
- System.out.println("网站的名字是" + name + ",已经成立了" + age + "年");
- }
- public static void main(String[] args) {
- Demo obj = new Demo("微学苑", 3);
- obj.say();
- }
- }
运行结果:
网站的名字是微学苑,已经成立了3年
形参的作用域是整个方法体,是局部变量。在Demo()中,形参和成员变量重名,如果不使用this,访问到的就是局部变量name和age,而不是成员变量。在 say() 中,我们没有使用 this,因为成员变量的作用域是整个实例,当然也可以加上 this:
- public void say(){
- System.out.println("网站的名字是" + this.name + ",已经成立了" + this.age + "年");
- }
Java 默认将所有成员变量和成员方法与 this 关联在一起,因此使用 this 在某些情况下是多余的。
作为方法名来初始化对象
也就是相当于调用本类的其它构造方法,它必须作为构造方法的第一句。示例如下:
- public class Demo{
- public String name;
- public int age;
- public Demo(){
- this("微学苑", 3);
- }
- public Demo(String name, int age){
- this.name = name;
- this.age = age;
- }
- public void say(){
- System.out.println("网站的名字是" + name + ",已经成立了" + age + "年");
- }
- public static void main(String[] args) {
- Demo obj = new Demo();
- obj.say();
- }
- }
运行结果:
网站的名字是微学苑,已经成立了3年
值得注意的是:
- 在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
- 不能在构造方法以外的任何方法内调用构造方法。
- 在一个构造方法内只能调用一个构造方法。
上述代码涉及到方法重载,即Java允许出现多个同名方法,只要参数不同就可以。后续章节会讲解。
作为参数传递
需要在某些完全分离的类中调用一个方法,并将当前对象的一个引用作为参数传递时。例如:
- public class Demo{
- public static void main(String[] args){
- B b = new B(new A());
- }
- }
- class A{
- public A(){
- new B(this).print(); // 匿名对象
- }
- public void print(){
- System.out.println("Hello from A!");
- }
- }
- class B{
- A a;
- public B(A a){
- this.a = a;
- }
- public void print() {
- a.print();
- System.out.println("Hello from B!");
- }
- }
运行结果:
Hello from A!
Hello from B!
匿名对象就是没有名字的对象。如果对象只使用一次,就可以作为匿名对象,代码中 new B(this).print(); 等价于 ( new B(this) ).print();,先通过 new B(this) 创建一个没有名字的对象,再调用它的方法。
- 分享到:
- QQ空间
- 新浪微博
- 腾讯微博
- 豆瓣
- 人人网
- .源代码
package thisfangfa;
public class This {
public static void main(String[] args){
B b=new B(new A());//这里创建B类的对象b时,对B类的构造函数传入了
//A类的对象的引用(指针),
}
}
class A{
public A()
{
System.out.println www.uuweb.cn ("step 1 ");
new B(this).print();//程序第一步会执行A类的构造方法A(),因为创建B类
//的对象b时,对B类的构造函数传入了A类的对象的引用(指针),所以程序先执行
//new A() ,执行new A()的时候就运行了A类的构造方法。A类的构造方法里面
//创建了B类的匿名对象,并且引用了B类匿名对象的print();方法。
}
public void print()
{
System.out.println("step 3");//由于第二步a.print();执行了A类的
//print()方法。所以程序第三步会运行到这里。
System.out.println("hello from A");//然后执行到这句
//代码,所以打印输出了hello from A
}
}
class B{
A a;//这里先声明一个A类的对象a,这时还没有对a实例化,只是声明。
public B(A a){//执行new A()完毕后,开始执行执行new B()了,这时会执行B类的
//构造函数B(),
this.a=a;//B b=new B(new A());//这里创建B类的对象b时,传入的A类对象
//的引用(指针),赋予了之前声明的A类的对象a,这时a存储着创建B类的对象b时,传
//入的A类对象的引用(指针)。
}
public void print()
{ System.out.println("step 2 ");//由于引用了B类匿名对象的print()方法。
//所以程序第二步会执行到这个方法里面。
a.print();//因为a存储着创建B类的对象b时,传入的A类对象的引用(指针)。
//所以这里执行a对象的方法print(),就是执行的A这个类里面的
//print()方法。所以程序第二步会运行到这里。这里执行了A类的print()方法。
//
//打印输出hello from A完毕后,a.print();执行完毕,
System.out.println("step 4 ");//所以开始执行这句
System.out.println("hello from B");//和执行这句
//整个程序结束在这里。
}
}在Eclipse下程序输出结果是这样的:
step 1
step 2
step 3
hello from A
step 4
hello from B
Java this关键字详解的更多相关文章
- 《Java基础——break与continue用法详解》
Java基础--break与continue用法详解 1. break语句: 规则: 1. 仅用于循环语句和switch语句当中,用于跳出循环. 2. 当只有一层循环时,则直接跳出循环,不 ...
- JAVA基础知识|java虚拟机(JVM)
一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...
- Java基础篇(JVM)——字节码详解
这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...
- [java基础] 002 - 位运算符的详解和妙用
一:位运算符详解 位运算符主要用来对操作数二进制的位进行运算.按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值. Java 语言中的位运算符分为位逻辑运算符和位移运算符两类, ...
- Java基础知识之this关键字知识讲解
this关键字这里对java中this关键字的基础知识进行讲解,希望对热爱java的小伙伴有帮助!! /* this关键字代表了所属函数的调用者对象. this关键字的作用: 1. 如果存在同名成员变 ...
- Java:final、static关键字 详解+两者结合使用
一 final关键字 1) 关于final的重要知识点 final关键字可以用于成员变量.本地变量.方法以及类. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. ...
- [java基础知识]java安装步骤
jre: java运行环境. jre = java虚拟机 + 核心类库(辅助java虚拟机运行的文件).如果只是运行java程序,只需要安装jre. jdk: java开发工具集 jd ...
- java基础知识——Java的定义,特点和技术平台
(作者声明:对于Java编程语言,很多人只知道怎么用,却对其了解甚少.我也是其中一员.所以菜鸟的我,去查询了教科书以及大神的总结,主要参考了<Java核心技术>这本神作.现在分享给大家!) ...
- vue.js基础知识篇(6):组件详解
第11章:组件详解 组件是Vue.js最推崇也最强大的功能之一,核心目标是可重用性. 我们把组件代码按照template.style.script的拆分方式,放置到对应的.vue文件中. 1.注册 V ...
- Java基础知识之常见关键字(1)
static 特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 注意点: 静态方法只能访问静态方法 但是非静态成员可以直接访问静态成员 静态方法中不可以使用this , ...
随机推荐
- HDU 4714 Tree2cycle 找规律
假设最少删除的边的个数为cost,显然,最终答案即为cost+cost+1 (因为删除一条边,就会增加一个链,所以删除cost条边后,就会有cost+1条链,将这cost+1条链连接起来的代价为cos ...
- gulp入门1
1. 下载.安装git(https://git-scm.com/downloads),学会使用命令行. 2. 下载.安装node.js(https://nodejs.org/en/),现在node.j ...
- finally代码块不被执行的情况总结
以前跟别人讨论finally关键字,我总是简单的说:“fianly代码块中的代码一定会执行,一般用来清除IO资源等非内存资源(内存资源由GC机制回收)”. 今天翻书发现了几种不会执行的情况,现在总结下 ...
- BZOJ 1876 [SDOI2009] SuperGcd | PY好题
题面就是让你求两个超级大整数,求GCD 题解: 题目本意应该是出题人想考考高精度取膜 但是可以通过一种神奇的Stein算法来做 由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算 ...
- python的pip安装
http://blog.csdn.net/liuchunming033/article/details/39578019
- Android自复制传播APP原理学习(翻译)
Android自复制传播APP原理学习(翻译) 1 背景介绍 论文链接:http://arxiv.org/abs/1511.00444 项目地址:https://github.com/Tribler ...
- java 复习整理(二 数据类型和几种变量)
源文件声明规则 当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则. 一个源文件中只能有一个public类 一个源文件可以有多个非public类 源文件的名 ...
- HTTP协议中GET、POST和HEAD的介绍
HTTP协议中GET.POST和HEAD的介绍 GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体 ...
- 编写Shell脚本的最佳实践,规范一
随着写的SHELL程序越来越多,发现自己每次写都有不同的习惯或者定义了不同的东西,变量名定义得不一样,整个程序缩进不统一,没有注释等问题,等我回过头看这些程序的时候发现很麻烦.所以写了个shell代码 ...
- hdu1024 Max Sum Plus Plus的另一种解法
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1024 http://www.51nod.com/onlineJudge/questionCode.htm ...