A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 莫运飞 中级黑马   /  2012-4-7 02:28  /  1759 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Ticket implements Runnable
{
        private static int ticket=50;

        public  static void  run()//静态函数能够访问静态函数变量,非静态函数可以访问非静态函数变量,
                                //静态与非静态不能互相访问。那为什么 我这这里的run()方法以及静态上了,且ticket也用上了静态。
                                //为什么在这里还编译出错呢?错误:Ticket中的run()无法实现Runnable中的run()    public static void run()
                                //难道是 Runnable中的run()方法没有实现 静态造成的??????????   不解啊 !!!!!!(这里去掉Static 可以运行)

{
                while(true)

{               
                if(ticket>0)

{
                System.out.println(Thread.currentThread().getName()+"......"+ticket--);
                               


}}}}

class Demo
{
        public static void main(String[] args)


{
                Ticket t=new Ticket();
               
                Thread t1=new Thread(t);
                Thread t2=new Thread(t);
                Thread t3=new Thread(t);


                t1.start();
                t2.start();
                t3.start();
}



}










评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

7 个回复

倒序浏览
因为接口中的方法默认被abstract public修饰,接口中的成员变量默认被public static final修饰。
所以,你在实现接口中的方法时是不能用static修饰的。
非静态成员可以反问静态成员。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
创建线程后,t1.start();表示开启线程,调用Thread对象的run方法。所以你复写run方法如果被static修饰的话,Thread对象无法调用该run方法。此时t1.run()不符合语法规则。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
接口中所有的成员变量都隐含的是public static final,因此接口中的成员变量都是静态最终变量,接口中的所有方法都隐含的是public和abstract,不可以用static,final等其他修饰符。在实现某接口的类不是abstract修饰的抽象类,必须则必须在类的定义中实现接口的所有抽象方法,而且方法头部分应该与接口的定义完全一致,即有完全相同的返回值和参数列表,如果实现某接口的类是abstract修饰的抽象类,则可以不用实现接口的全部方法。但是,在这个抽象类的非抽象子类中,都必须有他们父类所实现的接口中所有抽象方法实现的方法体。接口的抽象方法的访问控制符都已被指定public,所以实现这些方法时,必须显式使用public修饰符,否则会缩小所定义方法的访问范围

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
学习了 谢谢
回复 使用道具 举报
  public  static void  run()//静态函数能够访问静态函数变量,非静态函数可以访问非静态函数变量,
                                 //静态与非静态不能互相访问。那为什么 我这这里的run()方法以及静态上了,且ticket也用上了静态。
                                 //为什么在这里还编译出错呢?错误:Ticket中的run()无法实现Runnable中的run()    public static void run()
                                 //难道是 Runnable中的run()方法没有实现 静态造成的??????????   不解啊 !!!!!!(这里去掉Static 可以运行)
{


在继承函数或者接口时,非静态函数不可以被非静态函数所覆盖
回复 使用道具 举报
写错啦,


在继承函数或者接口时,非静态函数不可以被静态函数所覆盖
回复 使用道具 举报
pray 高级黑马 2014-4-26 03:47:10
8#
让人看后在各论坛纷纷转贴的好帖
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马