代码之家  ›  专栏  ›  技术社区  ›  pulse

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

  •  0
  • pulse  · 技术社区  · 10 年前

    下面是继承概念的测试程序。 如果我正在运行这个程序,则o/p是“Im A的方法-1”,如果我删除注释,则输出是“Imb的方法-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 回复  |  直到 10 年前
        1
  •  2
  •   NoobEditor    10 年前

    这是一个典型的案例 dynamic binding 所以在阅读完这篇评论之后,你应该先了解一下 this

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

    此外,您正在对类型为的值调用方法 int Integer 所以它调用需要 整数 在里面 B 的类。

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

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

        2
  •  2
  •   Wyzard    10 年前

    当您在 a 变量,它将调用 B 类(如果有);否则它将调用从 A .

    你在打电话 test 文字数字为2 int ,不是 Integer 。因此所调用的方法是 test(int) test(Integer) 自从 B 未定义 测试(int) 方法,它调用 A. .

    如果 A. 没有 测试(int) 方法,则编译器将转换 整数 整数 (这称为“自动装箱”),并查找可用的 测试(整数) 方法在这种情况下,你可以从 B 但当你通过 整数 ,任何可用 测试(int) 方法(甚至是继承的方法)比 测试(整数) 方法

        3
  •  1
  •   Abhishek    10 年前

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

    A a = new B();
    

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

        4
  •  1
  •   Sumeet Sharma    10 年前

    看看你做什么

    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
  •  0
  •   Suresh Atta    10 年前

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

    对当你写的时候

    A a=new B();
    

    现在,当您在上调用方法时 a ,类中重写的实现 B 电话。