1、Java对象都是Object类的实例,都可直接调用该类中定义的方法,这些方法提供了处理Java对象的通用方法。
一、toString方法
- 1、toString()方法是Object类里的一个实例方法,所有Java类都是Object类的子类,因此所有的Java对象都具有toString()方法。
- toString()方法是一个非常特殊的方法,它是一个“自我描述”方法,用于告诉外界该对象具有的所有状态信息。
2、不仅如此,所有的Java对象都可以和字符串进行连接运算,当Java对象和字符串进行连接运算时,系统自动调用Java对象toString()方法的返回值和字符串进行连接运算,下面两行代码的结果也完全相同。
String pStr="";
String pStr=p.toString()+"";
3、大部分时候,重写toString()方法总是返回该对象的所有令人感兴趣的信息所组成的字符串。通常可返回如下格式的字符串:
类名[field1=值1,field=值2,...]
eg.public String toString()
{
//this.color=color;
// this.weight=weight;
return"Apple[color="+color+",weight"+weight+"]";
}
二、==和equal方法
1、Java程序中测试两个变量是否相等有两种方式:
-
一种是利用 == 运算符
(使用==来判断两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就将返回true。) -
一种是利用equals()方法
2、但对于两个引用类型变量,只有他们指向同一个对象时,==判断才会返回true。==不可用于比较类型上没有父子关系的两个对象
public class EqualTest {
public static void main(String[] args){
int it=65;
float f1=65.0f;
//输出true
System.out.println("65和65.0f是否相等?"+(it==f1));
char ch ='A';
//输出true
System.out.println("65和'A'是否相等?"+(it==ch));
String str1=new String("hello");
String str2=new String("hello");
//输出false
System.out.println("st1是否和str2相等?"+(str1==str2));
//输出true
System.out.println("str1是否equeal str2"+(str1.equals(str2)));
}
}
String的equal()方法判断两个字符串相等的标准是:只要两个字符串所包含的字符序列相同,通过equal()比较将返回true,否则将返回false
解谜:
"hello"直接量和new String(“hello”)有什么区别呢?
- 当Java程序直接使用形如“hello”的字符串直接量(包括可以在编译时就计算出来的字符串值)时,JVM就将使用常量池来管理这些字符串
- 当使用new String(“hello”)时,JVM会先使用常量来管理“hello”直接量,再强调String类的构造器来创建一个新的String对象,新创建的String对象被保存再堆内存中。
- 换句话说,new String(“hello”)一共产生了两个字符串对象
#常量池:专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口中的变量,还包括字符串常量。
三、重写equals()方法应该满足下列条件
- 自反性:对任意x,x.equals(x)一定返回true
- 对称性:对任意x和y,如果y.equals(x)返回true,则x.equals(y)也返回true
- 传递性:对任意x,y,z,如果x.equals(y)防御true,y.equals(z)返回true,则x.equals(z)一定返回true
- 一致性:对任意x和y,如果对象中用于等价比较的信息没有改变,那么调用x.equals(y)多少次,返回的结果应该保持一致,要么一直ture,要么一直false
- 对任何不是null的x,x.equal(null)一定返回false
Object默认提供的equals()只是比较对象的地址,即Object类的equals()方法比较的结果与==运算符的结果完全相同。
因此,在实际应用中常常需要重写equals()方法时,相等条件是由业务要求决定的,因此equals()方法是实现,也是由业务要求决定的。