如果有两个数字要判断是否相等, 可以使用 “ ==” 完成, 如果是字符串要判断
是否相等可以使用 “equals()”, 但是如果有一个自定义的类, 要想判断它的两个对
象是否相等, 那么必须要实现类对象中所有属性内容的比较。
范例:基础的比较方式。
//对象比较
class Book{
private String title;
private double price;
public Book(String title,double price){
this.title=title;
this.price=price;
}
public String getTitle(){
return this.price;
}
public double getPrice(){
return this.price;
}
}
public class TestOoEquals{
public static void main(String args[]){
Book b1=new Book("Java开发",79.8);
Book b2=new Book("Java开发",79.8);
if (b1.getTitle().equals(b2.getTitle()
&&b1.getPrice()==b2.getPrice())
{
System.out.println("是同一个对象!");
}else{
System.out.println("不是同一个对象!");
}
}
}
本程序在主方法中产生了两个Book类对象, 同时这两个Book类对象的属性都完全一样, 但是要想
判断这两个对象是否相等, 则依然需要取出对象中的每一个属性进行比较, 如果所有属性的内容相同则
认为是同一个对象, 否则认为是不同的对象。
String类中的equals()方法也属于对象比较操作。
关于封装属性在类内部的直接访问问题。
如果一个类中的属性使用了private封装, 那么在类的外部不能逼近对象直接调用属性。
但是如果将一个对象传递回类的方法里, 就相当于取消了封装的形式, 可以直接通过
对象访问属性。
范例:观察封装属性的进一步操作。
class Info{
private String msg="Hello";
public void print(){
System.out.println("msg="+msg);
}
//本类接收本类对象
public void fun(Info temp){
//在类的内部直接利用对象访问私有属性
temp.msg="修改内容";
}
}
public class TestOoEquals1{
public static void main(String args[]){
Info x=new Info();
x.fun(x); //没有意义,只是一个语法验证
x.print();
}
}
本程序直接在Info类的fun()方法中接收了一个Info类的属性(接收本类引用), 由于
fun()方法属于Info类的内部方法, 所以在这个方法中可以直接利用对象访问类中的属性。
代码没有什么实际的意义, 主要是为了验证private属性封装以及引用传递的问题;
范例:对象比较实现。
//对象比较一定是某一个类自己定义的功能
//对象比较时一定要判断是否为null,地址,属性是否相同。
class Book{
private String title;
private double price;
public Book(String title,double price){
this.title=title;
this.price=price;
}
//本类接收本类对象,对象可以直接访问属性,不需要使用getter了
//两功能:带回了需要比较的信息,方便访问
public boolean compare(Book book){
if(book=null){
return false; //没有必要进行具体的判断了
}
//执行"bi.compare(b2)"代码时会有两个对象
//当前对象this(调用方法对象,就是b1引用)
//传递的对象book(引用传递,就是b2引用)
if(this.title.equals(book.title)
&&this.price==book.price){
return true;
}else{
return false;
}
}
public String getTitle(){
return this.price;
}
public double getPrice(){
return this.price;
}
}
public class TestOoEquals{
public static void main(String args[]){
Book b1=new Book("Java开发",79.8);
Book b2=new Book("Java开发",79.8);
if (b1.compare(b2))
{
System.out.println("是同一个对象!");
}else{
System.out.println("不是同一个对象!");
}
}
}
本程序直接在Book类的内部定义了一个compare()方法, 而此方法完成的功能就是进行比较, 而且
当一个类接收了本类对象的引用后. 可以直接调用本类中的私有化操作。所以这个时候对于compare()
方法就有了两个实例化对象,
一个为传入的Book类对象, 另一个为当前对象this()通过本程序, 读者也可以发现对象比较的操作有如下4个特点。
• 本类接收内己的引用, 再与本类当前对象( this )进行比较;
• 为了避免NullPointerException的产生, 应该增加一个null的判断;
• 为了防止浪费’性能的情况出现(要判断的属性会多), 可以增加地址数值的判断;
• 进行属性的依次比较, 如果属性全部相同, 则返回true, 否则返回false。