为了账号安全,请及时绑定邮箱和手机立即绑定

为什么父子关系中的int和Integer总是在java中打印int?

为什么父子关系中的int和Integer总是在java中打印int?

慕村225694 2021-04-09 14:15:41
我正在尝试在下面的代码片段中打印Integer值,但是每次它都会打印int块时。为什么会这样呢?class A {    void methodOne(int i) {        System.out.println("int " + i);    }}class B extends A {    void methodOne(Integer i) {        System.out.println("Integer " + i);    }}public class Solution {    public static void main(String[] args) {        A a = new B();        a.methodOne(10);        a.methodOne(new Integer(10));        B b = new B();        b.methodOne(20);    }}输出:int 10int 10int 20为什么总是打印int而不是整数?
查看完整描述

3 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您的问题有一个简单的答案。在解决方案之后,我将说明每种情况下的输出。在此之前,有关您的代码段的一些注意事项:


随着类的B扩展A,并且具有methodOne具有不同类型的parameter(Integer)的相同方法,它具有method的两个重载版本methodOne。

A a = new B();这里a是B和类型的实例A。

理由:


a.methodOne(10):参数的类型10为int。这样void methodOne(int i)的类A被调用。

a.methodOne(new Integer(10)):参数的类型new Integer(10)为,Integer但methodOne(Integer i)子类中的方法对者B不可见a。因此new Integer(10)取消装箱int 10并再次调用void methodOne(int i)class A。

b.methodOne(20):作为b的实例B,它具有method的两个版本methodOne。但是参数的类型10是int,因此又调用void methodOne(int i)了类A(其父类)。

解决方案:


B b = new B();

b.methodOne(new Integer(20));

此处,参数的类型20为Integer。因此void methodOne(Integer i),B将调用class的。


这是一个小实验,可以帮助您了解父类中子类方法的不可见性。在类B中放置一个伪方法,并尝试使用类型为的对象A但类型为的实例B进行访问。以下是修改后的代码。


// Place this method in Class B

void test(){


}


//In the main method

A a = new B();

// a.test();  

// The test method will not be available in class `A`, though the instantation of `a` is of type `B`.



查看完整回答
反对 回复 2021-04-18
?
白板的微信

TA贡献1883条经验 获得超3个赞

该行为与自动装箱和自动拆箱有关。有了这个线常见的两种情况下,请注意,这个例子是不相关的方法覆盖。


A a = new B();

a.methodOne(10); /* line 1 */

a.methodOne(new Integer(10)); /* line 2 */

B b = new B();

b.methodOne(20); /* line 3 */

b.methodOne(new Integer(20)); /* line 4 */

方案1:


class A {

    void methodOne(Integer i) {

        System.out.println("Integer " + i);

    }

}


class B extends A {

    void methodOne(int i) {

        System.out.println("int " + i);

    }

}

输出


Integer 10 /* line 1, [AutoBoxing] */

Integer 10 /* line 2 */

int 20     /* line 3, B has method(int) */

Integer 20 /* line 4, B has method(Integer) */

方案2


class A {

    void methodOne(int i) {

        System.out.println("int " + i);

    }

}


class B extends A {

    void methodOne(Integer i) {

        System.out.println("Integer " + i);

    } 

}

输出


int 10     /* line 1 */

int 10     /* line 2, [auto unboxing] */

int 20     /* line 3 */

Integer 20 /* line 4 */


查看完整回答
反对 回复 2021-04-18
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

class A {

    void methodOne(Integer i) {

        System.out.println("Integer " + i);

    }

}


class B extends A {

    void methodOne(int i) {

        System.out.println("int " + i);

    }

}


public class Solution {

    public static void main(String[] args) {

        A a = new B();

        a.methodOne(10);

        a.methodOne(10);

        B b = new B();

        b.methodOne(20);

    }

}


查看完整回答
反对 回复 2021-04-18
  • 3 回答
  • 0 关注
  • 207 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信