【问题标题】:Confusion regarding variable assignment and allocation关于变量分配和分配的困惑
【发布时间】:2014-08-25 07:06:37
【问题描述】:

下面是继承概念的测试程序。 如果我正在运行此程序,则 o/p 为“Im A 的方法 - 1”,如果我删除注释,则输出为“Im b 的方法 - 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 类。请纠正我!!!

【问题讨论】:

  • @downvoter 请发表评论!! :)
  • 你应该阅读 Java 多态性和继承

标签: java variables variable-assignment


【解决方案1】:

这是Java中dynamic binding的经典案例。所以在阅读此评论后,您应该先阅读一下this

其次。它显示了 Im A 的方法 - 1 因为看看你的main,你在说A value = new B(),你在说我有一辆汽车,我想要它做一辆车。

此外,您正在调用 int 而不是 Integer 类型的值的方法,因此它会调用需要 B 类中的 int 的方法。

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

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

【讨论】:

  • @NoobEditor 如何将高亮添加到单词中?
  • 在标准键盘中使用 TAB 键上方的 `...也在回答时格式化帮助:)
  • 非常感谢您。您不知道我遇到了多少次这样的编辑,也不知道其他人是如何做到的
  • 不客气……您只需单击每个答案下方的灰色 编辑 链接,然后自己检查所有格式字符! ;)
  • 在你第一次回答之后,我确实点击了编辑,简直不敢相信自己的眼睛
【解决方案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) 方法更受欢迎。

【讨论】:

    【解决方案3】:

    覆盖是在运行时解决的,因此,在您的情况下,它将始终关注属于 B 类的对象。

    A a = new B();
    

    因此,一旦你重写 test() 方法并运行 main 方法,B 的方法将被调用,否则 A 的方法将被调用。

    【讨论】:

      【解决方案4】:

      看看你什么时候做

      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"
      

      【讨论】:

        【解决方案5】:

        这意味着什么? a 总是指向 B 类中的方法还是意味着别的?

        是的。当你写

        A a=new B();
        

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

        【讨论】:

        • 所以如果我从a 调用一个方法。它首先会在class B 中查找,如果在那里找不到,那么它将在class A 中查找,只是因为我做了A a=new B();??
        • 无需查找。你刚刚写了A a = new B()。所以JVM有足够的信息来调用哪个方法。
        猜你喜欢
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 2012-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多