专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » java从入门到精通:Java学习从入门到精通(附FAQ)(续) »正文

java从入门到精通:Java学习从入门到精通(附FAQ)(续)

来源: 发布时间:星期一, 2009年4月6日 浏览:0次 评论:0
  其中特别值得是JDK有个非常棒调试功能-verbosejavac –verbose 以及其它很多JDK工具都有这个选项-verbose 可以显示在命令执行过程中JVM都依次加载哪里Class通过这些宝贵调试信息可以帮助我们分析出JVM在执行过程中都干了些什么   另外自己在学习过程中很多这种破坏例程应该有意识分门别类保存下来在工作中积累典型例程也应该定期整理日积月累自己就有了个代码库了遇到类似问题到代码库里面 Copy & Paste Search & Replace就好了极大提高了开发速度最理想情况是把些通用例程自己再抽象形成个通用类库封装好那么可复用性就更强了   所以我觉得其实不是特别需要例程自己写破坏例程就是最好例子如果你实在对自己写代码不放心我强烈推荐你看看JDK基础类库Java源代码在JDK安装目录下面会有个src.zip解开来就可以完整看到整个JDK基础类库也就是rt.jarJava源代码你可以参考下Sun是如何写Java规范标准是什么样子我自己在学习Java类库时候当有些地方理解不是很清楚时候或者想更加清晰理解运作细节时候往往会打开相应源代码通过看源代码所有问题都会扫而空 Java Learning Path( 5)资源篇   http://java.sun.com/ (英文)   SunJava网站WebSite个应该经常去看地方不用多说   http://www-900.ibm.com/developerWorks/cn/   IBMdeveloperWorks网站WebSite英语好直接去英文主站点看这里不但是个极好面向对象分析设计网站WebSite也是Web ServicesJavaLinux极好网站WebSite强烈推荐!!!   http://www.javaworld.com/ (英文)   有关Java很多新技术讨论和新闻想多了解Java方方面面应用这里比较好   http://dev2dev.bea.com.cn/index.jsp   BEA开发者园地BEA作为最重要App Server厂商有很多独到技术在Weblogic上做开发朋友不容错过   http://www.theserverside.com/home/ (英文)   TheServerSide是个著名专门面向Java Server端应用网站WebSite   http://www.cnjsp.org/   JSP技术网站WebSite有相当多Java方面文章和资源   http://sourceforge.net/   SourgeForge是个开放源代码软件Software大本营其中也有非常非常丰富Java开放源代码著名软件Software 附:java入门和加深FAQ 、准备篇 1 什么是Java、Java2、JDK?JDK后面1.3、1.4.2版本号又是如何回事? 答:Java是种通用并发强类型面向对象编程语言(摘自Java规范标准第 2版) JDK是Sun公司分发免费Java开发工具正式名称为J2SDK(Java2 Software Develop Kit) 2 什么是JRE/J2RE? 答:J2RE是Java2 Runtime Environment即Java运行环境有时简称JRE如果你只需要运行Java或Applet下载并安装它即可如果你要自行开发Java软件Software请下载JDK在JDK中附带有J2RE注意:由于Microsoft对Java支持不完全请不要使用IE自带虚拟机来运行Applet务必安装个J2RE或JDK 3 学习Java用什么工具比较好? 答:作者建议首先使用JDK+文本编辑器这有助你理解下列几个基础概念:pathpathpackage并熟悉基本命令:javac和java并且下载和你JDK版本API帮助  如果你不确定类或使用方法请先查阅API而不是发贴求助当你熟悉Java的后你可以考虑换个IDE很多人推荐JCreator实际上JCreator功能还 是很弱作者推荐eclipse下载网http://www.eclipse.org因eclispe是免费. 4 学习Java有哪些好参考书? 答:作者首先推荐Thinking in Java中文名Java编程思想有中文版该书第章介绍了很多面向对象编程思想作为新手应当认真阅读除此以外O´relly出版社和Wrox出版社书也不错作者本人不喜欢大陆作者也许你觉得英文太难但是网上大多数资料都是英文另外你需要经常查阅API而那也是英文 5 Java和C哪个更好? 答:这个问题是个很不恰当问题你应该问:Java和C哪个更适用于我项目?如果你不需要跨平台不需要分布式要强调运行速度C更为适用反的?你应当考虑Java 6 什么是J2SE/J2EE/J2ME? 答:J2SE就是Java J2ME是针对嵌入式设备比如Java手机它有自己SDK而J2EE使用J2SESDK J2EE规范标准更多是对J2EE服务器要求和开发人员约束详情见后继"J2EE FAQ" 2、命令篇 7 我写了第个Java应该如何编译/运行? 答:首先请将保存为xxx.java文件然后在dos窗口下使用javac xxx.java命令你会发现该目录下多了个xxx.文件再使用java xxx命令java就开始运行了 8 我照你说做了但是出现什么"´javac´ 不是内部或外部命令也不是可运行或批处理文件" 答:你遇到了path问题操作系统在范围(path)内搜索javac.exe但是没能找到请编辑你操作系统环境变量新增个JAVA_HOME变量设为你JDK安装目录再编辑Path变量加上项 %JAVA_HOME%\bin然后关掉并新开个dos窗口你就可以使用javac和java命令了 9 环境变量如何设置? 答:请向身边会设人咨询 10 javac xxx.java顺利通过了但是java xxx时候显示什么“NoClassDefFoundError” 答:你遇到了path问题java命令在范围(path)内搜索你要用文件但是未能找到首先请确认你没有错敲成java xxx.其实你并不需要设置该变量但如果你设置了该变量又没有包含.(代表当前目录)你就会遇到这个问题请在你CLASSPATH环境变量中加入项. 或干脆删掉这个变量如果你使用了并非JDK自带标准包比如javax.servlet.*包也会遇到这个问题请将相应jar文件加入path如果你在java源文件中定义了package请参见15 11 我在java xxx时候显示"Exception in thread "" java.lang.NoSuchMethodError: " 答:首先在你中每个java文件有且只能有个public类这个类类名必须和文件名大小写完全其次在你要运行类中有且只能有个public void (String args)思路方法这个思路方法就是你 12 package是什么意思?如何用? 答:为了唯标识每个类并分组java使用了package概念每个类都有个全名例如String全名是java.lang.String其中java.lang是包名String是短名这样如果你也定义了String你可以把它放在mypackage中通过使用全名mypackage.String和java.lang.String来区分这两个类同时将逻辑上相关类放在同个包中可以使结构更为清楚  你要做就是在java文件开头加行"package mypackage;"注意包没有嵌套或包含关系A包和A.B包对java命令来说是并列两个包 13 我没有声明任何package会如何样? 答:你类被认为放在默认包中这时全名和短名是 14 在个类中如何使用其他类? 答:如果你使用java.lang包中不用做任何事如果你使用其他包中使用import package1.1; 或 import package2.*;这里.*表示引入这个包中所有类然后在中你可以使用其他类短名如果短名有冲突使用全名来区分 15 我用了package时候显示"NoClassDefFoundError"但是我把所有package去掉时候能正常运行 答:将你java文件按包名存放 比如你工作目录是/work类是package1.1那么将它存放为/work/package1/1.java如果没有声明包那么直接放在/work下在/work下执行javac package1/1.java再执行java package1.1你会发现切正常另外你可以考虑开始使用IDE 16 我想把java编译成exe文件该如何做? 答:JDK只能将java源文件编译为文件文件是种跨平台字节码必须依赖平台相关JRE来运行Java以此来实现跨平台有些开发工具可以将java文件编译为exe文件作者反对这种做法这样就取消了跨平台性如果你确信你软件Software只在Windows平台上运行你可以考虑使用C/C#来编程 17 我在编译时候遇到什么"deprecated API"是什么意思? 答:所谓deprecated是指已经?时但是为了向前兼容起见仍然保留思路方法这些思路方法可能会在以后取消支持你应当改用较新思路方法般在API里面会介绍说明你应当用什么思路方法来代替的 3、I/O篇 18 我如何给java加启动参数就像dir /p/w那样? 答:还记得public void (String args)吗?这里args就是你启动参数 在运行时你输入java package1.1 -arg1 -arg2args中就会有两个String个是arg1个是arg2 19 我如何从键盘输入/double/串? 答:javaI/O操作比C要复杂如果要从键盘输入样例代码如下: BufferedReader cin = BufferedReader( InputStreamReader( .in ) )  ;  String s = cin.readLine;  这样你就获得了如果你需要数字话再加上:  n = Integer.parseInt( s );  或者  double d = Double.parseDouble( s ); 20 我如何输出/double/串? 答:在开始写: PrWriter cout = PrWriter( .out );  需要时写: cout.pr(n);  或者 cout.prln("hello")  等等 21 我发现有些书上直接用.in和.out输入输出比你要简单得多 答:java使用unicode是双字节.in和.out是单字节stream如果你要输入输出双字节文字比如中文请使用作者做法 22 我如何从文件输入/double/串? 答:类似于从键盘输入只不过换成 BufferedReader fin = BufferedReader( FileReader(" myFileName " ) );  PrWriter fout = PrWriter( FileWriter(" myFileName " ) );  另外如果你还没下载API请开始下载并阅读java.io包中内容 23 我想读写文件指定位置该如何办? 答:你肯定没有认真看APIjava.io.RandomAccessFile可以满足你需要 24 如何判断要读文件已经到了尽头? 答:你肯定没有认真看API在Reaerread思路方法中明确介绍说明返回-1表示流结尾 4、 关键字篇 25 java里面如何定义宏? 答:java不支持宏宏代换不能保证类型安全如果你需要定义常量可以将它定义为某个类 final成员参见26和30 26 java里面没法用const 答:你可以用final关键字例如 final m = 9被声明为final变量不能被再次赋值也可以用于声明思路方法或类被声明为final思路方法或类不能被继承注意const是java保留字以备扩充 27 java里面也不能用goto 答:甚至在面向过程语言中你也可以完全不用goto请检查你流程是否合理如果你需要从多层循环中迅速跳出java增强了(和C相比)和continue功能 例如: outer :  while( ... )  {  inner :  for( ... )  {  ... inner; ...  ... continue outer; ...  }  }  和constgoto也是java保留字以备扩充 28 java里面能不能重载操作符? 答:不能String+号是唯个内置重载操作符你可以通过定义接口和思路方法来实现类似功能 29 我个对象但是没法delete掉它 答:java有自动内存回收机制即所谓Garbarge Collector你再也不用担心指针 30 我想知道为什么思路方法必须被声明为public ? 答:声明为public是为了这个思路方法可以被外部详情见面向对象篇37 是为了将某个成员变量/思路方法关联到类()而非例子(instance)你不需要创建个对象就可以直接使用这个类成员在A类中B类成员可以使用B.Member写法注意个类成员变量是唯被所有该类对象所共享 31 throw和throws有什么区别? 答:throws用于声明个思路方法会抛出哪些异常而throw是在思路方法体中实际执行抛出异常动作如果你在思路方法中throw个异常却没有在思路方法声明中声明的编译器会报错注意Error和RuntimeException子类是例外无需特别声明 32 什么是异常? 答:异常最早在Ada语言中引入用于在中动态处理并恢复你可以在思路方法中拦截底层异常并处理的也可以抛给更高层模块去处理你也可以抛出自己异常指示发生了某些不正常情况常见拦截处理代码如下: try  {  ...... //以下是可能发生异常代码 ...... //异常被抛出执行流程中断并转向拦截代码 ......  }  catch(Exception1 e) //如果Exception1是Exception2子类并要做特别处理应排在前面 {  //发生Exception1时被该段拦截 }  catch(Exception2 e)  {  //发生Exception2时被该段拦截 }  finally //这是可选 {  //无论异常是否发生均执行此段代码 } 33 final和finally有什么区别? 答:final请见26finally用于异常机制参见32 5、 面向对象篇 34 extends和implements有什么区别? 答:extends用于(单)继承个类()而implements用于实现个接口(erface)erface引入是为了部分地提供多继承功能erface中只需声明思路方法头而将思路方法体留给实现来做这些实现例子完全可以当作erface例子来对待有趣是在erface的间也可以声明为extends(单继承)关系 35 java如何实现多继承? 答:java不支持显式多继承在显式多继承语言例如c会出现子类被迫声明祖先虚基类构造问题而这是违反面向对象封装性原则java提供了erface和implements关键字来部分地实现多继承参见34 36 abstract是什么? 答:被声明为abstract思路方法无需给出思路方法体留给子类来实现而如果个类中有abstract思路方法那么这个类也必须声明为abstract被声明为abstract类无法例子化尽管它可以定义构造思路方法供子类使用 37 public,protected,private有什么区别? 答:这些关键字用于声明类和成员可见性 public成员可以被任何类访问 protected成员限于自己和子类访问 private成员限于自己访问 Java还提供了第 4种默认可见性般称为package private当没有任何public,protected,private修饰符时成员是同包内可见类可以用public或默认来修饰 38 Override和Overload有什么区别? 答:Override是指父类和子类的间思路方法继承关系这些思路方法有着相同名称和参数类型Overload是指同个类中区别思路方法(可以在子类也可以在父类中定义)间关系这些思路方法有着相同名称和区别参数类型 39 我继承了个思路方法但现在我想在父类中定义思路方法 答:用super.xxx可以在子类中父类思路方法 40 我想在子类构造思路方法中父类构造思路方法该如何办? 答:在子类构造思路方法super(...)即可 41 我在同个类中定义了好几个构造思路方法并且想在个构造思路方法中 答:在构造思路方法第this(...) 42 我没有定义构造思路方法会如何样? 答:自动获得个无参数构造思路方法 43 我无参数构造思路方法失败了 答:如果你至少定义了个构造思路方法就不再有自动提供无参数构造思路方法了你需要显式定义个无参数构造思路方法 44 我该如何定义类似于C析构思路方法(destructor)? 答:提供个void finalize思路方法在Garbarge Collector回收该对象时会该思路方法注意实际上你很难判断个对象会在什么时候被回收作者从未感到需要提供该思路方法 45 我想将个父类对象转换成个子类对象该如何做? 答:强制类型转换如  public void meth(A a)  {  B b = (B)a;  }  如果a实际上并不是B例子会抛出ClassCastException所以请确保a确实是B例子 46 其实我不确定a是不是B例子能不能分情况处理? 答:可以使用instanceof操作符例如  ( a instanceof B )  {  B b = (B)a;  }    {  ...  } 47 我在思路方法里修改了个对象但是退出思路方法后我发现这个对象值没变! 答:很可能你把传入参数重赋了个新对象例如下列代码就会造成这种:  public void fun1(A a) //a是局部参数指向了个外在对象 {  a = A; //a指向了个新对象和外在对象脱钩了如果你要让a作为传出变量不要写这 a.Attr(attr);//修改了新对象外在对象没有被修改 }  基本类型也会出现这种情况例如:  public void fun2( a)  {  a = 10;//只作用于本思路方法外面变量不会变化 } 6、java.util篇 48 java能动态分配吗? 答:可以例如 n = 3; Language myLanguages = Language[n]; 49 我如何知道长度? 答:用length属性如上例中 myLanguages.length 就为 3 50 我还想让长度能自动改变能够增加/删除元素 答:用顺序表--java.util.List接口你可以选择用ArrayList或是LinkedList前者是实现后者是链表实现例如:  List list = ArrayList;  或是  List list = LinkedList; 51 什么是链表?为什么要有两种实现? 答:请补习数据结构 52 我想用队列/栈 答:用java.util.LinkedList 53 我希望不要有重复元素 答:用集合--java.util.Set接口例如:Set = HashSet 54 我想遍历集合/Map 答:用java.util.Iterator参见API 55 我还要能够排序 答:用java.util.TreeSet例如:Set = TreeSet放进去元素会自动排序你需要为元素实现Comparable接口还可能需要提供equals思路方法compareTo思路方法hashCode思路方法 56 但是我想给排序 答:java.util.Arrays类包含了sort等实用思路方法 57 我想按区别思路方法排序 答:为每种思路方法定义个实现了接口Comparator类并和Arrays综合运用 58 Map有什么用? 答:存储key-value关键字-值对你可以通过关键字来快速存取相应 59 思路方法没问题但是get思路方法返回是Object 答:强制类型转换成你需要类型参见45 60 我要获得个随机数 答:使用java.util.Random类 61 我比较两个String总是false但是它们明明都是"abc" ! 答:比较String定要使用equals或equalsIgnoreCase思路方法不要使用 ! 比较是两个引用(变量)是否指向了同个对象而不是比较其内容 62 我想修改个String但是在String类中没找到编辑思路方法 答:使用StringBuffer类  String str = "......."; //待处理串 StringBuffer buffer = StringBuffer(str); //使用该个 StringBuf  fer  buffer.append("..."); //StringBuffer相关API来编辑串 String str2 = buffer.toString; //获得编辑后串  另外如果你需要将多个串连接起来请尽量避免使用+号直接连接而是使用StringBuffer.append思路方法 63 我想处理日期/时间 答:使用java.util.Date类你可以使用java.text.SimpleDateFormat类来在String和Date间互相转换  SimpleDateFormat formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //规定日期格式 Date date = formatter.parse("2003-07-26 18:30:35"); //将符合格式String转换为Date  String s = formatter.format(date); //将Date转换为符合格式String  有关定义日期格式详细信息请参见API

TAG: FAQ Java JAVA java 入门 学习
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: