举个例子,我想模仿String对象的功能:
String mystring = new String ( "Hi there." );
System.out.println(mystring); // prints "Hi there." without calling any methods on String
// (that is what I want with my object)
System.out.println(mystring.toUpperCase()); // prints "HI THERE."
从这开始:
class MyObject
{
private Int value ;
public MyObject ( Int value )
{
this.value = value ;
}
public Int getValue ( )
{
return this.value ;
}
public Int multiplyBy ( Int multiplier )
{
return this.value * multiplier ;
}
}
......我(或我可以)做这样的事情:
MyObject myobject = new MyObject ( 6 ) ;
System.out.println( myobject ) ; // want to print myobject.value (6)
System.out.println( myobject.multiplyBy ( 2 ) ) ; // print 12
我对Java很新,并意识到我可能错过了一些基本概念,但任何反馈都会受到赞赏。谢谢。
编辑: 关于覆盖toString方法的响应是有帮助的,但它并没有完全按照我的想法进行,这里是我想要的更好的例子:
Double mydouble = new Double ( 20.1 ) ;
System.out.println ( mydouble + 10.1 ) ; // prints 30.2
我如何使用自己的对象(假设我希望默认值为double)?
再次感谢。
最终编辑(希望): 您的回答足以让我了解更多有关原始包装和Autounboxing的信息。我的理解是没有办法做我想做的事情(在这一点上,我将其描述为自动将我的对象称为双重),或者至少我会将其保存为另一个问题。欢呼声。
答案 0 :(得分:7)
是的,您可以这样做:您需要做的就是覆盖toString
:
public String toString() {
return ""+this.value;
}
这可行,因为println
会在正在打印的对象上调用toString
。
答案 1 :(得分:3)
在 MyObject类中覆盖toString()method
。
private int value ;
public String toString() {
return Integer.toString(this.value);
}
答案 2 :(得分:1)
Java总是首先执行“内部”语句。所以说我们有一个Double:
Double db = new Double(20.1);
然后你想这样做:
System.out.println(db + 10)
然后编译器将首先执行此部分db + 10
,其中自动装箱/取消装箱变为db.doubleValue() + 10
,其被评估为30.1
。然后使用System.out.println(x)
评估outter函数(x=30
)。
当您拥有以下代码System.out.println(db + "hi")
时,编译器会发现您正在向字符串db
添加内容("hi"
),因此会在.toString()
上调用db
}。然后将(字符串)添加到“hi”,它将为您提供最终字符串:"20.1hi"
希望这可以帮助您了解幕后发生的事情。
答案 3 :(得分:0)
只需使实例方法返回一个新实例:
public MyObject multiplyBy(int multipler)
{
return new MyObject(value * multipler);
}
(哦,那将是int
,而不是Int
)
并实现.toString():
@Override
public String toString()
{
return Integer.toString(value);
}