java中父类的静态方法名能和子类的非静态方法名一样吗?

如图父类中的静态方法eat和子类中的非静态eat,两个是属于不同的类,而java不同类中方法名可以完全相同啊,为什么却会报错???我试过去掉static是没有问题的... 如图父类中的静态方法eat和子类中的非静态eat,两个是属于不同的类,而java不同类中方法名可以完全相同啊,为什么却会报错???我试过去掉static是没有问题的 展开
 我来答
匿名用户
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修饰,子类虽然覆盖不了,为什么同名都不行?
trymore
2018-04-11
知道答主
回答量:32
采纳率:0%
帮助的人:8.6万
展开全部
我来尝试回答一下吧,虽然这个问题过了很久了。
是这样的,简单来讲就是java中,父子类同方法签名的方法要么都是静态的,要么就都是非静态的,像问题所述,写的时候就一个static一个普通方法是不行的;
根据提问者的代码,只要把父类eat方法前的static修饰符去掉即可
方法签名相同的非静态方法就是重写(override),相信已经理解了
然后方法签名相同的静态方法,在java中,其实是允许的,只是类中该方法前不允许添加@override注解,所以该方法不是重写,但是它们的确是方法签名相同的静态方法。
而且因为不是重写,当使用向上造型声明对象的时候,调用静态方法的时候,任然是调用父类的静态方法,而不是调用子类的同名静态方法
静态方法在加载的时候进行绑定(直接引用),而重写是运行时绑定(解析后引用),静态先于重写绑定。所以当两个静态方法的方法签名相同的时候,向上造型的对象调用方法时,就直接执行了声明类型的静态方法,而不是运行时的对象的静态方法。所以如果要使用子类的同名静态方法,就要向下造型了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式