这个布尔方法有啥问题?

Posted

技术标签:

【中文标题】这个布尔方法有啥问题?【英文标题】:Whats wrong with this boolean method?这个布尔方法有什么问题? 【发布时间】:2014-08-31 09:23:21 【问题描述】:

您好,我创建了这个方法。它的工作是接收一个整数 A,它可以是 10 或 30。如果值为 10,则返回 TRUE,否则返回 false。

public static boolean checkStatus(int a)
        if(a.equals(10))
              return true;
        
      return false;
    

由于某种原因,我在 if(a.equals(10)) 条件下遇到编译错误,即 INT CANNOT BE DEREFERNCED。如果我没记错的话, .equals() 方法不是在这种情况下要走的路吗?

感谢您的帮助!

【问题讨论】:

编译错误告诉你什么? if(a.equals(10)) 是一个字符串比较。不适用于整数。请在您的 if 条件中遵循 a==10 @NarendraPal 不,这不是字符串比较,只是非法方法调用。即使sStrings.equals(10)也不是字符串比较,;它总是返回 false 而不进行任何比较。 equals 是一种可以应用于任何对象的方法,而不仅仅是字符串。 @ajb 是的!!!我错了!谢谢 【参考方案1】:

Java 中的基元(intlongfloat 等)没有成员方法,所以调用

if (a.equals(10))

不会编译,因为您正在尝试取消引用原语。相反,您想使用 == 运算符来比较原始值:

if (a == 10)

并保留对非原始Objects 使用equals() 方法

【讨论】:

您能否解释一下 .equals() 方法何时合适。我一直忘记这个:(谢谢! @user3029345 比较对象时只应使用 .equals()。 @user3029345 我在答案的底部添加了一条注释。简而言之,equals方法属于Object宇宙超类,因此Java中的所有其他类,因为它们必须在其层次结构链中扩展Object,继承equals的某些版本。所有对象都应使用此方法进行比较,因为将对象与== 进行比较只会比较对象的引用,以查看引用是否指向内存中的同一位置(不完全,但足够接近)。 @user3029345 equals() 对于StringBigIntegerBigDecimal 和其他一些 Java 定义的类,应始终使用而不是 ==。对于其他对象,equals() 是合适的 if 类的两个不同实例以某种方式“相等”是有意义的。这并不总是有意义的——两个JComponents 相等意味着什么?当它确实有意义时,该类需要定义一个equals 方法(和hashCode)。有时你还想测试两个引用是否指向同一个对象;然后使用==。比较 null 时使用 ==【参考方案2】:

您可以将equals 用于对象,但int原始 类型(a),而不是对象。

因此你需要这样的东西:

public static boolean checkStatus (int a) 
    if (a == 10)
        return true;
   return false;

或更短且更明智的(在这种情况下):

public static boolean checkStatus (int a) 
    return (a == 10);


(a) 纯粹主义者会争辩说,这证明 Java 并不是真正的面向对象语言,但那是因为他们是疯子 :-)

【讨论】:

+1 表示速记 (a == 10)。多余的 if 语句没用。 只是好奇,OPs 案例没有自动装箱吗? 包装盒在哪里? @AntonH,自动装箱发生(例如)当您将int 传递给期望Integer 的函数时,或者当您将int 分配给Integer 变量时。 OP 的原始 if 声明都不是这些。请参阅docs.oracle.com/javase/tutorial/java/data/autoboxing.html 了解更多详情。 @paxdiablo 好的,谢谢您的信息。我一直以为是这样,但你每天都会学到新东西。【参考方案3】:

你可以使用

public static boolean checkStatus(int a)
        if(a==10)
              return true;
        
      return false;
    

public static boolean checkStatus(Integer a)

        if(a.equals(new Integer(10)))
              return true;
        
      return false;
    

【讨论】:

不确定我是否会在第二种情况下创建一个全新的对象,而您只能这样做 if (a.intValue() == 10)【参考方案4】:

int 是 Java 中的原语,原语没有行为,也就是方法。

因此您不能在int 上致电.equals。所以这里的选项是使用==

public static boolean checkStatus(Integer a)
  return (a==10);

或将int 转换为Integer,这是一个包装类

public static boolean checkStatus(Integer a)
    return a.equals(10);

【讨论】:

【参考方案5】:

equals() 方法属于JavaObject 类,并且它必须属于override 每个对象类,例如String, Integer and MyObject(implemented class)。但是int 不是Java Object 并且那里没有equals() 方法。

您可以将 == 与 int 值一起使用,您可以将代码简化如下。

public static boolean checkStatus(int a)
    return a==10;

【讨论】:

【参考方案6】:

equals 主要用于非原始对象。

== 用于基元。

所以,你可以使用它

public static boolean checkStatus (int a) 
    if (a == 10)
        return true;
   return false;

示例 1: 对于对象,如果equals方法被覆盖,那么“equals”方法将返回true。

public class Employee 
    int id;

    @Override
    public boolean equals(Object obj) 
        Employee e = (Employee) obj;
        return id == e.id;
    

    Employee(int id) 
        this.id = id;
    

    public static void main(String[] args) 
        Employee e1 = new Employee(5);
        Employee e2 = new Employee(5);
        System.out.println("e1.equals(e2) is: " + e1.equals(e2));
        System.out.println("(e1 == e2) is: " + (e1 == e2));
    

输出:

e1.equals(e2) 是:true

(e1 == e2) 是:

示例 2: 对于对象,如果equals方法没有被覆盖,那么“equals”方法就像“=="

public class Employee 
    int id;

    Employee(int id) 
        this.id = id;
    

    public static void main(String[] args) 
        Employee e1 = new Employee(5);
        Employee e2 = new Employee(5);
        System.out.println("e1.equals(e2) is: " + e1.equals(e2));
        System.out.println("(e1 == e2) is: " + (e1 == e2));
    

输出:

e1.equals(e2) 是:false

(e1 == e2) 是:

这里的“equals”方法相当于“==”。所以,不要忘记重写对象的equals方法。

【讨论】:

【参考方案7】:

你可以用整数类做这样的事情

  Integer x = 5;
  Integer y = 10;
  Integer z =5;
  Short a = 5;

  System.out.println(x.equals(y));  
  System.out.println(x.equals(z)); 
  System.out.println(x.equals(a));

输出:

  false
  true
  false

【讨论】:

【参考方案8】:

您当然可以将整数包装为:

Integer i = new Integer(a);

那么equals函数就可以和新的Integer对象'i'一起使用了。

【讨论】:

以上是关于这个布尔方法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

“布尔”和“布尔”有啥区别?

有啥可以使静态布尔线程安全的吗?

这个布尔值“(number & 1) == 0”是啥意思?

如何输入布尔值并作为布尔值返回?

带有布尔返回的方法

从调用 Int 的方法返回布尔值