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 , ...
随机推荐
- jwt手动生成access_token
from rest_framework_jwt.settings import api_settings # 手动为用户生成tokenjwt_payload_handler = api_setting ...
- 1155 Heap Paths (30 分)(堆+dfs遍历)
比较简单的一题 遍历左右的时候注意一下 #include<bits/stdc++.h> using namespace std; ; ]; ; vector<int>t; ve ...
- 【bzoj3638】Cf172 k-Maximum Subsequence Sum 模拟费用流+线段树区间合并
题目描述 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交的不超过k个子段,最大的和是多少. 输入 The first line contains inte ...
- LeetCode -- Valid Parenthese
Question: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine i ...
- 省选算法学习-回文自动机 && 回文树
前置知识 首先你得会manacher,并理解manacher为什么是对的(不用理解为什么它是$O(n)$,这个大概记住就好了,不过理解了更方便做$PAM$的题) 什么是回文自动机? 回文自动机(Pal ...
- codeforces ice cave
/// /// 题意:告诉起点终点,踩一次, '.'变成'X',再踩一次,冰块破碎,问是否能使终点冰破碎 /// DFS:如题解所说,分三种情况:1. 如果两点重合,只要往外走一步再走回来就行了:2. ...
- ES6--javascript判断一个字符串是否存在另一个字符串中
es5中我们经常使用indexof()方法来判断一个字符串是否包含另外一个字符串中. 如果存在则返回匹配到的第一个索引值.如果没有则返回 -1.所以,判断一个字符串是否包含另外一个字符串中只需要判断是 ...
- UIImage 获取url图片资源
//UIImage 获取url图片资源 -(UIImage *) getImageFromURL:(NSString *)fileURL { UIImage * result; NSData * da ...
- java io 网络编程 高性能NIO
很久没写了,一是觉得这后台不怎么方便,二是 写的时候突然觉得没兴趣了. 还好,今天突然想记一下,那就随便写吧. 1.一开始还是放几个连接. 什么是 同步,异步,阻塞,非阻塞 : http://bl ...
- java.security.InvalidKeyException: IOException : Short read of DER length
今天支付服务器测试退款的时候爆了异常:Caused by: java.security.InvalidKeyException: IOException : Short read of DER len ...