猿问

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

我正在尝试在下面的代码片段中打印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 10

int 10

int 20

为什么总是打印int而不是整数?


慕村225694
浏览 208回答 3
3回答

蓝山帝景

您的问题有一个简单的答案。在解决方案之后,我将说明每种情况下的输出。在此之前,有关您的代码段的一些注意事项:随着类的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 Bvoid test(){}//In the main methodA a = new B();// a.test();  // The test method will not be available in class `A`, though the instantation of `a` is of type `B`.

白板的微信

该行为与自动装箱和自动拆箱有关。有了这个线常见的两种情况下,请注意,这个例子是不相关的方法覆盖。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) */方案2class 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 */

ABOUTYOU

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);    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答