新的小组的项目做到一半,我属于半路插班,正在看需求文档中。。有问题需要请教:
   现在做JAVA欠缺项目经验。现在我的情况是对JAVA基础类的知识基本上还是了解的(做C#的时候没事就看看JAVA)。但是对JAVA常用的工具就不懂了,比如hiberate,struts。也没有使用过JAVA做过网络编程。请问现在我应该如何学习才能尽快的对JAVA上手?

解决方案 »

  1.   

    哈哈,相同经历。
    一开始我心里也没底,后来才发现。唯一要做的就是了解一下构架(Stuts,Hibernate,Spring...)。至于语言,不是问题!
      

  2.   

    java API 帮助文档 准备好
    j2ee帮助文档也准备好(英文)
    struts,hibernate,spring 网上下个例子看看,
    建议看看 spring 中文参考 或者 spring 开发指南,在里面提到了 ssh组合
    然后在实际工作中出现问题,一:查帮助文档  二: 上网求助
      

  3.   

    实际上使用了框架以后会方便编码。程序员所需要了解的只是要调用的常用的几个接口中的方法。不过楼主还是需要了解很多东西,比如java的基本概念中与C#不一样的,比如java就没有属性(property),当然这些东西比较简单,基本看看就能够了解。还有一些就是设计模式之类的,用的比较多的比如Factory模式,Singleton模式等等。
      

  4.   

    C#与java的一些区别特征
    1.属性:
    java中定义和访问均要用get和set方法,可以不成对出现;
    c#中是真正的属性,定义时get和set必须同时出现,访问时用”.“号即可,不用get,set。
    2.C#中,对象索引就是对象数组:例如,public Story this [int index] {}
    3.C#中,不用任何范围修饰符时,默认的是protected,因而不能在类外被访问。
    4.JAVA规定,在一个文件中只能有一个public类,而且这个类的名称必须与文件名一模一样;而C#没有这个规定。
    5.在C#中,它是以Main方法来定位入口的,如果一个程序中没有一个名为Main的方法,就会出“找不到入口的错误”;而JAVA中是main(),要注意“M”的大小写。
    向版主反映这个帖子
    6.C#预定义的简单数据类型比Java多。
    例如,C#有unit,即无符号整数。
    7.忘掉Java中的static final修饰符;
    在C#中,常量可以用const关键词声明,
    C#的设计者还增加了readonly关键词,readonly域只能通过初始化器或类的构造函数设置。
    8.公用类的入口点:
    c#是可以对Main进行重载(java中是main),允许有int返回值和空参数的Main。
    9.在Java中,switch语句只能处理整数;
    但C#中的switch语句不同,它还能够处理字符变量。
    10.C#没有“>>>”移位操作符
    11.goto关键词:
    Java不用goto关键词,你可以用带标签的语句加上break或continue取代C#中的goto;
    在C#中,goto允许你转到指定的标签。不过,C#以特别谨慎的态度对待goto,比如它不允许goto转入到语句块的内部。
    12.int[] x = { 0, 1, 2, 3 };
    int x[] = { 0, 1, 2, 3 };
    JAVA中两种方法皆可;
    但在C#中,只有第一行代码合法,[]不能放到变量名字之后。
    13.与Java不同的是,C#允许为名称空间或者名称空间中的类指定别名:
    例如,using TheConsole = System.Console;
    14.在Java中,包的名字同时也是实际存在的实体,它决定了放置.java文件的目录结构;
    在C# 中,物理的包和逻辑的名称之间是完全分离的,.NET中包的实体称为程序集(Assembly)。
    每一个程序集包含一个manifest结构。 manifest列举程序集所包含的文件,控制哪些类型和资源被显露到程序集之外,
    并把对这些类型和资源的引用映射到包含这些类型与资源的文件。程序集是自包含的,一个程序集可以放置到单一的文件之内,也可以分割成多个文件。
    .NET的这种封装机制解决了DLL文件所面临的问题,即臭名昭著的DLL Hell问题。
    15.在Java中,java.lang包是默认的包;
    C#中不存在默认的包。
    16.C#中的访问修饰符与Java中的基本对应,但多出了一个internal。简而言之,C#有5种类型的可访问性,如下所示:
    public:成员可以从任何代码访问。
    protected:成员只能从派生类访问。
    internal:成员只能从同一程序集的内部访问。
    protected internal:成员只能从同一程序集内的派生类访问。
    private:成员只能在当前类的内部访问。
    17.由于C#中不存在final关键词,如果想要某个类不再被派生,你可以使用sealed关键词。
    18.与Java不同,C#中的接口不能包含域(Field),
    另外还要注意,在C#中,接口内的所有方法默认都是公用方法。在Java中,方法声明可以带有public修饰符(即使这并非必要),但在C#中,
    显式为接口的方法指定public修饰符是非法的。例如,下面的C#接口将产生一个编译错误。
    19.C#中的is操作符与Java中的instanceof操作符一样,两者都可以用来测试某个对象的实例是否属于特定的类型;
    在Java中没有与C#中的as操作符等价的操作符。as操作符与is操作符非常相似,但它更富有“进取心”:如果类型正确的话,
    as操作符会尝试把被测试的对象引用转换成目标类型;否则,它把变量引用设置成null。
    20.C#仍旧保留了C++的内存手工管理方法,它适合在速度极端重要的场合使用;
    而在Java中这是不允许的。
    21.在C#中,所有的异常都从一个名为Exception的类派生。
    22.C#中枚举器即enum类型(java无),把它作为一个变量值的类型使用,从而把变量可能的取值范围限制为枚举器中出现的值。
    23.C#中结构(Struct)与类很相似,而结构是一种值类型,它存储在栈中或者是嵌入式的,结构可以实现接口,可以象类一样拥有成员,但结构不支持继承。
    24.传值方式:
    在java中简单数据类型的值传参时,都以传值方式;
    在c#中如果加ref则会以引用的方式传值(方法内部改变该参数,则外部变量一起跟着变);
    加out与ref基本相同,但out不要求参数一定要初始化。
    25.c#保留了指针。
    26 .C#中代理(委托):
    代理(delegate)可以看作C++或者其他语言中的函数指针,代理用来封装可调用方法。你可以在类里面编写方法并在该方法上创建代理,
    此后这个代理就可以被传递到第二个方法。这样,第二个方法就可以调用第一个方法。代理是从公共基类System.Delegate派生的引用类型。
    定义和使用代理包括三个步骤:声明,创建实例,调用。代理用delegate声明语法声明。向版主反映这个帖子
    线程是允许进行并行计算的一个抽象概念:在另一个线程完成计算任务的同时,一个线程可以对图像进行更新,二个线程可以同时处理同一个进程发出的二个网络请求。
    我们在这篇文章中将重点讨论Java和C#在线程方面的不同之处,并将一些Java中线程的常用模式转换为C#。  
      从概念上讲,线程提供了一种在一个软件中并行执行代码的方式━━每个线程都“同时”在一个共享的内存空间中执行指令,(当然是在一个处理器上,
    这是通过处于运行状态的线程的交替执行完成的。),因此,每个线程都可以访问一个程序内的数据结构。由于这种原因,多线程编程的难度就可想而知了,
    因为一个程序内有许多不同的线程需要安全地共享数据。  
      线程的创建和运行
      Java在 java.lang.Thread和java.lang.Runnable类中提供了大部分的线程功能。创建一个线程非常简单,就是扩展Thread类,并调用start()。
    通过创建一个执行Runnable()的类,并将该类作为参数传递给Thread(),也可以定义一个线程。仔细地阅读下面这个简单的Java程序,其中有2个线程同时在从1数到5,
    并将结果打印出来。
      public class ThreadingExample
      extends Object {
      public static void main( String args[] ) {
      Thread[] threads = new Thread[2];
      for( int count=1;count<=threads.length;count++ ) {
      threads[count] = new Thread( new Runnable() {
      public void run() {
      count();
      
      }
      
      } );
      threads[count].start();
      
      }
      
      }
      
      public static void count() {
      for( int count=1;count<=5;count++ )
      System.out.print( count + " " );
      
      }
      
      }
      
      

  5.   

    我们可以使用System.Threading.Thread和System.Threading.ThreadStart二个类将上述的Java程序转换为C#语言:
      using System.Threading;
      public class ThreadingExample : Object {
      public static void Main() {
      Thread[] threads = new Thread[2];
      for( int count=1;count<=threads.Length;count++ ) {
      threads[count] = new Thread( new ThreadStart( 。
    。) );
      threads[count].Start();
      
      }
      
      }
      
      public static void Count() {
      for( int count=1;count<=5;count++ )
      Console.Write( count + " " );
      
      }
      
      }  
      这个例子中有一些小技巧。Java允许扩展java.lang.Thread类和执行java.lang.Runnable接口,C#则没有为我们提供这些便利。
        一个C#中的Thread对象是不可知的,必须通过ThreadStart进行创建,这意味着不能使用内部的类模式,而必须创建一个对象,
       而且必须传递给线程一个对象的方法供线程执行用。  
      线程的使用
      Java中存在许多编程人员希望能够对线程使用的标准操作:例如,测试线程是否存在、加入一个线程直到它死亡、杀死一个线程等。
      表1:线程管理的函数
      Java中java.lang.Thread中的方法和C#中System.Threading.Thread对象的对比。  
      setDaemon( boolean on) 方法
      IsBackground 设置属性值
      使一个存在的进程成为一个新线程(如果剩下的所有进程都成了新线程,程序将停止运行)。
      isDaemon()方法
      IsBackground 获取属性
      如果该线程是一个后台线程,则返回真值。  
      isAlive() 方法
      IsAlive 获取属性
      如果该线程处于活动状态,则返回真值。  
      interrupt() 方法
      Interrupt() 方法
      尽管在Java中这一方法可以用来设置线程的中断状态,而且可以用来检查线程是否被中断。在C#中没有相应的方法,对一个没有处于阻塞状态的线程执行Interrupt方法将使下一次阻塞调用自动失效。  
      isInterrupted() 方法
      n/a
      如果该线程处于阻塞状态,则返回真值。  
      sleep( long millis )和sleep( long millis, int nanos )
      Sleep( int millisecondTimeout ) and Sleep( System.TimeSpan )方法
      使正在执行的线程暂停一段给定的时间,或直到它被中断。这一方法将在Java中将产生一个 java.lang.InterruptedException状态,在C#中将产生System.Threading. ThreadInterruptedException状态。  
      join()、join( long millis )和join( long millis, int nanos ) 方法
      Join()、Join( int millisecondTimeout )和Join( System.TimeSpan ) 方法与Java中仅依靠超时设定不同的是,在C#语言中则依据线程停止运行是由于线程死亡(返回真)或是超时(返回假)而返回一个布尔型变量。  
      suspend() 方法
      Suspend() 方法
      二者的功能相同。这一方法容易引起死循环,如果一个占有系统关健资源的线程被挂起来,则在这一线程恢复运行之前,其他的线程不能访问该资源。  
      resume() 方法
      Resume() 方法
      恢复一个被挂起的线程。  
      stop() 方法
      Abort() 方法
      参见下面的“线程停止”部分。
      (特别说明,在上面的表中,每个小节的第一行是java中的方法,第二行是C#中的方法,第三行是有关的注释,由于在文本文件中不能组织表格,请编辑多费点心组织表格,原文中有表格的格式。)  
      线程的中止
      由于能够在没有任何征兆的情况下使运行的程序进入一种混乱的状态,Java中的Thread.stop受到了普遍的反对。根据所调用的stop()方法,一个未经检查的java.lang.ThreadDeath错误将会破坏正在运行着的程序的栈,随着它的不断运行,能够解除任何被锁定的对象。由于这些锁被不分青红皂白地被打开,由它们所保护的数据就非常可能陷入混乱状态中。
      根据当前的Java文档,推荐的中止一个线程的方法是让运行的线程检查一个由其他的线程能够改变的变量,该变量代表一个“死亡时间”条件。下面的程序就演示了这种方法。
      // 条件变量
      private boolean timeToDie = false;
      
      // 在每次迭代中对条件变量进行检查。
      class StoppableRunnable
      extends Runnable {
      public void run() {
      while( !timeToDie ) {
      // 进行相应的操作  
      }  
      }  
      }
      上述的讨论对C#中的Abort方法也适合。根据调用的Abort方法,令人捉摸不定的 System.Threading.ThreadAbortException可能会破坏线程的栈,它可能释放线程保持的一些变量,使处于保护状态中的数据结构出现不可预测的错误。我建议使用与上面所示的相似的方法来通知一个应该死亡的线程。  
      线程的同步
      从概念上来看,线程非常易于理解,实际上,由于他们可能交互地对同一数据结构进行操作,因此它们成为了令编程人员头疼的一种东西。以本文开始的 ThreadingExample为例,当它运行时,会在控制台上输出多种不同的结果。从 1 2 3 4 5 1 2 3 4 5到 1 1 2 2 3 3 4 4 5 5或 1 2 1 2 3 3 4 5 4 5在内的各种情况都是可能出现的,输出结果可能与操作系统的线程调度方式之间的差别有关。有时,需要确保只有一个线程能够访问一个给定的数据结构,以保证数据结构的稳定,这也是我们需要线程同步机制的原因所在。
      为了保证数据结构的稳定,我们必须通过使用“锁”来调整二个线程的操作顺序。二种语言都通过对引用的对象申请一个“锁”,一旦一段程序获得该“锁”的控制权后,就可以保证只有它获得了这个“锁”,能够对该对象进行操作。同样,利用这种锁,一个线程可以一直处于等待状态,直到有能够唤醒它信号通过变量传来为止。
      表2:线程同步
      需要对线程进行同步时需要掌握的关健字
      synchronized
      lock
      C#中的lock命令实际上是为使用System.Threading.Monitor类中的Enter和Exit方法的语法上的准备  
      Object.wait()
      Monitor.Wait( object obj )
      C#中没有等待对象的方法,如果要等待一个信号,则需要使用System.Threading.Monitor类,这二个方法都需要在同步的程序段内执行。  
      Object.notify()
      Monitor.Pulse( object obj )
      参见上面的Monitor.Wait的注释。  
      Object.notify()
      Monitor.PulseAll( object obj )
      参见上面的Monitor.Wait的注释。
      (特别说明,在上面的表中,每个小节的第一行是java中的方法,第二行是C#中的方法,第三行是有关的注释,由于在文本文件中不能组织表格,请编辑多费点心组织表格,原文中有表格的格式。)
      
      我们可以对上面的例子进行一些适当的修改,通过首先添加一个进行同步的变量,然后对count()方法进行如下的修改,使变量在“锁”中被执行加1操作。
      public static Object synchronizeVariable = "locking variable";  
      public static void count() {
      synchronized( synchronizeVariable ) {
      for( int count=1;count<=5;count++ ) {
      System.out.print( count + " " );
      synchronizeVariable.notifyAll();
      if( count < 5 )
      try {
      synchronizeVariable.wait();
      
      } catch( InterruptedException error ) {  
      }  
      }  
      }  
      }
      

  6.   

    如果只是使用框架,你自己先看看文档,coding的时候边学习边使用一下估计都来得及。
    建议先向朋友询问一下java和c#的区别,coding时容易混淆的地方,不然会出现意想不到的“效果”!!
    个人意见
      

  7.   

    感谢楼上朋友回帖。下午请同事帮忙配置了项目程序,感觉结构比C#要复杂得多,包管理器中有很多包,同事也不是很清楚-_-!.总体感觉和C#差别大。。
       以前做C#的时候,我主要做逻辑和数据库操作,ASP没怎么写,但是也能写些页面。今天下午看了下JSP,感觉上很吃力,请问用struts做程序(不要求自己写JSP页面),JSP页面应该了解多少?怎样去学习最好?
       还有如何学习struts,spring,hiberate最有效率呢? 下午我在网上查了一下3者的资料,太多了,现在正在看,请大家能不能推荐一些突出的资料呢?
      

  8.   

    同事今天推荐了一本《STRUTS在行动》,正在研究中,多谢楼上各位,结贴