当我运行此代码时,输出为(MyInt @ 15db9742) - 对象地址 - :
public static void main(String[] args) {
MyInt myInt = new MyInt(2);
System.out.println(myInt);
}
class MyInt {
public int val;
public MyInt(int val){
this.val = val;
}
}
我想要做的是:打印没有myInt.val的val
我试图覆盖toString()?!
public String toString(){
return ""+val;
}
它有效!但我希望返回类型为int / Integer NOT String,并且存在编译器错误
返回类型与Object.toString()“
不兼容
当我将返回类型更改为int时。有没有办法做到这一点?
编辑:
简而言之:
Integer integer = new Integer(5);
int INT = integer;
System.out.println(INT);
所以我希望myClass“MyInt”的工作方式就像“Integer”类一样 所以我可以直接分配int val
MyInt myInt = new MyInt(5);
int INT = myInt; // I don't need to type "myInt.val"
System.out.println(INT);
答案 0 :(得分:6)
概念和代码质量级别错误。
该方法称为 toString()。
每个Java程序员都知道这件事应该做什么(提供你调用它的对象的字符串表示)。
每个Java程序员都希望此方法返回 String ,而不是int。
长话短说:而不是覆盖现有方法并彻底改变他们的行为(顺便说一句,这是一个非常糟糕的想法):只需添加自己的新方法并给出一个合理的名称。
最后:您的想法(更改方法的“合同”)通常违反了Liskov Substitution Principle。含义:不要做因为你可以做这些事情。而是真正学习和理解您打算使用的概念。我所说的:良好的OO设计中的正确的继承比在某处放置一些 extends 关键字更强更多;和一些@Override在方法声明面前。
答案 1 :(得分:1)
当你打电话给这个时,你似乎误解了幕后发生的事情:
System.out.println(myInt);
println
方法接受Object
参数,然后在该对象上调用.toString()
方法。 toString()
方法始终返回一个字符串。因此你所做的(返回一个字符串)是正确的。
请注意,执行此操作时:
System.out.println(1);
然后有println
专门用于int
参数的重载。但是您无法将对象传递给println
并期望将其视为基本类型。