class A {
public static void a() {
System.out.println("super!");
}
}
class TestStatic extends A {
public static void a() {
System.out.println("child!");
}
public static void main( String[] args) {
A obj = new TestStatic();
        System.out.println(obj);
obj.a();
}
}
问:obj是属于子类对象还是父类对象,为什么?在obj.a();中a方法究竟是调用的哪个方法?public static void a() {
System.out.println("child!");
}
方法前面加static和不加static有什么区别? 为什么我见过的方法前面都有void,是必须的么??结果究竟是输出哪个?

解决方案 »

  1.   

    public static  void main( String[] args) 
    这是main的写法,如果你不加static、void  是不能直接运行的对于其他方法当然可以不写
    如果不写 void  要写你确实的返回值
      

  2.   

    class A {
        public void a() {
            System.out.println("super!");
        }
    }class TestStatic extends A {
        public void a() {
            System.out.println("child!");
        }    public static void main(String[] args) {
            A obj = new TestStatic();
            System.out.println(obj);
            obj.a();
        }
    }对比一下这段程序你就知道 static的用处了
      

  3.   

    new TestStatic()创建的是子类对象,不过由于子类继承自父类,所以子类对象可以向上转型并付给父类定义的引用,obj.a()调用的是子类的方法,这是多态机制,前面加上static 的方法是静态的方法,即可以不用创建对象就可以直接通过类来调用它,你可以在jdk 文档里面去看一下,许多类的方法都是定义为 static,而你却可以直接使用这个类来调用这个方法,至于 void 的问题,他是指这个方法没有返回值,一个方法他可以返回任意类型的值 ,故你可以定义它为任何类型,象 int a() ,double b() ,等
      

  4.   

    obj.a()调用的是父类的方法.我已经试过了.
      

  5.   

    说明:
    1、用子类构造的对象,用父类的类型去引用它
    父类的类型看不到子类的静态方法. 也就是说父类的静态方法,子类是覆盖不了的
    2、如果把两个static都去掉,
    结果成了welcome.TestStatic@757aef
    child! 重载覆盖了父类的方法。如果只去掉一个,则违背了java不允许返回类型不同的重载 
    3、静态方法不能重载,也就是此方法覆盖不了父类中与它同名字的静态方法,非静态的方法可以重载,可以覆盖掉父类中的非静态方法