当前位置:  开发笔记 > 编程语言 > 正文

Java noob的缺陷是什么?

如何解决《Javanoob的缺陷是什么?》经验,为你挑选了16个好方法。

我在SO上经历了一些Java问题.我必须说这里的内容写得非常好,SO上的Java人员可以真正抽出答案.

但我总是找到Java人的Java答案.这本身就很棒,但我是一个Java菜鸟.所以我并不关心"类型参数方差联合联合"的运作方式.它可能很方便,但现在......它不是.

Java for a noob(来自PHP和Python)什么是cheatcodes?

如果你可以链接到一个SO答案(可能在那里但我找不到)或者写出Java与其他语言不同的东西是什么?(在基础水平上)

有些人可能称之为Java Gotchas(虽然我找不到官方的)



1> Rob..:

有一系列半官方的"陷阱",被称为Java Puzzlers,并记录在一本同名的书中 ; 您可能还会在网上找到一些截屏视频.每隔一段时间,约书亚·布洛克和Neal Gafter喜欢现在的一堆看似平淡无奇的挑战,并着手系统地删除你有,你明白即使是Java语言的含糊不清的基本概念的任何.

在一个稍微不那么愤世嫉俗的说明中,如果你想避免许多常见的设计和实现,你可以看看前面提到的Joshua Bloch的Effective Java,它有很多关于如何去设计几个重要的-但往往写得很差-写组件方面在Java中,包括如何正确地实现合同的全面的解释equals()hashCode(),以及为什么你应该避免clone()像瘟疫.

哦,不要将字符串与==运算符进行比较.


我绝对推荐Effective Java.它将比任何其他书籍做得更多,为您提供良好的Java编程基础.这正是你问题的关键所在.这不是关于Java的白皮书,它不是API中的内容列表,而是您应该知道的有效Java程序员的很多东西.
我是否要为第一段(对于一个n00b来说太高级别的东西)进行downvote,或者为最后两个进行upvote之间的问题

2> andandandand..:

说通过引用传递对象.

实际上,方法只适用于通过值传递的对象引用的副本.

Java仅适用于按值传递.

另外值得一读:Is-java-pass-by-reference?



3> JRL..:

一个小问题:在Google上搜索Java类并期望找到最新信息.建议:始终包含版本号,即搜索"inputstream 6"而不是"inputstream".同样,要注意网上的教程,很多都已经过时了.


下载javadocs ...并使用firefox的快速查找快速查找类

4> Kip..:

书签javadocs:http: //java.sun.com/javase/6/docs/api/index.html

更好的是,在本地安装它们并在本地计算机上为页面添加书签,以便更快地查找和离线浏览.



5> Jonik..:

我认为另一个常见的初学者陷阱是重新发明轮子.也就是说,当库(图像已经提供)(可能更好)实现时,自己编写一些(低级)算法,数据结构或实用程序.

有关这一点的详细说明,请阅读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部分.


这个.特别是因为最近已经添加了(相对)LOT(如在Java 1.5+中),这使得大多数人在Google搜索过时发现了许多教程.如果您了解java.util.concurrent和Collections框架的方法,并且知道如何使用Generics,那么您将领先于众多人.

6> Greg Hewgill..:

标量类型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有一个关于自动装箱的简短页面,它针对的是一个更有经验的程序员,但可能会提供信息.


我认为"原始"是一个更像Java的术语"标量"

7> Thorbjørn Ra..:

我认为最好的"作弊码"是"不要聪明,写下愚蠢的代码".

这些术语有些加载,但基本上你想要在编写它们时简单易懂,因为当你以后回到它时它们会很容易阅读.现在,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.为问题写出好的答案(即使他们已经得到了回答但很糟糕),这样你就可以将自己的经历用于文字,这就是编写文档的做法:)



8> McDowell..:

考虑在代码上运行FindBugs(作为Eclipse插件提供).它可以标记许多常见错误.随着检查工具的出现,我认为这对初学者来说是一个很好的选择,因为它不会挑剔无关紧要的细节.



9> Brandon Yarb..:

这可能有点过于基本的建议,所以请原谅我,如果我冒犯你提出它,但我已经看到太多的Java代码开始static自由地抛出关键字,似乎不考虑它的用途.所以,如果你看到一个警告抱怨"静态引用非静态值"或一些这样的事情,不要试图通过随机将解决这个问题static上的其他非静态的东西,除非它是有道理这样做.

这是一个小问题,您可能无法搜索,直到您知道它的术语:"package-private".在Java中,存在于C++等其他地方的公共,受保护和私有范围.如果你还不知道的话,你可以阅读它们的用途.但请注意,如果您没有指定某些内容是公共的,受保护的还是私有的,那么这些都不是.它是包私有的,除了缺少关键字之外没有指定它的关键字.包私有的东西作为私有值,作为另一个包中的任何东西,公共对同一个包中的东西.

另一个随机提示:使用包.有可能不用package com.whatever.foo;一行开始你的.java文件,如果你正在使用命令行javac,你会发现在你的工作目录中显示缺少该行的文件很好,但它几乎总是会结束后来痛苦.并且无论如何都停止使用命令行javac.使用Eclipse.



10> alphazero..:

如果您已熟悉命令式C语言,那么Java是一种非常直接的语言.深层问题与语言无关,但更广泛地与静态(和强烈)类型,单继承,OO语言相关.

我也谦卑地不同意我的Java兄弟,并建议您使用文本编辑器和命令行学习基础知识.那就是JVM的具体问题是最突出的.

记住Java和其他语言之间最重要的区别:Java既是一种语言又是一种平台.

你需要理解类路径的概念; 逻辑包结构与文件系统中的(类似)实施例之间的关系.

在命令行输入时,输入'java','javac'等会怎样?学习基础知识.

IDE将完全克服Java 平台的这些基本问题.

如果您愿意,我还建议您阅读Java语言规范和(是)JVM规范.如果Mastery是你所追求的,那么当你开始用Java旅程时,请确保你找到了类加载器和相关问题.



11> cgp..:

总是:

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
    ...
}


那将执行条件分支,因为字符串文字被实现,因此"a"和"b"都指向同一个对象.
实际上,在上面的例子中,两个字符串在引用上是相同的,因为字符串文字是实例化的.

12> Kip..:

使用Eclipse进行Java编辑/开发/调试.或者其他一些IDE可能,但为了上帝的缘故,不要使用记事本和命令行.


-1我不同意100%.作为一个新手,你绝对不应该从一个大的IDE开始,直到你编写并运行至少一些不完全琐碎的程序,只使用文本编辑器和命令行工具.其他人,当底层机制(你不理解)发光时,你会过于依赖IDE而无助.
不,不,没有迈克尔!我曾经教过Java(企业培训).我开始使用命令行工具和一个简单的编辑器.学生们必须同时处理语言*和*工具.当我开始在课程中使用VisualAge for Java时,学生们更快地掌握了语言概念和想法,当我稍后介绍命令行工具时,对他们来说要容易得多.将"包"视为组织概念而不是目录结构会更好...... IDE FTW!
只要IntelliJ活着并且很好.
我曾经是一个Eclipse用户,然后发生了令人震惊的事情; 我搬到了NetBeans,自6.0左右以来一直很容易接受,而且从6.1左右开始就非常好.如果您仍在尝试选择IDE,我建议您查看一下.
确实.如果您从不使用Eclipse,那么它就是基本Java编程的王者.

13> Esko..:

注册JavaBlackBelt并开始在那里进行测试.正如您在浏览首页时所看到的那样,它们涵盖了从最简单的事物到极其先进的主题的任何内容.

并且不要为任何测试失败感到羞耻,失败只是在继续之前告诉你应该学到更多什么:)



14> 小智..:

我见过的一些人会犯一些错误,这些人都是有编程经验但没有Java经验的人:

    类隐式扩展 Object

    类隐式导入 java.lang.*

    instanceof不需要非null检查

    例如((Object)new Integer(1)).toString(),向上转换几乎永远不会有用,因为它不会影响动态方法的选择

    字符串是不可变的。无需复制或克隆它们。

    不要依赖垃圾收集器或finalize()执行资源(而不是内存)管理。资源(例如文件)应显式关闭。

    一旦显示了Swing组件,则只能从AWT事件线程(通常使用SwingUtilities.invokeLater())进行访问。

    通常,当多个线程共享相同的可变/有状态对象时,请务必非常小心。请先复制您的对象,或者准备使用一堆很多synchronized块,wait()然后再进行复制notify()


不要使用wait / notify,与Java 5中提供的java.util.concurrent类相比,它们是过时的。在这种情况下,请使用Java提供的队列实现。

15> willcodejava..:

迷恋设计模式!我不会过分担心设计模式.如果你意识到它们的存在是很好的,那么你就会知道你团队的其他成员在谈论什么,但现在重要的只是探索核心Java API.当你对它们感到满意时,我真的会努力学习如何编写干净的自我记录代码.当您回去并需要记住您正在做的事情时,这将为您节省大量的时间和精力.



16> Steve B...:

静态决赛可以融入课堂.

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中本地运行,它会静默地重新编译所有类,然后在服务器上进行增量更新.嘿,我的改变在哪里?

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有