2016-08-31 3 views
-4
package test; 
public class Test { 

    public static void main(String[] args) { 
     A a2 = new B();    // 1 
     a2.display1(); 
     a2.display(); 
     ((B) a2).display2();   // 2 
     ((A) a2).display();   // 3 
     B b1 = new B(); 
     b1.display1();    // 4 
    } 
} 

class A { 
    int a = 10; 

    void display() { 
     System.out.println("parent class " + a); 
    } 

    void display1() { 
     System.out.println("parent class " + (a + 10)); 
    } 
} 

class B extends A { 
    int a = 30; 

    @Override 
    void display() { 
     System.out.println("child class " + a); 
    } 

    void display2() { 
     System.out.println("child class " + (a + 10)); 
    } 
} 
  1. которого создается объект? Класса А или В.
  2. Является ли это понижающее приведение
  3. почему это не вызова метода класса А? как вызвать метод класса A (переопределить один) с этим объектом, а не с объектом A.
  4. - это неявное повышение?
  5. Если класс А имеет вложенный класс B, чем при создании объекта класса А ли объект класса B также сформированный? Я не смог использовать метод класса B с объекта
+0

Как насчет того, чтобы вы задавали один вопрос за раз, с минимальным количеством кода, необходимым для его демонстрации, выстроенным разумно? – khelwood

+0

@khelwood спасибо за ответ .it помог :) – ekaf

+0

@Stephen thanks :) – ekaf

ответ

1
  1. Вы делаете new B(), поэтому, очевидно, создается объект B.

  2. Да, от типа A к подтипу B, который не соответствует иерархии классов.

  3. Поскольку a2 относится к B объекта и который вызывается метод определяется динамически (во время выполнения, а не во время компиляции), смотря на то, что тип фактического объекта.

  4. Нет, здесь вообще нет кастингов.

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

+0

спасибо за ответ .few сомневаются в 1.if Создан объект B, чем почему я не могу вызвать метод класса B. Это его потому что мой a2 ссылается только на класс A. 3. Чтобы вызвать метод display() из класса A, мне нужно создать объект A отдельно? – ekaf

+0

извините за отступ кода и по английски – ekaf

+1

1. Да, вы можете вызывать только методы, которые существуют в типе, который имеет переменная (или ее суперклассы/интерфейсы)/3. Да, или вызывать 'super.display();' from метод в классе 'B'. – Jesper

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

  • Нет связанных вопросов^_^