之前的文章都是关于Android的使用,这次想写一些关于Java的知识,总结一下Java的使用。这次写的是关于Java this的使用,介绍以下内容:

this的概念

this的各种应用

总结

this 是什么

在写一个方法的时候,如果想在方法内部获得对当前对象的引用就可以用this.this表示对“调用方法的那个对象”的引用。也就是说this指的是方法所属的类的对象的引用。根据这个定义,我们可以总结出很多关于this的用法。

当局部变量与成员变量重名的时候,可以用this表明用的是对象的成员变量。

当方法需要一个该类的对象做参数的时候,可用this代替。

在Android开发中,我们经常需要对事件处理写一个内部类或者匿名内部类,在内部类里用this,按照刚才的定义,指的就是内部类的对象,如果想要用外部类的对象,则要外部类名.this的形式表示外部类的对象的引用。

在构造函数中,可以用this来调用另一个构造函数。

当一个方法需要返回对当前对象的引用的时候,可以用return this。这时就可以在不断对这个对象进行多次这种方法的操作。

下面会针对每一种用法

进行说明和举例。

this的用法1

在Java程序中,如果一个方法中的参数与成员变量的名称是一样的时候,我们可以用this来指定调用的成员变量,例子如下:

/**

* Created by byhieg on 16-4-23.

*/

public class A {

public String s = "A";

public A() {

}

public A(String s) {

System.out.println("s的值 = " + s);

s = "B";

System.out.println("经过s=\"B\"赋值后成员变量s的值");

System.out.println("成员变量s的值 = " + this.s);

this.s = "B";

System.out.println("经过this.s=\"B\"赋值后成员变量s的值");

System.out.println("成员变量s的值 = " + this.s);

}

public void show() {

System.out.println("无参构造器中成员变量s的值 = " + s);

}

public static void main(String[] args) {

new A().show();

System.out.println("调用含参构造器后");

new A("C");

}

}

运行结果如下:

无参构造器中成员变量s的值 = A

调用含参构造器后

s的值 = C

经过s="B"赋值后成员变量s的值

成员变量s的值 = A

经过this.s="B"赋值后成员变量s的值

成员变量s的值 = B

我们从这个程序可以看出来,当局部变量没有的时候,直接输出s不用加this,编译器也知道s指的是成员变量,当有局部变量的时候,编译器首先会用局部变量,这也就是在调用含参构造器后,直接输出s的值,s实际指的是局部变量,后续一切对s的操作,都是指的是局部变量s。这时,如果我们要对成员变量进行操作,就要用this.s表明是对对象的成员变量进行操作。

通过刚才的分析,我们已经可以看出this就是指的对当前对象的引用,所以既然是对象的引用,那么他不仅可以调用成员变量,还可以调用成员方法,一个方法中,可以通过this来调用其他方法。话虽如此,不过恐怕很多程序都是在方法中不加this直接调用,因为当前方法中this引用会自动应用于同一类中的其他方法。

this的用法2

在写一个方法的时候,如果该方法需要一个该类的对象做参数的时候,通常传入this代指该类的对象,具体的使用场景如下:

在Android开发中,我们的一些方法经常需要context作为一个参数传进去,通常我们传入的都是context的子类,即当前Activity的对象this进去。

我们可以看一下下面的代码:

/**

* Created by byhieg on 16-4-23.

*/

class B {

B(A a) {

a.show();

}

}

public class A {

public void doB() {

new B(this);

}

public void show() {

System.out.println("我是A");

}

public static void main(String[] args) {

new A().doB();

}

}

输出我是A

这个例子虽然写的很特意,但我们可以看出this在这里面取得的作用,this作为该类的对象的引用,在这里this就是指A的对象的引用。因为this是在A类的方法中传进去的所以指的是A的对象的引用。我们可以看一下下面的有趣例子:

/**

* Created by byhieg on 16-4-23.

*/

class B {

public B() {

System.out.println("这里的this是" + this.getClass().getSimpleName());

}

public void Bshow() {

System.out.println("这里的this是" + this.getClass().getSimpleName());

}

}

public class A extends B {

public A() {

}

public static void main(String[] args) {

new A();

new B().Bshow();

}

}

结果很值得讨论,结果如下:

这里的this是A

这里的this是B

这里的this是B

明明是this出现B的构造器内,按照刚才说的不是应该指的是B吗?其实,注意刚才说的是this是指从那个方法中传进去那个类的对象。jvm在执行编译的时候,在成员方法中,会默认隐藏的传递一个参数,这个参数就是当前调用的对象本身。换句话说,虽然new A()的时候会先执行父类的默认构造函数,但此时已经把JVM已经秘密的传入的A的对象,所以我们可以看出输出的this是A。而在new B()的时候,传入的当然就是B的对象,所以输出的this就是B。

this的用法3

在Android开发中,我们经常需要对事件处理写一个内部类或者匿名内部类,在内部类里用this,按照刚才的定义,指的就是内部类的对象,如果想要用外部类的对象,则要外部类名.this的形式表示外部类的对象的引用。这个没什么细说的,直接看下面的例子算了

/**

* Created by byhieg on 16-4-23.

*/

public class A {

int i = 1;

public A() {

Thread thread = new Thread() {

public void run() {

for (int j = 0;j < 2;j++) {

//调用外部类的方法

A.this.run();

}

}

};

thread.start();

}

public void run() {

System.out.println("i = " + i);

i++;

}

public static void main(String[] args) throws Exception {

new A();

}

}

这里run方法和内部类里面的run重复了,如果想要调用A的run方法就需要A的对象→this,但如果直接在内部类里面用this,则this就指的是内部类的对象,所以我们需要加上外部类的名字。A.this来明确表明这是A的对象。

this的用法4

在构造函数中,可以用this来调用另一个构造函数。这是this比较独特的用法,即在构造器中,如果为this添加了参数列表,那么这将产生对符合参数列表的某个构造器的明确调用。这样我们就可以在构造器中调用其他构造器,但书写上有所限制,必须将构造器的调用置于最初始处,而且只能用一次。

例子如下:

/**

* Created by byhieg on 16-4-23.

*/

public class A {

int a ,b;

public A(int a) {

this.a = a;

System.out.println(this.a);

}

public A(int a, int b) {

this(a);

this.b = b;

System.out.println(this.a + " " + this.b);

}

public static void main(String[] args) {

new A(2);

new A(2, 3);

}

}

具体的用法就如上面所示,我们可以打开调试器看一看里面的信息,如下图

我们可以看出this作为当前的对象,里面存放这该类的三个成员变量,我们可以很容易验证,无论this调用什么方法,内存中永远存放这个类的成员变量,所以才可以通过this对成员变量进行修改。

this的用法5

当一个方法需要返回对当前对象的引用的时候,可以用return this。这时就可以在不断对这个对象进行多次这种方法的操作。

这是一个很神奇的操作,因为这个方法的返回值是当前对象的引用,因此你可以用这个引用继续调用其他方法,很容易一行语句执行多次操作,就像python的一行语法一样。

我们看一个好玩的例子

/**

* Created by byhieg on 16-4-23.

*/

public class A {

int i = 0;

public A add() {

i ++;

return this;

}

public A show() {

System.out.println(i);

return this;

}

public void end() {

System.out.println("到此为止");

}

public static void main(String[] args) {

new A().add().show().add().show().add().show().add().show().add().show().end();

}

}

输出结果显而易见,我就不放出来了。

总结

我们这里讨论了this的五种用法,但是都是根据this的定义引申出在不同情况下的用法。this只能在方法内部使用,当调用方法中含有this的时候,this就指的调用该方法的对象的引用,当方法参数中需要传入一个类的对象的时候,用this代指这个传入类的对象。当用构造方法初始化成员变量的时候,JVM会默认传入当前对象来初始化成员变量。

this.show() java_Java this的一两点使用相关推荐

  1. excel 解析 java_java解析Excel(xls、xlsx两种格式)

    https://www.cnblogs.com/hhhshct/p/7255915.html ***************************************************** ...

  2. 丢手帕java_java基于双向环形链表解决丢手帕问题的方法示例

    本文实例讲述了java基于双向环形链表解决丢手帕问题的方法.分享给大家供大家参考,具体如下: 问题:设编号为1.2--n的几个小孩围坐一圈,约定编号为k(1= 我们现在用一个双向环形链表来解这一问题. ...

  3. b2b2c源码 java_java B2B2C源码电子商务平台 ---搭建Eureka注册中心

    一 创建一个Spring Boot工程,命名为eureka-server,并在pom.xml中引入必要的依赖,代码如下.愿意了解源码的朋友直接求求交流分享技术:二一四七七七五六三三 org.sprin ...

  4. 数组扩容 java_java 实现数组扩容与缩容案例

    我就废话不多说了,大家还是直接看代码吧~ public static T[] dilatationArray(T[] datas,int newlen) { //不能为负数 newlen = newl ...

  5. 贪吃蛇计时器怎么编写java_java编写简易贪吃蛇游戏

    本文实例为大家分享了java编写的贪吃蛇源码,供大家参考,具体内容如下 程序共包含以下两个文件: 文件:ShellWin.java import java.awt.Color; import java ...

  6. int long java_java long int的区别

    java long int的区别 java中long和int都属于整型,为什么还要细分为long和int两种数据类型呢?这是因为它们代表的大小不一样.具体区别如下: 1.区别1 16位系统:long是 ...

  7. findclass java_Java Context.findClass方法代码示例

    import jdk.nashorn.internal.runtime.Context; //导入方法依赖的package包/类 private static Class> simpleType ...

  8. 董东 java_Java面向对象程序设计

    1. Java是什么样的语言? 答:Java语言是一门用途广泛的.面向对象的语言.Java语言可以编写桌面应用.手机应用及企业应用.Java简洁优雅,易于学习. 2. 没有学过编程,能学吗? 答:本课 ...

  9. newinsets用法java_Java XYPlot.setInsets方法代碼示例

    import org.jfree.chart.plot.XYPlot; //導入方法依賴的package包/類 public static void setTimeSeriesRender(Plot ...

最新文章

  1. EOSRAM那么火,BANCOR协议白皮书了解一下?
  2. 【深度学习笔记】python图像特征提取
  3. 怎么自学python语言-怎样学好python
  4. Visual Studio 2013开发 mini-filter driver step by step 获取可执行文件名称 - 实现process monitor的一个功能 (10)
  5. 物联网网络编程和web编程
  6. GTimeSheet正式启用官方网站
  7. 设计模式学习之--Singleton(单例)模式
  8. android声音播放mp3文件,如何在android中播放音频文件
  9. python webservice框架_python webservice hello world
  10. PMP-PMBOK图解项目管理(436页PPT、完整版-经典)
  11. python处理微信消息导入excel_使用python读取excel中的数据,并重新写入到新的excel中...
  12. C++线性表(单链表)的应用算法(附源码)
  13. Linux升级glibc
  14. 什么模式下不可使用曝光补偿_摄影从零到入门 曝光模式与测光方法详解
  15. H5 可视化构建工具原理解析(一)
  16. 共享文件夹Windows和Linux双向粘贴
  17. 华南理工计算机应用在线答题,华南理工大学计算机应用基础随堂练习题目及答案...
  18. android名字最长,AaaaaAAaaa...体验史上名字最长的游戏
  19. 环境污染、空气质量数据集:省/市/县PM2.5浓度、空气流通系数、逆温数据
  20. 深入理解计算机系统lab2

热门文章

  1. python运行器_python 运行器
  2. 电脑建立win7下wifi热点的问题解决
  3. 体验Adobe Dreamweaver 9(CS3)
  4. 技法の穴をふさぐ:規模編--技法のルールは分かりにくい数え方の“迷い”をなくす
  5. 日韩潮流千鸟格流苏披肩
  6. [iOS开发]frame和bounds
  7. 在Excel表中增加引用列的一些技巧
  8. matlab画簇状堆积柱状图怎么调颜色,簇状柱形图实用技巧——“超额”的完美展示与设置!...
  9. CSS day1 |选择器字体文本引入方式
  10. Google Play 隐私政策