>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 30080 个阅读者 刷新本主题
 * 贴子主题:  请教:为什么static和abstract修饰符不能在一起使用? 回复文章 点赞(0)  收藏  
作者:Mike    发表时间:2017-06-24 16:43:50     消息  查看  搜索  好友  邮件  复制  引用

为什么一个成员方法不能同时用static和abstract修饰符一起来修饰呢?也就是说,为什么不允许有静态抽象方法,而只有实例方法才可以是静态的呢?


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->Swing组件(上)
  JavaWeb开发-->JavaWeb应用入门(Ⅰ)
  JSP与Hibernate开发-->Spring、JPA与Hibernate的整合
  Java网络编程-->RMI框架
  精通Spring-->通过Axios访问服务器
  Vue3开发-->Vue组件开发高级技术
  10道Java编程基础练习题
  序列化与反序列化知识点汇总
  BIO模型的缺陷
  被迫重构代码,这次我干掉了 if-else
  请求大佬们的帮助
  Java并发之volatile关键字内存可见性问题
  Java设计模式:传输对象模式
  Java设计模式:享元模式
  Java设计模式:装饰器模式
  用BigDecimal进行精确运算的范例
  Java入门实用代码: 集合中添加元素
  Java入门实用代码:文件重命名
  Java入门实用代码:向文件写入字符串
  Java入门实用代码:格式化时间(SimpleDateFormat)
  java Pattern和Matcher详解
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 sunweiqin 
  

威望: 0
级别: 高级天王 [荣誉]
魅力: 480
经验: 480
现金: 1128
发文章数: 171
注册时间: 2016-09-12
 消息  查看  搜索  好友  邮件  复制  引用


可以用反证法来推导。假定允许成员方法同时用static和abstract修饰符一起来修饰。
下面的Sample类有一个抽象的静态方法m1()和实例方法m2(),Sub子类实现了这两个方法:

public abstract class Sample{
  public static abstract void m1();
  public abstract void m2();
}

public class Sub extends Sample{
  public static void m1(){...}
  public void m2(){...}
}

下面这段代码分别调用m1()和m2()方法:

Sample s=new Sub();
s.m1();
s.m2();

以上s.m2()方法是实例方法,按照JVM动态绑定机制,和Sub实例的m2()方法绑定,因此可以被执行。
以上s.m1()方法是静态方法,按照JVM静态绑定机制,和Sample类的m1()方法绑定,而Sample类的m1()方法是抽象方法,无法被执行。

综上所述,如果静态方法被声明为抽象的,这将和Java虚拟机的绑定机制相矛盾,因此不允许static和abstract修饰符连用。
发文章时间 2017-06-24 17:00:10
 IPIP: 已设置保密 1 楼     
该用户目前不在线 Java菜鸟 
  
威望: 0
级别: 新手上路
魅力: 133
经验: 133
现金: 1054
发文章数: 6
注册时间: 2017-06-23
 消息  查看  搜索  好友  邮件  复制  引用


学习了,有些开窍。谢谢
发文章时间 2017-06-25 11:23:28
 IPIP: 已设置保密 2 楼     
1页 2条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。