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 , ...
随机推荐
- Python学习-KindEditor-富文本编辑框
1.进入官网 2.下载 官网下载:http://kindeditor.net/down.php 本地下载:http://files.cnblogs.com/files/wupeiqi/kindedit ...
- SDK支付流程
1.普通支付流程 2.代理流程 易接.U8SDK
- 线段树 (区间更新,区间查询) poj http://poj.org/problem?id=3468
题目链接 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- 第十章 用户数据报协议和IP分片
用户数据报协议和IP分片 UDP是一种保留消息边界的简单的面向数据报的传输层协议.它仅提供差错检测.只是检测,而不是纠正,它只是把应用程序传给IP层的数据发送出去,但是并不会保证数据能够完好无损的到达 ...
- CodeForces C. Maximal Intersection
http://codeforces.com/contest/1029/problem/C You are given nn segments on a number line; each endpoi ...
- objective-c runtime 开发详情
目录 概述 对象与类的实质 id与class 继承关系与isa 总结 C函数创建一个OC类 OC类与runtime NSObjectProtocol NSObject NSProxy 一.概述 Obj ...
- 【bzoj1270】[BeijingWc2008]雷涛的小猫 dp
题目描述 输入 输出 样例输入 样例输出 8 题解 dp 设f[i][j]表示在第i棵树的j高度时最多吃到的柿子数. 那么只有两种可能能够到达这个位置:滑下来.跳下来. 滑下来直接用f[i][j+ ...
- Android性能优化之避免内存泄漏的建议
在android程序开发中,内存泄漏问题是比较常见的问题,相信有过一些android编程经历的程序猿都遇到过各种各样的内存泄漏.内存泄漏是造成应用程序OOM的主要原因之一,是编程中必须避免的问题.下面 ...
- C#类和类成员初始化顺序
1.不带静态成员的普通类,首先通过构造函数初始化. 2.带静态属性的类,无论是普通类还是静态类,都会先初始化静态字段,再执行构造函数. 3.类初始化时,不会执行类中方法,无论是否是静态.若想执行方法, ...
- 论文笔记《Tracking Using Dynamic Programming for Appearance-Based Sign Language Recognition》
一.概述 这是我在做手势识别的时候,在解决手势画面提取的时候看的一篇paper,这里关键是使用了动态规划来作为跟踪算法,效果是可以比拟cameshift和kf的,但在occlusion,gaps或者离 ...