黑马程序员技术交流社区

标题: 同样的语句不同地方,一个能编译过一个却不能,为什么? [打印本页]

作者: yumin    时间: 2015-1-12 22:14
标题: 同样的语句不同地方,一个能编译过一个却不能,为什么?
今天在家试着调了一个程序,功能实现了,不过在调试过程中发现有一个语句,在不同的地方,一个能编译通过并运行,一个则提示是错误,但是不明白为什么,请高手帮解释一下为什么会这样。出问题的语句为红色字那部分,O(∩_∩)O谢谢~~~
package yumin.com;
import java.util.Scanner;
/*
  编写三个类Ticket.sealWidow,TicketSealCenter 分别是代表票信息,售票窗口,售票中心
售票中心分配若干数量的票,由若干售票窗出售
        分析:
         售票中心定义若干票,这个票要么在类里面定义,要么从键盘输入
            售票信息则代表显示信息
         售票窗有多个,实时对票进行操作,则使用多线程
        多线程实现由两种方法,一种是继承Thread ,另一种为实现Runable接口         
*/   
  class TicketSealCenter//从键盘获取票数
   {       
         public  int getTicket()
         {
                System.out.println("输入总票数");               
               Scanner sc =new Scanner(System.in);
               int ticket = sc.nextInt();              
               sc.close();
               return ticket;
         }
   }
       

class Ticket
{         
         public synchronized void show(int tickets)//显示票数
         {
                 if( tickets >0)
                 {
                         System.out.println("现有余票为:"+tickets);
                 }
                 else
                 {
                         System.out.println("票已经卖完");
                 }
         }                  
}
          
class SealTicket implements Runnable //卖票窗口
{
         private Ticket t = new Ticket();
         private int tickets =new TicketSealCenter(). getTicket();//从键盘获取票数
        // t.show(tickets);// 这个语句无法使用,编译不通过,但是同样的语句在if(tickets >0)下可以调用,这是为什么呢?
         Object obj =new Object();
         boolean flag = true;
         public  void  run()
           {
                // t.show();
                 while(flag)
                 {
                 synchronized (obj)
                     {
                         if(tickets >0)
                         {
                         System.out.println(Thread.currentThread().getName()+"....seal:"+tickets);
                           tickets--;
                           t.show(tickets);//同样的语句,这里就可以调用                         
                         }
                         else
                           {
                                 System.out.println("没票了");
                                 flag = false;
                                 return;
                         }
                 }
            }
         }
}
   class TicketDemo
   {
           public static void main(String[] args)
           {
                   SealTicket  s =new SealTicket();
                   Thread t1 =new Thread(s);
                   Thread t2 =new Thread(s);
                   Thread t3 =new Thread(s);
                   t1.start();
                   t2.start();
                   t3.start();                                     
           }
   }



作者: 小爷邱烙    时间: 2015-1-12 22:40
你是在逗我么,费半天劲找这个错误。语句必须写在方法里
作者: yumin    时间: 2015-1-12 22:59
也就是说在JAVA里面像这样的调用另一个类的函数,都必须写在函数里面吗?可是为什么private int tickets =new TicketSealCenter(). getTicket();//从键盘获取票数    又能调用呢?        以前我写的是C,所以有些概念有点模糊,所以有啥比较低级的问题请包涵。
作者: kenfine    时间: 2015-1-12 23:00
语句必须写在方法里{:3_49:}这个真没注意。领教了
作者: yumin    时间: 2015-1-12 23:01
小爷邱烙 发表于 2015-1-12 22:40
你是在逗我么,费半天劲找这个错误。语句必须写在方法里

也就是说在JAVA里面像这样的调用另一个类的函数,都必须写在函数里面吗?可是为什么private int tickets =new TicketSealCenter(). getTicket();//从键盘获取票数    又能调用呢?        以前我写的是C,所以有些概念有点模糊,所以有啥比较低级的问题请包涵。
作者: 466273082    时间: 2015-1-12 23:48
路过,过来瞧瞧,顺便学习下
作者: wuyiai    时间: 2015-1-12 23:52
我之前在大一好像也有遇到这个问题,这是一个不该犯的错误
作者: 小爷邱烙    时间: 2015-1-13 07:50
类中只能定义成员,成员变量或者成员方法
private int tickets =new TicketSealCenter(). getTicket();是成员变量
t.show(tickets);什么都不是,是执行语句
作者: yumin    时间: 2015-1-14 00:40
小爷邱烙 发表于 2015-1-13 07:50
类中只能定义成员,成员变量或者成员方法
private int tickets =new TicketSealCenter(). getTicket();是成 ...

哦,理解了,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2