在toString()方法中不要单独使用this关键字,否则会产生递归调用

本文详细解释了在Java的toString()方法中单独使用this关键字可能导致的递归调用问题,并提供了替代方案。同时,文章还介绍了String、StringBuilder、StringBuffer的区别以及在字符串操作中的最佳实践。

在toString()方法中不要单独使用this关键字,否则会产生递归调用

编译器看到String后面跟着一个“+”,而再后面的对象不是String时,于是编译器试着将这个对象转换成String类型(调用该对象的toString()方法),所以当后面跟的是this关键字时,编译器调用this的toString(),于是就发生了递归调用。

package com.jacky.study.string;

/**
 * 在toString()方法中不要单独使用this关键字,否则会产生递归调用.
 * 
 * @author chenjie
 * @times 2014-2-27 上午10:51:06
 * 
 */
public class DonotUseThisInTostring {
	public static void main(String[] args) {
		Monkey monkey = new Monkey();
		monkey.setName("Jacky");
		System.out.println(monkey);

	}
}

class Monkey {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		// return super.toString();
		/*
		 * 编译器看到String后面跟着一个“+”,而再后面的对象不是String时,于是编译器试着将这个对象转换成String类型(
		 * 调用该对象的toString()方法),所以当后面跟的是this关键字时,编译器调用this的toString(),于是就发生了递归调用。
		 */
		// return this.name + "@" + this;
		return this.name + "@" + super.toString();// 应该使用super.toString()
	}

}

另外,关于String、StringBuilder、StringBuffer要注意的地方。

String:不可变,在使用String进行字符串追加时,编译器会自动引入StringBuilder优化性能;

StringBuilder:Jdk1.5才引入;

StringBuffer:线程安全的。



<think>好的,我现在需要回答用户关于Java中this关键字的用法,包括调用属性、方法、构造函数,以及静态与非静态方法的区别。首先,我需要回忆相关的知识,并结合用户提供的引用内容来组织答案。 首先,用户提到了this关键字的基本用途。根据引用[4],this用于区分成员变量和局部变量,当两者同名时,用this.成员变量来访问。比如构造方法中的参数名和成员变量名相同时,必须用this来指定。这点很重要,需要详细说明。 然后是调用方法。引用[3]中有一个例子,在构造方法调用this.toString(),说明在类的方法内部,可以通过this调用其他非静态方法。但要注意,只能在非静态方法使用this,因为静态方法属于类,不依赖于对象实例。 接下来是构造函数的重载调用。根据引用[5],在构造函数中使用this()可以调用其他重载的构造方法,但必须放在构造函数的第一行。比如默认构造器调用带参数的构造器,或者反过来。用户提供的例子中,This1类的多个构造函数互相调用,需要解释清楚执行顺序和规则。 关于静态与非静态方法的区别,引用[1]提到static方法属于类,不需要实例化即可调用,而普通方法需要对象实例。因此,在静态方法中不能使用this,因为没有实例。这点需要特别强调,因为用户可能容易混淆。 另外,用户提供的引用[2]提到在内部类中使用this时,可能指向内部类实例而非外部类,这时候需要用外部类名.this来访问外部类的成员。虽然用户的问题中没有直接问内部类的情况,但可能需要在注意事项中提到这一点,以全面覆盖this使用场景。 还需要注意,this返回当前对象的引用,这在方法链式调用中很有用,比如引用[2]中的例子,method方法返回this,使得可以连续调用多个method。这也是一个关键点,应该包括在回答中。 现在,我需要将以上内容整理成一个结构清晰的回答,分点说明this的各个用途,并对比静态和非静态方法中的区别。同时,要确保引用正确的参考文献,比如在提到静态方法时引用[1],在构造函数调用时引用[5]等。 最后,生成相关问题,可能需要围绕this的其他使用场景、静态方法的限制、构造方法重载的最佳实践等方面提问。例如,如何避免在构造方法使用this时的循环调用,或者在静态方法中访问成员变量的限制。 在检查过程中,要确保LaTeX格式正确,比如变量名用$符号包裹,独立公式使用$$,但这个问题中可能涉及较少数学公式,更多是代码示例。同时,按照用户要求,所有代码块用中文注释,但用户提供的引用中的代码是英文的,可能需要调整或保持原样,但根据用户示例,可能允许英文注释,只要整体回答是中文的。 现在组织回答的结构: 1. 调用属性:解决成员变量与局部变量同名问题,引用[4] 2. 调用方法:在非静态方法使用this调用其他方法,引用[3] 3. 调用构造函数:使用this(),必须首行,引用[5] 4. 静态与非静态区别:静态方法this,引用[1] 5. 注意事项:内部类中的this,引用[2] 每个部分加上示例代码,并正确标注引用来源。然后生成相关问题,比如关于方法链、静态方法限制、构造器调用顺序等。</think>### Java中`this`关键字的用法详解 #### 一、调用属性 当**成员变量**与**局部变量**同名时,使用`this`可以明确指向当前对象的成员变量。 **示例**: ```java public class Student { String name; // 成员变量 public Student(String name) { // 局部变量 this.name = name; // 通过this区分成员变量和参数[^4] } } ``` 此处`this.name`表示类的成员变量,而等号右侧的`name`为构造方法的参数。 --- #### 二、调用方法 在类的**非静态方法**中,可通过`this.方法()`调用其他方法,通常用于链式调用。 **示例**: ```java public class Test2 { String s = ""; public Test2 method(String str) { s += str; return this; // 返回当前对象,支持链式调用[^2] } } ``` 通过`return this`,可以连续调用`method()`,如`t.method("111").method("222")`。 --- #### 三、调用构造函数 在构造函数中,可通过`this(参数)`调用其他重载的构造函数,但需**置于第一行**。 **示例**: ```java class This1 { This1() { this("Hello"); // 调用带String参数的构造函数[^5] System.out.println("默认构造方法"); } This1(String s) { System.out.println("带字符串参数的构造方法"); } } ``` 执行顺序为:先调用`This1(String s)`,再执行`This1()`中的剩余代码。 --- #### 四、静态与非静态方法的区别 1. **静态方法**(`static`修饰): - 属于类,无需实例化即可调用(如`类名.方法()`)。 - **不可使用`this`**,因为静态方法不依赖对象实例[^1]。 2. **非静态方法**: - 必须通过对象实例调用。 - 可使用`this`访问成员变量和方法。 **示例**: ```java public class Person { String name; public static void print() { // System.out.println(this.name); // 错误!静态方法中不能使用this[^3] } } ``` --- #### 五、注意事项 1. **内部类中的`this`**: 在内部类中,`this`默认指向内部类对象。若需访问外部类成员,需使用`外部类名.this`[^2]。 2. **避免循环调用构造函数**: 若在构造函数中通过`this()`形成循环调用(如A调用B,B又调用A),会导致编译错误。 --- ### 相关问题 1. 如何通过`this`实现方法的链式调用? 2. 在静态方法中能否通过`类名.this`访问当前类实例? 3. 构造函数中调用`this()`时为何必须置于第一行? 4. 内部类中如何区分外部类和内部类的成员变量?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值