我在SO上经历了一些Java问题.我必须说这里的内容写得非常好,SO上的Java人员可以真正抽出答案.
但我总是找到Java人的Java答案.这本身就很棒,但我是一个Java菜鸟.所以我并不关心"类型参数方差联合联合"的运作方式.它可能很方便,但现在......它不是.
Java for a noob(来自PHP和Python)什么是cheatcodes?
如果你可以链接到一个SO答案(可能在那里但我找不到)或者写出Java与其他语言不同的东西是什么?(在基础水平上)
有些人可能称之为Java Gotchas(虽然我找不到官方的)
有一系列半官方的"陷阱",被称为Java Puzzlers,并记录在一本同名的书中 ; 您可能还会在网上找到一些截屏视频.每隔一段时间,约书亚·布洛克和Neal Gafter喜欢现在的一堆看似平淡无奇的挑战,并着手系统地删除你有,你明白即使是Java语言的含糊不清的基本概念的任何.
在一个稍微不那么愤世嫉俗的说明中,如果你想避免许多常见的设计和实现,你可以看看前面提到的Joshua Bloch的Effective Java,它有很多关于如何去设计几个重要的-但往往写得很差-写组件方面在Java中,包括如何正确地实现合同的全面的解释equals()
和hashCode()
,以及为什么你应该避免clone()
像瘟疫.
哦,不要将字符串与==
运算符进行比较.
说通过引用传递对象.
实际上,方法只适用于通过值传递的对象引用的副本.
Java仅适用于按值传递.
另外值得一读:Is-java-pass-by-reference?
一个小问题:在Google上搜索Java类并期望找到最新信息.建议:始终包含版本号,即搜索"inputstream 6"而不是"inputstream".同样,要注意网上的教程,很多都已经过时了.
书签javadocs:http: //java.sun.com/javase/6/docs/api/index.html
更好的是,在本地安装它们并在本地计算机上为页面添加书签,以便更快地查找和离线浏览.
我认为另一个常见的初学者陷阱是重新发明轮子.也就是说,当库(图像已经提供)(可能更好)实现时,自己编写一些(低级)算法,数据结构或实用程序.
有关这一点的详细说明,请阅读Joshua Bloch的Effective Java(第2版)中的第47项:了解并使用这些库.(阅读整本书,在它的同时!;-)我会引用他给出的一些主要建议:
通过使用标准库,您可以利用编写它的专家以及在您之前使用它的人的经验.
[...]每个程序员应当熟悉的内容
java.lang
,java.util
以及,在较小程度上,java.io
.
特别是Java 集合框架,在java.util
,将是任何Java程序员,新手或不非常有用; 布洛赫先生说,它绝对"减少了编程工作,同时提高了性能".
除了Java平台本身附带的库之外,值得一提的一系列Java库是Apache Commons.它涵盖了很多方面,被广泛使用,并且经常在标准库离开的地方继续.此外,虽然我自己还没有使用它们,但Google最近似乎推出了一些补充Java平台的高质量Java库,例如Google Collections(有趣的文章).编辑:现在我已经熟悉了Google Collections,我可以说在学习Java Collections框架后,该库绝对值得研究; 它似乎是完美的延伸!从我链接到的Javalobby文章开始,并查看主要开发人员Kevin Bourrillion的演示文稿:第1 部分和第2部分.
标量类型int
和盒装类型之间的区别Integer
对于Java新手来说是令人惊讶的.
Java总是区分"标量"类型,它们不是类:( boolean
真/假),char
(无符号16位),short
(带符号16位),int
(带符号32位)和long
(带符号64-)位); 以及其他所有类,最终都是从Object
类中派生出来的.
当你想使用像a这样的泛型集合之类的东西时会出现问题List
.A List
可以包含任何派生自Object
但不是标量值的内容.因此,为了将int
值存储到a中List
,需要将它们包装到Integer
派生自的类的实例中Object
.
在旧版本的Java中,您还需要Integer
使用.intValue()
方法调用显式地从类中获取值.在较新版本的Java中,此转换称为"拆箱",在某些情况下是自动转换.
Sun有一个关于自动装箱的简短页面,它针对的是一个更有经验的程序员,但可能会提供信息.
我认为最好的"作弊码"是"不要聪明,写下愚蠢的代码".
这些术语有些加载,但基本上你想要在编写它们时简单易懂,因为当你以后回到它时它们会很容易阅读.现在,JVM比你更聪明,非哑代码通常会尝试"更有效"地执行某些操作,这可能会阻止JVM做更聪明的事情.
看看http://java.sun.com/developer/technicalArticles/Interviews/devinsight_1/
请注意:编写智能代码是可以的,你只需先证明是必要的:)
编辑:还有一些事情.
写了很多代码.实践是完美的 - 始终努力以最好的方式做到这一点.如果您稍后再回到代码中,您可能已经学会了一两件事,因为这样可以让您了解先前的选择,从而在下次必须做出选择时做出更好的决策.这包括文件!文档是允许其他人使用您的代码而不详细了解它的原因.
阅读了很多代码.设置IDE,以便您可以查看尽可能多的源代码.通过在Eclipse中使用JDK作为JVM,源会自动附加,因此您可以查看在断点处遇到的任何内容的源.在代码中包含来自例如Apache的jar时,请包含源代码,以便您可以看到它的作用.有一天它会帮助你弄清楚为什么会发生某种事情以及如何避免它.
与同行合作.其他类似程度的程序员可能会为情境提供输入 - 甚至可能只是听他们的解释澄清了你的想法 - 你也可以帮助他们.通过共同合作和共同评估,您可以相互利用.
Sun的Java教程涵盖了大量的Java库,并且学习那些涵盖运行时基本部分(java.lang,java.io)的内容并阅读其余部分(只是为了知道存在的内容)将使您成为一个Java库.更熟练的程序员.您将了解工具箱中的内容!
参与Stack Overflow.为问题写出好的答案(即使他们已经得到了回答但很糟糕),这样你就可以将自己的经历用于文字,这就是编写文档的做法:)
考虑在代码上运行FindBugs(作为Eclipse插件提供).它可以标记许多常见错误.随着检查工具的出现,我认为这对初学者来说是一个很好的选择,因为它不会挑剔无关紧要的细节.
这可能有点过于基本的建议,所以请原谅我,如果我冒犯你提出它,但我已经看到太多的Java代码开始static
自由地抛出关键字,似乎不考虑它的用途.所以,如果你看到一个警告抱怨"静态引用非静态值"或一些这样的事情,不要试图通过随机将解决这个问题static
上的其他非静态的东西,除非它是有道理这样做.
这是一个小问题,您可能无法搜索,直到您知道它的术语:"package-private".在Java中,存在于C++等其他地方的公共,受保护和私有范围.如果你还不知道的话,你可以阅读它们的用途.但请注意,如果您没有指定某些内容是公共的,受保护的还是私有的,那么这些都不是.它是包私有的,除了缺少关键字之外没有指定它的关键字.包私有的东西作为私有值,作为另一个包中的任何东西,公共对同一个包中的东西.
另一个随机提示:使用包.有可能不用package com.whatever.foo;
一行开始你的.java文件,如果你正在使用命令行javac,你会发现在你的工作目录中显示缺少该行的文件很好,但它几乎总是会结束后来痛苦.并且无论如何都停止使用命令行javac.使用Eclipse.
如果您已熟悉命令式C语言,那么Java是一种非常直接的语言.深层问题与语言无关,但更广泛地与静态(和强烈)类型,单继承,OO语言相关.
我也谦卑地不同意我的Java兄弟,并建议您使用文本编辑器和命令行学习基础知识.那就是JVM的具体问题是最突出的.
记住Java和其他语言之间最重要的区别:Java既是一种语言又是一种平台.
你需要理解类路径的概念; 逻辑包结构与文件系统中的(类似)实施例之间的关系.
在命令行输入时,输入'java','javac'等会怎样?学习基础知识.
IDE将完全克服Java 平台的这些基本问题.
如果您愿意,我还建议您阅读Java语言规范和(是)JVM规范.如果Mastery是你所追求的,那么当你开始用Java旅程时,请确保你找到了类加载器和相关问题.
总是:
String a = "wow, not the same"; String b = "wow, not the same"; String c = new String("wow, not the same"); if (a == b) { //happens to evaluate to true, but you shouldn't do this ... } if (a == c) { //evaluates to false, which is why you shouldn't do it ... } //This is how you *should* do this if (a.equals(b)) { //evaluates to true ... } if (a.equals(c)) { //evaluates to true ... }
使用Eclipse进行Java编辑/开发/调试.或者其他一些IDE可能,但为了上帝的缘故,不要使用记事本和命令行.
注册JavaBlackBelt并开始在那里进行测试.正如您在浏览首页时所看到的那样,它们涵盖了从最简单的事物到极其先进的主题的任何内容.
并且不要为任何测试失败感到羞耻,失败只是在继续之前告诉你应该学到更多什么:)
我见过的一些人会犯一些错误,这些人都是有编程经验但没有Java经验的人:
类隐式扩展 Object
类隐式导入 java.lang.*
instanceof不需要非null检查
例如((Object)new Integer(1)).toString()
,向上转换几乎永远不会有用,因为它不会影响动态方法的选择
字符串是不可变的。无需复制或克隆它们。
不要依赖垃圾收集器或finalize()
执行资源(而不是内存)管理。资源(例如文件)应显式关闭。
一旦显示了Swing组件,则只能从AWT事件线程(通常使用SwingUtilities.invokeLater()
)进行访问。
通常,当多个线程共享相同的可变/有状态对象时,请务必非常小心。请先复制您的对象,或者准备使用一堆很多synchronized
块,wait()
然后再进行复制notify()
。
迷恋设计模式!我不会过分担心设计模式.如果你意识到它们的存在是很好的,那么你就会知道你团队的其他成员在谈论什么,但现在重要的只是探索核心Java API.当你对它们感到满意时,我真的会努力学习如何编写干净的自我记录代码.当您回去并需要记住您正在做的事情时,这将为您节省大量的时间和精力.
静态决赛可以融入课堂.
即
public class Foo { public static final String A_STRING="A_STRING"; } public class Bar { public void printString() { System.out.println(Foo.A_STRING);} }
现在编译两个,然后更改"Foo"并重新编译Foo但不重新编译Bar.Bar仍然会打印出A_STRING的旧值.要亲自体验一下,在eclipse中本地运行,它会静默地重新编译所有类,然后在服务器上进行增量更新.嘿,我的改变在哪里?