通过eclipse的代码测试,得到如下的结论:
1.我写了个父类,又写了个子类,子类中没有任何方法,父类中有一个静态方法,然后我在main方法中创建了一个子类的对象,并且是用子类的引用去指向该对象,然后我用该引用去调用父类中的静态方法,结果运行成功了。由此,我可以判断,java中子类是继承了父类的静态方法的,否则子类引用是不可能运行该方法的。
2.接下来,我在子类中写了一个和父类的静态方法的名字、修饰符,返回值,参数都一模一样的静态方法,然后当父类引用指向子类对象,调用的是父类的静态方法,子类引用指向子类对象,调用的是子类的静态方法。这说明,静态方法的调用要看声明该引用变量的类的类型。
3.然后我将子类中的静态方法去掉static,编译器报错了。然后我再给子类方法添上static ,又去掉父类的静态方法的static,使它变成一个普通的方法,然后编译器又报错了。这就证明了父类中静态方法不能在子类中写成同名的非静态的方法,同理,父类中的非静态方法也不可以在子类中写成同名的静态方法。为什么是这样呢?经过思考,我得到了一种解释: 由上面的结论1我们知道子类会继承父类的静态方法,当然非静态方法也会继承。如果父类中的静态方法和子类中的非静态方法同名,那么通过对象去调用,编译器不能判断去调用哪个方法,因此会报错,同理父类中的非静态方法和子类中的静态方法同名也会造成编译器报错。
4. 关于子类到底会不会继承父类的静态方法,网上有很多争论,我经过测试,认为子类会继承的,但是比较特殊,子类会隐藏父类的静态方法,但又不是完全隐藏,通过指向子类对象的子类引用还是可以调用该方法的,这和private修饰的父类方法的隐藏不同,这时候用子类引用变量指向的子类对象是无法调用父类中的private修饰的方法的(但是当是父类引用指向子类对象的时候却可以调用父类中的private方法)。
5.以上的结论都是本人通过eclipse测试的,我的JDK是1.8版本的。