5.2.1.打印对象和toString方法
package code;
public class PrintObject{
public static void main(String[] args){
Person p = new Person("孙悟空");
System.out.println(p);
}
}
class Person{
private String name;
public Person(String name){
this.name = name;
}
}
toString是一个“自我描述”的方法
package code;
class Apple{
private String color;
private double weight;
public void setColor(String color){
this.color = color;
}
public String getColor(){
return color;
}
public void setWeight(double weight){
this.weight = weight;
}
public double getWeight(){
return weight;
}
public Apple(){}
public Apple(String color,double weight){
this.color = color;
this.weight = weight;
}
public String toString(){
return("这个苹果的颜色是:" + color + ",重量是:" + weight);
}
}
public class ToStringTest{
public static void main(String[]args){
Apple a = new Apple("红色",5.5);
System.out.println(a);
}
}
这个苹果的颜色是:红色,重量是:5.5
通过重写Apple类的toString()方法,就可以让系统在打印Apple对象时打印出该对象的“自我描述”信息。
通常将Apple类的toString()方法改为:
public String toString(){
return "Apple[color=" + color + ",weight=" + weight + "]";
}
Apple[color=红色,weight=5.5]
5.2.2. ==和equals方法
对于两个引用类型变量,只有指向同一个对象时,==判断才会返回true。==不可用于比较类型上没有父子关系的两个对象。
package code;
public class EqualTest{
public static void main(String[] args){
int it = 65;
float fl = 65.0f;
System.out.println("65和65.0f是否相等" + (it==fl));
char ch = ‘A‘;
System.out.println("65和‘A‘是否相等" + (it == ch));
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1和str2是否相等" + (str1==str2));
System.out.println("str1是否equals str2" + str1.equals(str2));
//由于java.lang.String与EqualTest类没有继承关系,
//所以下面编译错误
//System.out.println("hello" == new EqualTest());
}
}
常量池(constant pool)专门用于管理在编译时被确定并保存在已编译的.class文件中的一些数据,它包括关于类,方法,接口中的常量,还包括字符串常量。
JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本,使用new String()创建的字符串对象是运行时创建出来的,他被保存在运行时内存区,不会放入常量池
String已经重写了Object的equals()方法,String()方法判断两个字符串相等的标准是:只要两个字符串所包含的字符序列相同,通过equals()比较返回true,否则返回false
package code;
public class OverrideEqualsRight{
public static void main(String [] args){
Person p1 = new Person("孙悟空","12343433433");
Person p2 = new Person("孙行者","12343433433");
Person p3 = new Person("孙悟饭","99933433");
System.out.println("p1和p2是否相等" + p1.equals(p2));
System.out.println("p1和p2是否相等" + p2.equals(p3));
}
}
class Person{
private String name;
private String idStr;
public Person(){}
public Person(String name,String idStr){
this.name = name;
this.idStr = idStr;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setIdStr(String idStr){
this.idStr = idStr;
}
public String getIdStr(){
return idStr;
}
public boolean equals(Object obj){
//
if(this == obj)
return true;
if(obj != null && obj.getClass() == Person.class){
Person personObj = (Person)obj;
if(this.getIdStr().equals(personObj.getIdStr())){
return true;
}
}
return false;
}
}
p1和p2是否相等true
p1和p2是否相等false
上面程序重写了equals()方法,制定了Person对象和其他对象相等的标准,另一个对象必须是Person类的实例,且两个对象的idStr相等,即可判断两个Person对象相等。
对于instanceof运算符而言,当前面对象是后面类的实例或其子类的实例时都返回true,所以重写equals()方法判断两个对象是否为同一个类的实例时使用instanceof是有问题
时间: 2024-11-05 13:07:45