原文地址:https://www.cnblogs.com/alsf/p/5515996.html

一,表示类中属性

1,没有使用this的情况

class Person{        // 定义Person类
private String name ; // 姓名
private int age ; // 年龄
public Person(String name,int age){ // 通过构造方法赋值
name = name ;
age = age ;
}
public String getInfo(){ // 取得信息的方法
return "姓名:" + name + ",年龄:" + age ;
}
};
public class ThisDemo01{
public static void main(String args[]){
Person per1 = new Person("张三",33) ; // 调用构造实例化对象
System.out.println(per1.getInfo()) ; // 取得信息
}
};
运行结果:
姓名:null,年龄:0;

可以得出结论:此时并没有正确将内容赋给属性;

假设身边有一只笔,远处也有一只笔,肯定会就近拿身边的笔。这在构造方法中一样。

所以此时操作的name,age都是构造方法中定义的name,age.跟类中属性完全不沾边。

此时,为了明确哪个是类中的属性,需要加上this.类中属性。

class Person{        // 定义Person类
private String name ; // 姓名
private int age ; // 年龄
public Person(String name,int age){ // 通过构造方法赋值
this.name = name ; // 为类中的name属性赋值
this.age = age ;// 为类中的age属性赋值
}
public String getInfo(){ // 取得信息的方法
return "姓名:" + name + ",年龄:" + age ;
}
};
public class ThisDemo02{
public static void main(String args[]){
Person per1 = new Person("张三",33) ; // 调用构造实例化对象
System.out.println(per1.getInfo()) ; // 取得信息
}
};
运行结果:
姓名:张三,年龄:33

二,this调用构造方法

如果在类中有多个构造方法,也可以利用this关键字互相调用。

假设一个类中存在多个构造方法,但无论多少构造方法,都要打造一个“新对象实例化”,此时就有两种做法。

按照最原始方法:

class Person{        // 定义Person类
private String name ; // 姓名
private int age ; // 年龄
public Person(){ // 无参构造
System.out.println("新对象实例化") ;
}
public Person(String name){
System.out.println("新对象实例化") ;
this.name = name ;
}
public Person(String name,int age){ // 通过构造方法赋值
System.out.println("新对象实例化") ;
this.name = name ; // 为类中的name属性赋值
this.age = age ;// 为类中的age属性赋值
}
public String getInfo(){ // 取得信息的方法
return "姓名:" + name + ",年龄:" + age ;
}
};
public class ThisDemo03{
public static void main(String args[]){
Person per1 = new Person("张三",33) ; // 调用构造实例化对象
System.out.println(per1.getInfo()) ; // 取得信息
}
};

因为以上红色部分重复了,现在只是一行,感觉不出来,但是如果现在代码很多行的话,缺陷立刻显现出来了。

此时,最好让构造方法间进行互相调用。

使用:this(若干参数)的形式完成。

package methoud;
class Person{ // 定义Person类
private String name ; // 姓名
private int age ; // 年龄
public Person(){ // 无参构造
System.out.println("新对象实例化") ;
}
public Person(String name){
this() ;// 调用本类中的无参构造方法
this.name = name ;
}
public Person(String name,int age){ // 通过构造方法赋值
this(name) ;// 调用有一个参数的构造方法
this.age = age ;// 为类中的age属性赋值
}
public String getInfo(){ // 取得信息的方法
return "姓名:" + name + ",年龄:" + age ;
}
};
public class ThisDemo06{
public static void main(String args[]){
Person per1 = new Person("张三",33) ; // 调用构造实例化对象
System.out.println(per1.getInfo()) ; // 取得信息
}
};
运行结果:
新对象实例化
姓名:张三,年龄:33

注意点:

在使用this关键字调用其他关键字的时候,有以下限制:

1)this()调用其他构造方法的语句只能放在构造方法(在其他普通方法里是不行的)首行

2)在使用this调用其他构造方法的时候,至少有一个构造方法是不用this调用的。(必须要有结尾,不能无限期的调用下去,循环递归调用);

如下就会出错:

package methoud;
class Person{ // 定义Person类
private String name ; // 姓名
private int age ; // 年龄
public Person(){ // 无参构造
System.out.println("新对象实例化") ;
}
public Person(String name){
this.name = name ;
this() ;// 调用this()方法只能放在构造方法首行
}
public Person(String name,int age){ // 通过构造方法赋值
this(name) ;// 调用有一个参数的构造方法
this.age = age ;// 为类中的age属性赋值
}
public String getInfo(){ // 取得信息的方法
this() ;// 其他普通方法不能调用this()方法
return "姓名:" + name + ",年龄:" + age ;
}
};
public class ThisDemo04{
public static void main(String args[]){
Person per1 = new Person("张三",33) ; // 调用构造实例化对象
System.out.println(per1.getInfo()) ; // 取得信息
}
};

三,使用this关键字调用当前对象。

当前对象:当前正在调用方法的对象。

如下,分别用两种方法打印对象per1和per2

class Person{        // 定义Person类
public String getInfo(){ // 取得信息的方法
System.out.println("Person类 --> " + this) ; // 直接打印this
return null ; // 为了保证语法正确,返回null
}
};
public class ThisDemo06{
public static void main(String args[]){
Person per1 = new Person() ; // 调用构造实例化对象
Person per2 = new Person() ; // 调用构造实例化对象
System.out.println("MAIN方法 --> " + per1) ; // 直接打印对象
per1.getInfo() ; // 当前调用getInfo()方法的对象是per1
System.out.println("MAIN方法 --> " + per2) ; // 直接打印对象
per2.getInfo() ; // 当前调用getInfo()方法的对象是per2
}
};
运行结果: MAIN方法 --> methoud.Person@2a139a55
Person类 --> methoud.Person@2a139a55
MAIN方法 --> methoud.Person@15db9742
Person类 --> methoud.Person@15db9742

this关键字使用的更多相关文章

  1. 作为一个新手的Oracle(DBA)学习笔记【转】

    一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...

  2. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  3. java面向对象中的关键字

    1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...

  4. 关于javascript中的this关键字

    this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...

  5. transient关键字的用法

    本篇博客转自 一直在路上 Java transient关键字使用小记 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java ...

  6. Java关键字:static

    通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...

  7. Core Java 总结(关键字,特性问题)

    2016-10-19 说说&和&&的区别 初级问题,但是还是加入了笔记,因为得满分不容易. &和&&都可以用作逻辑与的运算(两边是boolean类型), ...

  8. Net中的常见的关键字

    Net中的关键字有很多,我们最常见的就有new.base.this.using.class.struct.abstract.interface.is.as等等.有很多的,在这里就介绍大家常见的,并且有 ...

  9. php多关键字查询

      php单一关键字查询 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 tdansitional//EN" "http: ...

  10. Keil> 编译器特有的功能 > 关键字和运算符 > __weak

    __weak 此关键字指示编译器弱导出符号. 可以将 __weak 关键字应用于函数和变量声明以及函数定义. 用法 函数和变量声明 对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不 ...

随机推荐

  1. 《流畅的Python》一副扑克牌中的难点

    1.现在在看<流畅的Python>这本书,看了三页就发现,这本书果然不是让新手来入门的,一些很常见的知识点能被这个作者玩出花来, 唉,我就在想,下面要分析的这些的代码,就算我费劲巴拉的看懂 ...

  2. [NOIP2012T3]开车旅行

    题目描述 NOIP 2012 提高组 题3小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ...

  3. emacs 下 common lisp 配置

    安装 sbcl .emacs 加入 ;for lisp mode (add-to-list 'load-path "D:/kuaipan/.emacs.d/elpa/slime-201311 ...

  4. LazyTableImages范例解析

    近来想了解iPhone的多线程处理,查阅到了官方范例LazyTableImages,发现代码中有不仅有多线程处理,还有XML解析和异步下载图片,感觉官方例子真是全面啊,便花了时间好好研究下. Lazy ...

  5. OCP47:155

  6. pomelo加入定时任务

    需求:在arenaserver下添加一个rank定时任务,每一分钟对对玩家进行一次排行. 首先在game-server/app/servers/arena文件夹下添加cron文件夹. 在game-se ...

  7. HDU 3342 Legal or Not (最短路 拓扑排序?)

    Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. C++ Primer 学习笔记与思考_7 void和void*指针的使用方法

    (一)void的含义 void的字面意思是"无类型",void差点儿仅仅有"凝视"和限制程序的作用,由于从来没有人会定义一个void变量,让我们试着来定义: v ...

  9. XML Schema笔记

    XML Schema是为了弥补DTD的不足而开发的一种新的用于约束和规范XML文档的标准 XML Schema作用: 定义可出现在文档中的元素定义可出现在文档中的属性定义哪些元素是子元素定义子元素的次 ...

  10. java 常量表达式

    原文地址:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28 这是我翻译的,以备不时之用. 常量表达式是一个代 ...