代码之家  ›  专栏  ›  技术社区  ›  Sean Nguyen

在java中获取超类值

  •  3
  • Sean Nguyen  · 技术社区  · 15 年前

    我有两门课:

    public class A
    {    
        int n = 10;    
    
        public int getN()
        {
            return n;
        }    
    }
    
    public class B extends A
    {    
        int n = 20;
    
        public int getN()
        {
            return n;
        }
    }
    
    public class Test
    {    
        public static void main(String[] args)
        {           
            B b = new B();
            System.out.println(b.getN()); //--> return 20
            System.out.println(((A)b).getN()); //--> still return 20. 
                                               //How can I make it return 10?
        }
    }
    
    4 回复  |  直到 15 年前
        1
  •  5
  •   aioobe    15 年前

    Java中的所有方法都是虚拟的。也就是说,无法从外部调用该方法的“超级”版本。投球给 A 不会有帮助,因为它不会更改对象的运行时类型。

    这可能是你最好的选择/解决方案:

    class A {
    
        int n = 10;
    
        public int getN() {
            return n;
        }
    
        public final int getSuperN() {  // "final" to make sure it's not overridden
            return n;
        }
    }
    
    
    class B extends A {
    
        int n = 20;
    
        public int getN() {
            return n;
        }
    }
    
    public class Main {
    
        public static void main(String[] args) {
            B b = new B();
            System.out.println(b.getN());      // --> return 20
            System.out.println(((A)b).getN()); // --> still return 20.
            System.out.println(b.getSuperN()); // --> prints 10
        }
    }
    
        2
  •  1
  •   Jorge    15 年前

    您不能将值设为“10”,因为对象的实例是针对类B的,当您执行强制转换时,您唯一要做的是更改定义类,而不是设置对象B的值,换句话说,如果您需要获得10,则类似于这样的值

    b = new A();
    
        3
  •  1
  •   Daniel Fath    15 年前

    由于多态性,那东西不起作用。班 B 现在还在上课 B 即使你把它扔进了它的超级课堂。

    我想你需要这样的东西:

    public class B extends A
    {
    
       int n = 20;
    
       /**
       * @return the super n
       */
       public int getSuperN()
       {
          return super.n;
       }
    }
    
        4
  •  0
  •   Starkey    15 年前

    你看到的是多态性在起作用。自从 b 是一个 B ,始终调用该方法(返回20)(无论是否将其强制转换为 A ).