关于变量赋值和分配的困惑

时间:2014-08-25 07:06:37

标签: java variables variable-assignment

以下是继承概念的测试程序。 如果我正在运行这个程序,那么o / p是“Im A的方法 - 1”,如果我删除了注释,那么输出是“Im b's method - 2”。

   class A {

        public void test(int x){
            System.out.println("Im A's method - 1");
        }

        public void test(Integer x){
            System.out.println("Im A's method - 2");
        }
   }

   class B extends A{
        public void test(Integer x){
            System.out.println("Im b's method - 1");
        }


        // public void test(int x){
        //     System.out.println("Im b's method - 2");
        // }
        // 
   }

   public class Test {
        /**
         * @param args
         */
        public static void main(String[] args) {
            A a=new B();
            a.test(2);
        }
   }

问题:

根据我的知识,它不应该扩展到A级。请纠正我!!!

5 个答案:

答案 0 :(得分:2)

这是Java中dynamic binding的典型案例。所以,在阅读本评论之后,您应该先阅读一些关于this

的内容。

其次。它正在显示 Im A的方法 - 1 因为看看你的main,你说A value = new B()你说的是我有汽车和我希望它成为一辆汽车。

此外,您正在调用类型为int而不是Integer的值的方法,因此它会调用intB中需要{{1}}的方法。< / p>

因为你没有这样的方法,所以它继续在超类中搜索它。

PS:如果你打算继续学习java并在java中工作,这是你在面试中会得到很多的问题

答案 1 :(得分:2)

当您在a变量上调用方法时,它会调用B类中定义的方法的版本(如果有);否则它将调用从A继承的版本。

您使用文字编号2(test而不是int来调用Integer。所以被调用的方法是test(int),而不是test(Integer)。由于B未定义test(int)方法,因此会调用A中的方法。

如果A也没有test(int)方法,则编译器会将int转换为Integer(这称为“自动装箱”)并查看对于可用的test(Integer)方法。在这种情况下,您将从B获得一个。但是当您传递int时,任何可用的test(int)方法(甚至是继承的方法)都优于test(Integer)方法。

答案 2 :(得分:1)

覆盖在运行时得到解决,因此,在您的情况下,它总是会照看B类的对象。

A a = new B();

因此,一旦覆盖test()方法并运行main方法,将调用B的方法,否则将调用A的方法。

答案 3 :(得分:1)

看你何时

A a = new B();

B中覆盖A方法的所有方法都可以访问,而A中未被B覆盖的方法也可以访问。

所以

a.test(1); will print "Im A's method - 1"

a.test(new Integer(1)); will print "Im B's method - 1"

答案 4 :(得分:0)

  这意味着什么?总是指向B类中的方法,或者它意味着什么?

是。当你写

A a=new B();

现在,当您在a上调用方法时,会从类B调用覆盖的实现。