2013-10-02 3 views
0

У меня 2 объекта определяетсяклассы Java Наследование с основным методом

В объектно-1, когда я ссылаться на дочерний объект он вызывает метод ребенок m1(), тогда как в объектно-2, когда я ссылаться на дочерний метод m1 () он ссылается на родительский объект ..

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

объект-1

package pkgB; 

    class Parent{ 
     static int i = 10; 
     void m1(){ 
      System.out.println("In Parent = " + i); 
     } 

     static void m1(String s){ 
      System.out.println(s +i); 
     } 
    } 

    public class Child extends Parent{ 
     static int i = 20; 
     void m1(){ 
      System.out.println("In child" + Child.i); 
     } 
     public static void main(String[] args){ 
      Parent p = new Child(); 
      p.m1(); 

     } 
    } 

Объект-2

package pkgB; 



class Drink{ 
    public static void m1(){ 
     System.out.println("Im Drink method"); 
    } 

} 

class Coffee extends Drink{ 
    public static void m1(){ 
     System.out.println("Im Coffee method"); 
    } 

} 

public class test { 

    public static void main(String[] args) { 
     Drink d = new Coffee(); 
     d.m1(); 

    } 
} 

Выход Dobject-1:

In child20 

Выход Dobject-2:

Im Drink method 
+0

Вы не можете переопределять статические методы. И помимо этого, вы не должны вызывать статические методы для экземпляра. (В вашей среде IDE должно появиться предупреждение!) – dognose

ответ

1

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

Когда вы говорите,

Parent p = new Child(); 
    p.m1(); 

Вы создаете ссылочный тип Parent но тип объекта из Child. m1() является методом экземпляра, так что переопределяется и метод Child называется потому, что объект типа Child

Но когда вы говорите,

Drink d = new Coffee(); 
    d.m1(); 

здесь, m1() является static метод, которые связаны с типом класса. Так d.m1() будет вызывать метод static, как d имеет тип Drink

1

В вашем втором примере m1() методы являются статическими. Ваш компилятор должен дать вам предупреждение, когда вы выполните d.m1(), что-то о том, чтобы ссылаться на статический метод нестатически.

Во всяком случае, когда вы звоните d.m1() во втором примере, вы действительно вызова Drink.m1() так d объявлен Drink.

0

Вызов статического метода с использованием ссылочной переменной означает, что вы в состоянии греха :)

статические методы/переменные являются только частью класса и не могут быть переопределены.

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