带有main方法的Java继承类

时间:2013-10-02 16:12:17

标签: java

我定义了2个对象

在Object-1中,当我引用子对象时,它调用子方法m1(),而在Object-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

3 个答案:

答案 0 :(得分:1)

静态方法由其类型调用,而实例方法则根据对象类型调用。 静态方法未被覆盖

当你说,

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

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

但是,当你说,

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

这里,m1()static方法,它绑定到类类型。因此,d.m1()会调用static方法,d类型为Drink

答案 1 :(得分:1)

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

无论如何,当您在第二个示例中致电d.m1()时,您真正致电Drink.m1(),因为d被宣布为Drink

答案 2 :(得分:0)

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

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