著數優惠交流網's Archiver

高山 發表於 2007-9-13 15:31

java初学者最易犯的错误.[原创首发]

相信很多从事java开发的程序员多少都有些c/C++的基础.java和c++同C的语法相近,在下原来也是从事C底层开发,而后转型做j2ee的webservices
现在专职web designer 从DWR(Direct Web Remoting)到
ajax.net,现在也偶尔带一些学生,现在就java初学者或者说刚从事java开发的同事易出现的问题与大家作个交流,当然由于下面只是本人的个人经验,难免有疏漏和错误请指证!

1,从指针的使用到构造方法.
这个标题看似天马行空,其实是有关联的,我们先就在c语言中指针的应用而过渡到java中类的构造方法.
字符串的处理是任何应用程序所必须,也是每个程序员必备的技能,不论你是从事C,C++,java,ada,simula到c#都必须熟练的操作,我们来看看C语言中是如何做的,由于c语言的值类型数据没有string这种类型.通常我们声名一个字符串会这样做.
char*
ch ="i love u ";//老鸟们都知道这个i love u 的字符串是在内存的代码区,字符指针指向了代码区的字符
*ch ="u love
me";
//所以这样就是错的.这是无法修改ch所指的内存地址所标的值
好了,再来看java
第一个错误定义类而忽视构造方法.
这样在用new方法实例一个对象时,成员会因为在构造中未初始化而得不到内存空间,下面看一个例子:

[url=http://bbs.2dai.com/###][Copy to clipboard][/url][url=http://bbs.2dai.com/###][ -
][/url]CODE:
clase Base
{

private int id ;
private String
name;

public
Base()
{

//一般的IDE都喜欢在用户在解决方案管理器创建一个类后,自行添加一个构造方法

}

}
如果说不在这个构造中初始化变量,id,name则如String这样的变量只有栈上的内存,而没有引用.
如果说不建立这个Base()构造方法即没有{}或者说不写这个构造,那么编译器会自动创建默认构造,而id会赋上默认值0.而name也会赋于""

所以个人建议创建类后,有构造方法就要在构造内赋初值.如果说不想在构造方法里赋初值,而又不想为空值,则要去掉构造方法.这个就好像一个很经典的错误:
float
f;
scanf("%f";&f);//这种错误就比较低级了,但是很多国内的教程却都这么写.由于float只声明并未在栈上开辟空间,这时用&取f的空间如果取得到...
[color=red]错误:创建构造方法而不赋初值.[/color]
[color=palegreen]建议:1
创建构造方法,在构造中给对象成员赋初值.类成员(static)则毋须.
2
不创建构造方法,使用默认构造.[/color]

2.java中字符串比较使用
"=="
两个字符串比较在很多语言中都是直接==,而在java 中是不行的,例

[url=http://bbs.2dai.com/###][Copy to clipboard][/url][url=http://bbs.2dai.com/###][ -
][/url]CODE:
String str1="love";
String str2=
"love";
if(str1==str2)
{

System.out.println("相等");
}
可以告诉你这个print是打不出来的...
str1是不等于str2

因为在java中String类操作符方法
"==",比较的是这两个字符串在栈上的地址,而虽然这两个string的栈上的地址有什么可能会一样呢?

当然也有种情况是,同时声明在一个方法内,我们学java知道java为了节省内存开销会把字符串变量放在字符串常量池中,如果说"爱像深晓"这个字符串常量被不同的变量反复引用.那么它们所指的常量池总是一个,不必再辟空间.所以有时候这两个值也可能会一样.
而大多数是不可以用
==来判定两个字符串是否相等的.
比较的方法应该使用String的静态方法Equals().
[color=red]错误:比较两个字符串使用==[/color]
[color=blue]建议:使用String.Equals()[/color]

3.类的属性和成员的概念混淆不清.
类的成员是可任意访问,而类的成员则定义为可根据需要进行保护读写.
这里又引申出一个问题变量名的首写字母必须为小写.
struts作为典型的mvc实现,很受广大的初学j2ee的朋友喜欢.如果说你的一个ActionForm类即继承了ActionForm类.如果说你的成员设置为属性时如果说用了大写开首的变量名,就会出现在前台form访问Actionform实例时出现得不到值的错误!
[color=red]错误:变量名和方法名方法乱写可导致框架运行出错[/color]
[color=blue]建议:1.改造你的编号风格.
1).变量名开首用小写例:int
iState;
2).而方法开首用大写第一个单词为可读字,字符大写,例:public int
GetStuID();
3).
不要用汉语拼音用英文,要使用可读字,不建议使用不可读字,方法命名要见名知意,如

UserID;//good GetMedCategory();//good GetMC//bad
bh//编号的变量名,不建议使用看半天才明白.
[/color](http://www.GetJetso.com - 著數網提供最新著數優惠情報,股市討論,潮流時尚美容討論拍賣及易物服務)

臭酸柑 發表於 2007-9-18 09:09

不錯的解釋..不過近來苦難spring中....

olivehung 發表於 2007-9-23 20:11

多謝分享:@  多謝分享 !!!!!

頁: [1]