达内学习心得体会java

小草范文网  发布于:2016-10-07  分类: 学习心得体会 手机版

篇一:达内Java学习心得之易犯错误

第1 部分 语法

程序员们总是被层出不穷的复杂问题所困扰假如我们最基本的开放工具

— — 设计和编写程序的语言本身就是复杂的那么这个语言自己也会成为这些复

杂问题的一部分而非它们的解决方案了

—— C. A. R. Hoare, The Emperor’s Old Clothes

Java 语言从C++派生而来并借鉴了Objective C Eiffel Smalltalk Mesa 和Lisp 这些 语言的一些特性当使用其他语言的程序员转用Java 来编程时他们很快就会发现Java 的 一些特性和自己以前所熟悉的语言非常相似因此这些程序员通常会认为这些特性在Java 中 和在以前所使用的语言中表现一致其实完全不是这样这些想法在C++程序员中尤其普遍 这一部分重点强调了Java 语言上经常会绊倒新手的陷阱和语言行为

本部分包括以下 10 个单元

Item 1 什么时候被覆盖的 方法并非真的被覆盖了本单元解释了调用子类的实例

方法和静态方法之间的微妙差别

Item 2 String.equals()方法与== 运算符的用法比较”本单元解释了这两种方法比 较字符串的不同之处并指出了常量池是如何混淆这两种用法的

第1 部分语法

2 t

Item 3 Java 是强类型语言本单元解释了基本类型的转换和提升的规则这对从C++ 转到Java 的程序员尤为重要

Item 4 那是构造函数吗本单元给出了一个经典的然而又非常简单的语言陷阱当

我们培训新的Java 学员时这个陷阱总是让学员们问出这样的问题编译器怎么会没发现 它

Item 5 不能访问被覆盖的方法本单元又一次讨论了Java 语言中的方法调用读完以 后你将完全理解这个知识点

Item 6 避免落入隐藏变量成员的陷阱本单元讨论了这一最常见的陷阱所有Java

语言的入门课程都应该提及这个问题并且和this 引用一起讨论

Item 7 提前引用这一较短的单元向我们演示了什么是提前引用以及如何去避免

Item 8 设计可继承的构造函数本单元是取自来之不易的实践经验对于每一个想开 发可重用Java 类的程序员来说这个单元是必读的

Item 9 通过引用传递基本类型本单元对从C++转换到Java 的程序员特别有价值它 解答了在Java 中传递引用的相关问题

Item 10 布尔运算符与短路运算符本单元解释了Java 编程中另一个常见的陷阱

使用逻辑运算符单元中也举了一个使用短路short-circuit 运算符的清晰例子

Item 1: 什么时候被覆盖的方法并非真的被覆盖了

好吧我承认本单元的标题确实带有一定的欺骗性虽然它的本意并非欺骗你而是

帮助你理解方法覆盖的概念想必你已经阅读了一两本这样的Java 书籍它们在开头都指出 了面向对象编程的3 个主要概念封装继承和多态理解这3 个概念对于领会Java 语言来 说至关重要而搞懂方法的覆盖又是理解继承概念的关键部分

覆盖实例方法会在 Item 5 谈到本单元介绍静态方法的覆盖如果你还不明白两者的区 别那么Item 1 和Item 5 正适合你假如你已经急不可待地喊出不能覆盖静态方法那 么你也许需要放松片刻再继续往下看不过在此之前先看看你是否能够猜出下面例子的 输出结果

Item 1: 什么时候被覆盖的方法并非真的被覆盖了

u 3

这个例子摘自 Java 语言规范8.4.8.5 节

01: class Super

02: {

03: static String greeting()

04: {

05: return "Goodnight";

06: }

07:

08: String name()

09: {

10: return "Richard";

11: }

12: }

01: class Sub extends Super

02: {

03: static String greeting()

04: {

05: return "Hello";

06: }

07:

08: String name()

09: {

10: return "Dick";

11: }

12: }

01: class Test

02: {

03: public static void main(String[] args)

04: {

05: Super s = new Sub();

06: System.out.println(s.greeting() + ", " + s.name());

07: }

08: }

运行 Test 类的结果如下

Goodnight, Dick

要是你得出了同样的输出结果 那么你或许对方法的覆盖有了较好的理解如果你的结

果和答案不一致那就让我们一起找出原因我们先分析一下各个类Super 类由方法greeting 和name 组成Sub 类继承了Super 类而且同样含有greeting 和name 方法Test 类只有一 个main 方法

第1 部分语法

4 t

在 Test 类的第5 行中我们创建了一个Sub 类的实例在这里你必须明白的是虽然

变量s 的数据类型为Super 类但是它仍旧是Sub 类的一个实例如果你对此有些迷惑那

么可以这样理解变量s 是一个被强制转换为Super 型的Sub 类的实例下一行(第6 行)显示 了s.greeting()返回的值加上一个字符串紧随其后的是s.name()的返回值关键问题 就在这里我们调用的到底是Super 类的方法还是Sub 类的方法让我们首先判断调

用的是哪个类的name()方法两个类中的name()方法都不是静态方法而是实例方法因为

Sub 类继承了Super 类而且有一个和它父类同样标识的name()方法所以Sub 类中的name() 方法覆盖了Super 类中的name()方法那么前面提到的变量s 又是Sub 类的一个实例这样 一来s.name()的返回值就是Dick 了

至此 我们解决了问题的一半现在我们需要判断被调用的greeting()方法究竟是Super 类的还是Sub 类的需要注意的是两个类中的greeting()方法都是静态方法也称为类方法 尽管事实上Sub 类的greeting()方法具有相同的返回类型相同的方法名以及相同的方法参 数无然而它并不覆盖Super 类的greeting()方法由于变量s 被强制转换为Super 型并 且Sub 类的greeting()方法没有覆盖Super 类的greeting()方法因此s.greeting()的返回值为

Goodnight 还是很迷惑请记住这条规则“实例方法被覆盖静态方法被隐藏” 假如 你就是刚才大喊不能覆盖静态方法的读者之一那么你完全正确

现在你可能会问 “隐藏和覆盖有什么区别” 你也许还未理解这点然而实际上我们

刚刚在这个Super/Sub 类的例子中已经解释了两者的不同使用类的全局名可以访问被隐藏 的方法即使变量s 是Sub 类的一个实例而且Sub 类的greeting()方法隐藏了Super 类的同 名方法我们仍旧能够将s 强制转换为Super 型以便访问被隐藏的greeting()方法与被隐 藏的方法不同对被覆盖的方法而言除了覆盖它们的类之外其他任何类都无法访问它们 这就是为何变量s 调用的是Sub 类的而非Super 类的name()方法

本单元简要解释了 Java 语言中一个不时引起混淆的问题也许对你来说理解隐藏静态 方法和覆盖实例方法的区别的最佳方式就是自己创建几个类似于Sub/Super 的类再重复 一次规则实例方法被覆盖而静态方法被隐藏被覆盖的方法只有覆盖它们的类才能访问它 们而访问被隐藏的方法的途径是提供该方法的全局名

现在你终于明白标题里问题的答案了吧 什么时候“被覆盖的”方法并非真地被覆盖了 呢答案就是“永远不会” 另外我还有几个要点告诉大家请谨记

Item 2: String.equals( )方法与== 运算符的用法比较

u 5

l 试图用子类的静态方法隐藏父类中同样标识的实例方法是不合法的 编译器将会报 错

l 试图用子类的实例方法覆盖父类中同样标识的静态方法也是不合法的 编译器同样 会报错

l 静态方法和最终方法 带关键字final 的方法不能被覆盖

l 实例方法能够被覆盖

l 抽象方法必须在具体类1中被覆盖

Item 2: String.equals( )方法与== 运算符的用法比较

具有C++经验的读者们肯定会对何时使用等于运算符= = 以及何时使用string 类感到

困惑这种困惑主要是String.equals(...)方法和= =运算符的混淆尽管它们有时产生的结果一

样然而实际上它们的用法是不同的看看下面的例子

01: public class StringExample

02: {

03: public static void main (String args[])

04: {

05: String s0 = "Programming";

06: String s1 = new String ("Programming");

07: String s2 = "Program" + "ming";

08:

09: System.out.println("s0.equals(s1): " + (s0.equals(s1)));

10: System.out.println("s0.equals(s2): " + (s0.equals(s2)));

11: System.out.println("s0 == s1: " + (s0 == s1));

12: System.out.println("s0 == s2: " + (s0 == s2));

13: }

14: }

这个例子包含了 3 个String 型变量其中两个被赋值以常量表达式“Programming” 另一 个被赋值以一个新建的值为“Programming”的String 类的实例使用equals(...)方法和“= =”运

算符进行比较产生了下列结果

s0.equals(s1): true

s0.equals(s2): true

s0 == s1: false

s0 == s2: true

1 具体类也就是抽象方法所属抽象类的非抽象子类

第1 部分语法

6 t

String.equals()方法比较的是字符串的内容使用equals(...)方法会对字符串中的所有字 符一个接一个地进行比较如果完全相等那么返回true 在这种情况下全部个字符

串都是相同的所以当字符串s0 与s1 或s2 比较时我们得到的返回值均为true 运算符“==”

比较的是String 实例的引用在这种情况下很明显s0 和s1 并不是同一个String 实例但 s0 和s2 却是同一个读者也许会问s0 和s2 怎么是同一个对象呢这个问题的答案来自于 Java 语言规范中关于字符串常量String Literals 的章节本例中“Programming” “Program”

和“ming”都是字符串常量1 它们在编译期就被确定了当一个字符串由多个字符串常量连接

而成时例如s2 它同样在编译期就被确定为一个字符串常量Java 确保一个字符串常量只 有一份拷贝所以当“Programming”和“Program”+“ming”被确定为值相等时Java 会设置两个

变量的引用为同一个常量的引用在常量池constant pool 中Java 会跟踪所有的字符串常 量

常量池指的是在编译期被确定并被保存在已编译的.class 文件中的一些数据它包含了 关于方法类接口等等当然还有字符串常量的信息当JVM 装载了这个.class 文件变

量s0 和s2 被确定JVM 执行了一项名为常量池解析constant pool resolution 的操作该 项操作针对字符串的处理过程包括下列3 个步骤摘自JVM 规范5.4 节

n 如果另一个常量池入口 constant pool entry 被标记为CONSTANT_String2 并且指 出同样的Unicode 字符序列已经被确定那么这项操作的结果就是为之前的常量

池入口创建的String 实例的引用

n 否则 如果intern()方法已经被这个常量池描述的一个包含同样Unicode 字符序列的 String 实例调用过了那么这项操作的结果就是那个相同String 实例的引用

n 否则 一个新的String 实例会被创建它包含了CONSTANT_String 入口描述的

Unicode 字符序列这个String 实例就是该项操作的结果

也就是说 当常量池第一次确定一个字符串在Java 内存栈中就创建一个String 实例 在常量池中后来的所有针对同样字符串内容的引用都会得

达内学习心得体会java

到之前创建的String 实例当 JVM 处理到第6 行时它创建了字符串常量Programming 的一份拷贝到另一个String 实 例中所以对s0 和s1 的引用的比较结果是false 因为它们不是同一个对象这就是为何 s0==s1 的操作在某些情况下与s0.equals(s1)不同s0==s1 比较的是对象引用的值而 s0.equals(s1)实际上执行的是字符串内容的比较

1 摘自 Java 语言规范字符串常量由0 个或多个包含在双引号之内的字符组成每个字符都可以用一个换码序列escape sequence

表示

2 它在.class 内部使用用来识别字符串常量

Item 2: String.equals( )方法与== 运算符的用法比较

u 7

存在于.class 文件中的常量池在运行期被JVM 装载并且可以扩充此前提到的intern() 方法针对String 实例的这个意图提供服务当针对一个String 实例调用了intern()方法intern()

方法遵守前面概括的第3 步以外的常量池解析规则因为实例已经存在而不需要另外创建 一个新的所以已存在的实例的引用被加入到该常量池来看看另一个例子

01: import java.io.*;

02:

03: public class StringExample2

04: {

05: public static void main (String args[])

06: {

07: String sFileName = "test.txt";

08: String s0 = readStringFromFile(sFileName);

09: String s1 = readStringFromFile(sFileName);

10:

11: System.out.println("s0 == s1: " + (s0 == s1));

12: System.out.println("s0.equals(s1): " + (s0.equals(s1)));

13:

14: s0.intern();

15: s1.intern();

16:

17: System.out.println("s0 == s1: " + (s0 == s1));

18: System.out.println("s0 == s1.intern(): " +

19: (s0 == s1.intern()));

20: }

21:

22: private static String readStringFromFile (String sFileName)

篇二:达内Java学习心得-第一个月

学习心得

七月之始,我们的达内java班又开始正式上课了,从上课第一天到现在,已经有一个月了,在这短暂的一个月里,我学到是java的基础知识,重点是JavaSE。感觉时间过的是非常快的,短短一个月就这样被我们给熬过去了,当中既有心酸也有快乐。

学习之初,有着一点点的不适应,首先是时间段的不适应,每天有这规定的时间上课,下课,休息。或许是在大学这个懒散的环境下,我们已经渐渐的远离了规定与约束,过分的放纵自己。随着时间的一天天过去,慢慢的,我们开始适应了这种学习的时间安排以及这样的学习氛围,从一种自由放纵中摆脱出来,有了所谓的上进心,开始了各自的Java之路。 在这段时间里,自己感觉最明显的就是打字速度和以前相比有了明显的提升,此外就是对一些基本的代码的理解和运用有了一定自己的意识。这两点是最明显的变化。个人感觉学了这些基本知识之后,对于Java的认识上的确有了一个提升,起初对它的认识感觉和其他的编程语言应该没有多大区别,但是学完这些这些基本的知识之后,我的认识是Java很强大,我们需要不断地去学,更多的是要不断的去敲,把它练熟,这样自己在从业的时候才会有底气,敢于和别人去竞争。

虽然我们的课堂是看视频来学习,但是个人觉得只要是能学到知识,这些学的形式只是一种次要的因素而已,对于一个想要学习的人来说,他每时每刻都在学习者,因为他爱学习。有了这一个月的学习经历之后,感觉自己当初选择达内来学习Java是一个正确的选择,我相信我只要有学习渴望,达内一定能给我所要学的。一个都不爱学习的人,你给他再好的学习环境和最好的学习条件,无亚于对牛弹琴,无动于衷。结果还有一个浪费资源,浪费精力。 整个学习的时间是四个月,对于余下的三个月,我拭目以待,相信自己一定能够在有限的时间内能够学好这一门语言,为自己以后多一个机会。

相信,我可以!

篇三:达内学习心得:学JAVA必看,不看会后悔!

达内学员:学JAVA必看,不看会后悔!

获奖学员:叶琪

所获奖项:三等奖

内容:

有奖征文没说一定要发知识讲解之类的!

那我就将自己的一些小技巧在这里分享给大家!大半夜的给你们码字你们忍心不点5分么!

首先说一下快捷键,也许一些你们都已经知道了!但至少我现在跟老师敲代码以及自己打代码基本可以做到纯键盘操作了!

觉得这些没用的别急慢慢往下看 后面有绝对劲爆的技巧送给你们!Shift+Alt+F:新建,包括新建包以及新建类

Ctrl+1:不用说了!最常用也是最强大的快捷键!

Ctrl+Shift+O:自动导包以及删除没用的包

Shift+Alt+X :屏幕右面出现黄框以后按J,可以快捷键运行项目Shift+Alt+Q:屏幕右面出现黄框以后按C,可以让控制台获得焦点Ctrl+M:切换当前获得焦点的窗口最大化和最小化

Ctrl+S:快速保存

Ctrl+D:删除鼠标所在行的所有内容

大半夜比较昏,常用的暂时就记得这么多!下面给大家说一下一个好用的技巧!

相信很多人郁闷为什么老师打main方法打个main就全部跳出来了吧?老师老是觉得我们打的慢~而且现在学到的关键字一个比一个长!怎么办!!?其实我们的MyEclipse隐藏了许多功能,其中一个就是智能输入,下面我一步步教大家怎么让我们的MyEclipse变得强大起来!

1.打开你的MyEclipse,由于好像不能上图,我只能尽可能讲的详细一点了。上面菜单栏找到window,点击后出现下拉框,选择最下面的Preferences.

2.在弹出的框中左面一栏里选择Java-->Editor--->

Content Assist.

3.然后看右面那栏框,找到Auto-Activation下面的“Auto Activation triggers for java"选项,可以看到默认的是一个".",这就表示你现在只有当输入“."的时候,软件才会跳出智能提示供你选择!是的,我们只要修改这里就可以,但是由于这里输入有限,所以跟着我继续往下做!

4.我们在“."后面加上abc,是的,现在就是".abc",意思我们现在打.abc中任意一个的时候软件都会跳出提示,但我们想要更多提示,怎么办呢,别急 继续往下!加上"abc"后我们点apply然后ok.

5.然后我们在菜单栏的File下选择Export....,在弹出的框中选择General-->Preferences,然后下一步,选择导出路径,我们就选桌面即可,名字输入“1”即可,然后点击保存。

6.然后我们来到桌面,找到刚刚导出的1.pdf,打开方式选择记事本!然后我们会看到这个其实是MyEclipse的配置文件.

7. 这一步很关键!:我们按Ctrl+F,输入".abc"进行查找,此时光

标会跳到.abc处,我们将.abc改成".abcdefghijklmnopqrstuvwxyz(,"

(引号内的内容)

8.然后我们保存并关闭,然后回到MyEclipse,菜单栏选择File-->Import....,然后同样选择Greneral--->Preferences,然后选择我们刚刚的1.pdf然后点Finish即可。

9.然后好好体会你的MyEclipse有什么不同吧!当你想输入public static void main(String[] args)。。。你只要输入ma然后按回车即可~从此再也不用担心跟不上老师的速度了!

后话:其实在Windows--->Preferences-->Java--->Editor里有很多可以修改的东西,比如字体颜色等等,可以让你的MyEclipse更个性化~! 终于码完了。。都快两点了,你说你们不给5分对得起我么! 最后祝大家学业有成!

大家有好的技巧也要懂得分享哈哈~!

本文已影响