0

我定义了 2 个对象

在 Object-1 中,当我引用子对象时,它会调用子方法 m1(),而在 Object-2 中,当我引用子方法 m1() 时,它会引用 Parent 对象。

在这两种情况下,我假设父对象将在运行时保存一个子类型对象......

对象-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
4

3 回答 3

1

静态方法由它们的类型调用,而实例方法是根据对象类型调用的。静态方法不会被覆盖

当你说,

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

您正在创建引用类型,Parent但对象类型为Child. m1()是实例方法,因此它被覆盖并Child调用该方法,因为对象是类型Child

但是当你说,

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

这里,m1()static绑定到类类型的方法。所以将按类型d.m1()调用该static方法dDrink

于 2013-10-02T16:17:13.613 回答
1

在您的第二个示例中,这些m1()方法是静态方法。你的编译器应该在你执行时给你一个警告d.m1(),关于以非静态方式引用静态方法的东西。

无论如何,当您d.m1()在第二个示例中调用时,您实际上是在调用,Drink.m1()因为d它被声明为 a Drink

于 2013-10-02T16:18:13.207 回答
1

使用引用变量调用静态方法意味着您处于 Sin 状态 :)

静态方法/变量只是类的一部分,不能被覆盖。

于 2013-10-02T16:31:55.420 回答