Java 这里是如何实现继承的?
这是一个简单的Java代码:Java 这里是如何实现继承的?,java,Java,这是一个简单的Java代码: public class JTest { public static void main(String []args) { Integer a = new Integer(2); Object b = a; System.out.print("r = " + b); } } 在Java中,所有对象都有一个父对象。 运行此程序时,您将获得: r=2 为什么? 如果我对该代码执行相同的操作: public
public class JTest {
public static void main(String []args) {
Integer a = new Integer(2);
Object b = a;
System.out.print("r = " + b);
}
}
在Java中,所有对象都有一个父对象。
运行此程序时,您将获得:
r=2
为什么?
如果我对该代码执行相同的操作:
public class JTest {
public static void main(String []args) {
A a = new A();
Object b = a;
System.out.print("r = " + b);
}
}
其中A类为:
public class A {
int a;
}
输出将是:
r=测试。A@9304b1它将调用调用方法的对象的
toString()
方法。如果未实现,则默认情况下,对象类提供一个
尝试通过这种方式覆盖它并检查输出
public class A {
int a;
@Override
public Sring toString(){
return "A has property a = "+this.a;
}
}
Integer.toString()
返回包含整数值的字符串
您的类没有实现自己的
toString()
,因此它使用默认的对象。toString()
实现返回对象的类及其哈希代码的组合。在第一个实例中,b
包含一个Integer
的实例,因此toString()
在打印中调用整数的实现
在第二种情况下,b
包含A
的实例,因此调用A
的toString()
实现。大概A
不会覆盖toString()
,因此您可以从对象
(包)获得默认实现。Class@hash)
编辑(问题更改后):
类A
仅包含int
字段,它不扩展int
。如果将A
更改为重写toString(不能扩展int
之类的基元类型),则可以得到所需的:
class A {
Integer a;
public A(int i) {
a = i;
}
@Override
public String toString() {
return a.toString();
}
}
当您执行System.out.print时(“r=“+b”)代码>Java将调用b.toString()
。方法toString
继承自对象
。在第一种情况下,类Integer
覆盖toString
以返回整数值。您的A
类没有覆盖toString()
,因此您只会得到一个默认值(对象类和哈希代码)在第一个实例中,对象有一个toString方法,因此实际值将被打印出来。但是,如果没有像第二个实现那样的toString方法,您会得到类/对象的ID。在第一种情况下,Integer类有一个“toString”方法,当与“r”+b组合时,它会给您一个“a”的文本表示形式,它将是2,如果要获取已重写toString()的类型的java.lang.Object样式输出,可以使用以下代码:
public static String toString(Object o) {
if (o == null) return null;
return o.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(o));
}
@Jigar Joshi谢谢你的回答,但还有一个问题。在第一个代码示例中,对对象b的引用如何找到其继承整数的“toString”方法?我认为“toString”方法有自己的实现。但是,作为一个对象引用,它怎么能确定还有另一个“toString”方法可以替代呢?@maximus,我想我不清楚你用这个评论问了什么,但我会尝试:该方法将在对象上执行。@Jigar Joshi让我用另一种方式问。对不起。在这一行:System.out.print(“r=“+b”);必须调用Integer.toString方法:a.toString(),对吗?但是我们有b。声明为:对象b=a;b是对对象的引用,对象有自己的toString()方法。我不明白为什么调用a的(整数)toString()方法?这是因为对象是Integer
方法在对象上被调用。让我举另一个例子类水果{public void taste(){SOP(“sweet”);}
,类葡萄扩展了水果{public void taste(){sour”);}
现在在mainFruit f=new Grape();如果调用f.taste();`它将调用Grape的版本,因为我们有Fruit对Grape对象的引用。Fruit包含方法taste()
,并且Grape
是水果