这个布尔方法有啥问题?
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 不,这不是字符串比较,只是非法方法调用。即使s
是String
,s.equals(10)
也不是字符串比较,;它总是返回 false
而不进行任何比较。 equals
是一种可以应用于任何对象的方法,而不仅仅是字符串。
@ajb 是的!!!我错了!谢谢
【参考方案1】:
Java 中的基元(int
、long
、float
等)没有成员方法,所以调用
if (a.equals(10))
不会编译,因为您正在尝试取消引用原语。相反,您想使用 ==
运算符来比较原始值:
if (a == 10)
并保留对非原始Objects
使用equals()
方法
【讨论】:
您能否解释一下 .equals() 方法何时合适。我一直忘记这个:(谢谢! @user3029345 比较对象时只应使用 .equals()。 @user3029345 我在答案的底部添加了一条注释。简而言之,equals方法属于Object
宇宙超类,因此Java中的所有其他类,因为它们必须在其层次结构链中扩展Object
,继承equals
的某些版本。所有对象都应使用此方法进行比较,因为将对象与==
进行比较只会比较对象的引用,以查看引用是否指向内存中的同一位置(不完全,但足够接近)。
@user3029345 equals()
对于String
、BigInteger
、BigDecimal
和其他一些 Java 定义的类,应始终使用而不是 ==
。对于其他对象,equals()
是合适的 if 类的两个不同实例以某种方式“相等”是有意义的。这并不总是有意义的——两个JComponent
s 相等意味着什么?当它确实有意义时,该类需要定义一个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()
方法属于Java
的Object
类,并且它必须属于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'一起使用了。
【讨论】:
以上是关于这个布尔方法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章