2014-10-14 3 views
2

Пожалуйста, запустите выход ниже двух программ ...Почему ниже двух программ дает концептуально разные выходы?

Program_1:

package p1; 

class x { 
    public void methodA() { 
     System.out.println("Methos A of Class X"); 

    } 
} 

class y extends x { 
    public void methodA() { 
     System.out.println("Method A of Class Y"); 
    } 
} 

class Override1 { 
    public static void main(String[] args) { 
     x obj1 = new x(); 
     x obj2 = new y(); 
     y obj3 = new y(); 
     /* y obj4 = new x(); */ 

     obj1.methodA(); 
     obj2.methodA(); 
     obj3.methodA(); 
     /* obj4.methodA(); */ 
    } 
} 

Program_2:

class x { 
    int a[] = new int[2]; 

    x() { 
     a[0] = 10; 
     a[1] = 20; 
    } 

} 

class y extends x { 
    int a[] = new int[10]; 

    y() { 
     a[0] = 12000; 
     a[1] = 1000; 
     a[2] = 120; 
    } 

} 

class Override2 { 
    public static void main(String[] args) { 
     x obj1 = new x(); 
     x obj2 = new y(); 
     // y obj3 = new x(); 
     y obj4 = new y(); 
     System.out.println(obj1.a[1]); 
     System.out.println(obj2.a[1]); 
     System.out.println(obj4.a[1]); 

    } 
} 

Мой конкретный вопрос заключается в том, что в Program_1 какими средствами MethodA от класс Y Вызывается? и в program_2 с помощью Что означает '20' (a [1]) от класс X называется?

Пожалуйста, очистите мою основную концепцию создания объекта относительно выделения памяти и задания ссылки.

+3

Можете ли вы предоставить выход, а? – DeepInJava

+0

вы не можете переопределить переменную в java, но вы можете переопределить метод. –

+0

. Вам нужно задать более конкретный вопрос, чем *, пожалуйста, очистите мою основную концепцию создания объекта относительно выделения памяти и задания ссылки *. – TheLostMind

ответ

1

Короткий ответ заключается в том, что в Java нет полиморфизма данных.

В первом примере methodA - это тот же метод, реализованный в разных классах.

Во втором примере два a являются полностью отдельными не связанными элементами данных (хотя они имеют одно и то же имя и тип данных).

Второй пример эквивалентен:

class x { 
    int a_x[] = new int[2]; 
    x() { 
     a_x[0] = 10; a_x[1] = 20; 
    } 

} 
class y extends x { 
    int a_y[] = new int[10]; 
    y() { 
     a_y[0] = 12000; a_y[1] = 1000; a_y[2] = 120; 
    } 
} 

class Override2 { 
    public static void main(String[] args) { 
     x obj1 = new x(); 
     x obj2 = new y(); 
     y obj4 = new y(); 
     System.out.println(obj1.a_x[1]); 
     System.out.println(obj2.a_x[1]); 
     System.out.println(obj4.a_y[1]); 
    } 
} 
+0

получил it.variable выходит за пределы сферы применения, когда закрывающиеся скобки закрыты ... так что другая переменная будет иметь разные свойства, хотя имеет одно и то же имя ... но ее не то же самое в методах ... приятное объяснение ... спасибо –

0

Мой конкретный вопрос заключается в том, что в программе_1 каким образом MethodA класса Y называется? -> Его называют Динамический диспетчер механизм (переопределение метода). проверьте here. Здесь метод RHS (тип экземпляра) вызывается независимо от ссылки на LHS (child/parent), если родитель определяет тот же метод.

Что означает '20' (a [1]) класса X называется -> зависит от типа ссылки. Если ссылка имеет значение X, то x.field называется irrespctive of RHS.

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