2017-01-06 2 views
0

У меня есть два заданных классов А и В. В наследует от А.назначения объекта унаследованного класса до супер объект класса

В настоящее время в основном методе класса М есть экземпляр г из A , которые указывают на объект B.

Я знаю, что методы подкласса остаются, если объект унаследованного класса назначен суперклассу.

Вопрос: Так почему же для z.(-6) метод f(double y) из B используется и не f(int y)? Или другими словами: Можете ли вы объяснить, почему вывод дает -8.0 и 4.0?

public class A { 
    public int x = 2; 

    public A() { 
     this.x+++; 
    } 

    public A(int x) { 
     this.x += x; 
    } 

    public void f(double x) { 
     this.x = (int) (x + B.y); 
    } 
} 


public class B extends A { 
    public static double y = 3; 

    public double x = 0; 

    public B(double x) { 
     y++; 
    } 

    public void f(int y) { 
     this.x = y * 2; 
     B.y = 0; 
    } 

    public void f(double y) { 
     this.x = 2 * y + B.y; 
    } 
} 


public class M { 
    public static void main(String[] args) { 
    A a = new A((int) B.y); 
    System.out.println(a.x); // OUT: [5] 

    B b = new B(2); 
    System.out.println(b.x + " " + B.y); // OUT: [0.0] [4.0] 

    A z = b; 
    System.out.println(z.x); // OUT: [3] 

    z.f(-0.5); 
    System.out.println(b.x + " " + z.x); // OUT: [-6.0] [3] 

    z.f(-6); 
    System.out.println(b.x + " " + B.y); // OUT: [-8.0] [4.0] 
    } 
} 
+0

Поскольку 'A' не имеет' F (интермедиат х) '. Также используйте значащие имена переменных и методов. –

+2

Статический тип 'z' -' A', в котором нет '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' этого метода в классе «B». –

ответ

1

В вашем примере z является ссылка не является объектом. z указывает на экземпляр B в реальности, знает он компилятор или нет.

Так почему же для z. (- 6) используется метод f (double y) of B, а не f (int y)?

Вы сказали компилятору, что z является ссылкой на A и это имеет только один метод f(double) который может быть преодолен, но не перегруженный по подклассу.

т.е. подпись методы, называемого определяются во время компиляции (типа компилятора всех это есть), а не во время выполнения (не фактический типа)

Смежные вопросы