zoukankan      html  css  js  c++  java
  • 重写equals方法发现的一点问题

    这里假设有一个父类为Food,其子类为Apple,现在我们要在Apple中重写equals方法,但是测试的时候,我们会控制一些其他的因素来发现比较结果的不同。

    情况1:

    // 父类 Food
    1
    public class Food { 2 public void sayName(){ 3 System.out.println("我是父类food"); 4 } 5 }
     // 子类 Apple
    1
    public class Apple extends Food{ 2 @Override 3 public void sayName(){ 4 System.out.println("我是苹果"); 5 } 6 7 public void more(){ 8 System.out.println(" this is my own method"); 9 } 10 11 public String name ="红富士1号"; //我们直接在类中进行初始化赋值。 12 public int no=1; 13 14 @Override 15 public boolean equals(Object obj) { 16 if(obj == this){ 17 return true; 18 } 19 if(obj instanceof Apple ){ 20 Apple a1= (Apple)obj; 21 return this.name==a1.name && this.no==a1.no; 22 } 23 24 return false; 25 } 26 }
     // 测试类
    1
    public class test { 2 public static void main(String[] args) { 3 Apple a1= new Apple(); 4 5 Apple a2= new Apple(); 6 7 boolean result1 = a1.equals(a2); 8 System.out.println(result1); 9 } 10 }

    //输出结果是true,这看起来是意料之内的。

    情况2:

    Food 类不变
     // 改写 Apple 类
    1
    public class Apple extends food{ 2 @Override 3 public void sayName(){ 4 System.out.println("我是苹果"); 5 } 6 7 public void more(){ 8 System.out.println(" this is my own method"); 9 } 10 11 public String name ; // 我们改为在类中只声明,不初始化赋值。 12 public int no; 13 14 @Override 15 public boolean equals(Object obj) { 16 if(obj == this){ 17 return true; 18 } 19 if(obj instanceof Apple ){ 20 Apple a1= (Apple)obj; 21 return this.name==a1.name && this.no==a1.no; 22 } 23 24 return false; 25 } 26 }
     // 在测试类中新建了对象之后再给成员属性赋值
    1
    public class test { 2 public static void main(String[] args) { 3 Apple a1= new Apple(); 4 a1.name="红富士"; //在测试类中实例化了对象之后再赋值 5 a1.no=1; 6 7 Apple a2= new Apple(); 8 a2.name= "红富士"; 9 a2.no=1; 10 11 boolean result1 = a1.equals(a2); 12 System.out.println(result1); 13 } 14 }

    // 输出结果竟然是 false

    情况3:

    Food类和Apple类都不变
    // 我们在测试类中,先用父类声明来引用子类对象,然后在向下转型之后才给其成员属性赋值
    1
    public class test { 2 public static void main(String[] args) { 3 Apple a1= new Apple(); 4 a1.name="红富士"; 5 a1.no=1; 6 7 Food f1 = new Apple(); 8 Apple a2 = (Apple)f1; //向下转型后再赋值 9 a2.name= "红富士"; 10 a2.no=1; 11 12 boolean result1 = a1.equals(a2); 13 System.out.println(result1); 14 } 15 }

    // 最后输出结果竟然又成了 true!

    综上,这是为什么? 今天复习的时候无意中发现的这个问题,我一下子还没想明白。。。

  • 相关阅读:
    对于glut和freeglut的一点比较和在VS2013上的配置问题
    应用程序无法启动(0*c000007b)
    无法定位程序输入点glPopAttrib于动态连结库OPENGL.dll上
    计算机中丢失OPENGL.dll
    Visual Studio "无法查找或打开PDB文件"解决方法
    VC包含目录、附加依赖项、库目录及具体设置
    无法解析的外部符号 _WinMain@16
    OpenGL入门学习
    linux-用户建立及权限分配
    linux下添加用户并赋予root权限
  • 原文地址:https://www.cnblogs.com/tangshun100/p/13040784.html
Copyright © 2011-2022 走看看