12.对象比较

版权声明:原创文章,转载请声明原处 https://blog.csdn.net/qq_41723615/article/details/86295912

如果有两个数字要判断是否相等, 可以使用 “ ==”  完成, 如果是字符串要判断
是否相等可以使用 “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。

 

猜你喜欢

转载自blog.csdn.net/qq_41723615/article/details/86295912