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

这是一个简单的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 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”);}
现在在main
Fruit f=new Grape();如果调用
f.taste();`它将调用Grape的版本,因为我们有Fruit对Grape对象的引用。Fruit包含方法
taste()
,并且
Grape
水果