java中父类的静态方法名能和子类的非静态方法名一样吗?
如图父类中的静态方法eat和子类中的非静态eat,两个是属于不同的类,而java不同类中方法名可以完全相同啊,为什么却会报错???我试过去掉static是没有问题的...
如图父类中的静态方法eat和子类中的非静态eat,两个是属于不同的类,而java不同类中方法名可以完全相同啊,为什么却会报错???我试过去掉static是没有问题的
展开
2个回答
2015-11-01
展开全部
按照java的语法规则
子类是不能覆盖父类的static方法的
不过可以重写
eg:
class Father {
public Father() {}
public static void show(String msg) {
System.out.println(msg);
}
}
class Son extends Father {
public Son() {}
/*//编译会报错
public void show(String msg) {
System.out.println("Son : "+ msg);
}
*/
public void show(String msg, int count) {
for (int i=0; i<count; i++) {
System.out.println(msg);
}
}
}
更多追问追答
追问
我知道不能覆盖父类的静态方法。但是可以换个角度,它们两个是属于不同的类,父类的eat方法是父类的,而子类的eat方法是自己的,我不想覆盖父类,却就要和父类静态方法同名。为什么就不行
意思就是说父类和子类的同名方法,我知道要是没有static修饰会自动覆盖。但是有了static修饰,子类虽然覆盖不了,为什么同名都不行?
展开全部
我来尝试回答一下吧,虽然这个问题过了很久了。
是这样的,简单来讲就是java中,父子类同方法签名的方法要么都是静态的,要么就都是非静态的,像问题所述,写的时候就一个static一个普通方法是不行的;
根据提问者的代码,只要把父类eat方法前的static修饰符去掉即可
方法签名相同的非静态方法就是重写(override),相信已经理解了
然后方法签名相同的静态方法,在java中,其实是允许的,只是类中该方法前不允许添加@override注解,所以该方法不是重写,但是它们的确是方法签名相同的静态方法。
而且因为不是重写,当使用向上造型声明对象的时候,调用静态方法的时候,任然是调用父类的静态方法,而不是调用子类的同名静态方法
静态方法在加载的时候进行绑定(直接引用),而重写是运行时绑定(解析后引用),静态先于重写绑定。所以当两个静态方法的方法签名相同的时候,向上造型的对象调用方法时,就直接执行了声明类型的静态方法,而不是运行时的对象的静态方法。所以如果要使用子类的同名静态方法,就要向下造型了。
是这样的,简单来讲就是java中,父子类同方法签名的方法要么都是静态的,要么就都是非静态的,像问题所述,写的时候就一个static一个普通方法是不行的;
根据提问者的代码,只要把父类eat方法前的static修饰符去掉即可
方法签名相同的非静态方法就是重写(override),相信已经理解了
然后方法签名相同的静态方法,在java中,其实是允许的,只是类中该方法前不允许添加@override注解,所以该方法不是重写,但是它们的确是方法签名相同的静态方法。
而且因为不是重写,当使用向上造型声明对象的时候,调用静态方法的时候,任然是调用父类的静态方法,而不是调用子类的同名静态方法
静态方法在加载的时候进行绑定(直接引用),而重写是运行时绑定(解析后引用),静态先于重写绑定。所以当两个静态方法的方法签名相同的时候,向上造型的对象调用方法时,就直接执行了声明类型的静态方法,而不是运行时的对象的静态方法。所以如果要使用子类的同名静态方法,就要向下造型了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询