java笔记.docx
- 文档编号:24904258
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:24
- 大小:34.62KB
java笔记.docx
《java笔记.docx》由会员分享,可在线阅读,更多相关《java笔记.docx(24页珍藏版)》请在冰豆网上搜索。
java笔记
1.Java特性
1.1语法和词汇
Java的语言是在C++基础上发展起来的一种面向对象的高级语言,它的语法基本是继承了C++的语言,但有以下几点值得注意:
∙C语言是函数的集合。
C++兼容C,既有函数,也有类。
C++可以实现面向对象编程,但是仍然离不开一个非对象的main主函数。
这也是初学C++者常常会感到费解之处。
他们虽然理解了C++的语法,但是不知道怎样实现面向对象编程。
事实上,如果将C++当成更好的C使用,其实本来就是面向过程的语言。
只有利用面向对象的思想,使用面向对象的特性进行编程时,它才是一种面向对象的语言。
Java是比C++更纯的面向对象的语言[1]。
Java程序是类的集合,程序的执行进入点是某一个类的publicvoidstaticmain()方法。
正因为Java程序是类的集合,Java类定义后并不需要“;”(C++中类后面忘记加“;”有时是个会害死人的Bug!
)。
∙Java没有goto语句,虽然Java可以用带标号的break,continue语句实现跳转,但是跳转的范围是有限制,它不像C/C++那样可以随意跳转。
∙Java语言中boolean变量是一种单独的特殊的变量,它只有两个值:
true,false。
并且boolean变量不能与整型变量相互转换。
逻辑操作符AND(&&),OR(||)和NOT(!
)在Java中只能作用在boolean变量上。
C的布尔变量是用整型代替的,ANSIC++虽然发展出bool变量,但是可以用整型代替,也可以与整型相互转换。
因次if(a==b)错写成if(a=b)的错误将被编译器发觉。
∙Java中相对C++增加了无符号右移运算符(>>>,>>>=)。
∙Java语言使用的字符集是Unicode字符集,Java用/uxxxx来标识一个Unicode。
标识符名没有长度限制,而且可以使用绝大部分Unicode字符。
标识符第一个字符是Character.isJavaIdentifierStart方法对之返回true的字符。
Java语言提供了一种用Unicode编写的程序向ASCII转换的方式,以便能为基于ASCII的工具处理(/uxxxx变成/uuxxxx,而非ASCII字符转换为/uxxxx)。
C++使用ASCII字符集,第一字母必须是字母或下划线,其余字母还可以是数字。
特别的字符包括/b(BS),/t(HT),/n(LF),/f(FF),/r(CR)/”(双引号),/’(单引号),//(反斜杠)。
String类型是Java语言默认包含包java.lang中定义的类型,可以直接使用。
Literalstrings何时指向同一对象值得注意:
(1)literalstrings在同一包里,无论属于同一类,还是不同类,都指向同一String对象;
(2)在不同包不同类的literalstrings也指向同一对象;
(3)在编译期间通过常量计算表达式出的String仿佛是literalstring(“hel”+”lo”==”hello”)
(4)运行时计算出的strings是新建的,所以是不同的(Stringlo=”lo”,“hel”+lo!
=”hello”)。
(5)显式用intern()方法变换的String与预先定义的相同。
(6)使用newString()方法定义的对象与literalstring不同(Stringa=”abcd”,Stringb=newString(“abcd”),a与b是不同的)。
∙Java的String是java.lang中定义的,可以说是内置的,而C++的string是STL中引入的,注意C++是用string而不是String。
Java的String不可改变,要改变必须使用StringBuffer。
C++中string相当于Java的StringBuffer。
∙位操作运算符(bitwiseAND(&),bitwiseOR(|),bitwiseXOR(^))都可以作用在boolean量上,但是位操作NOT运算符(bitwiseNOT(~))不能作用在boolean量。
对于boolean量,位操作运算符的产生的结果是与逻辑运算符一样的,但是它们不shortcircuit表达式(逻辑运算符只要得到结果就不往后计算)。
表1.1Java与C++的比较1(语法和词汇)项目
Java
C++
字符集
Unicode
ASCII,其它语言支持是附加的。
标识符
不定长。
第一个字符可使用任何Unicode字符
规定字符(第一个字符必须是字母或下划线,变量名中只能使用字母、数字和下划线),C++标准未规定标识符可识别长度(可识别长度随系统而定,但一般不要超过32个字符[2])。
关键字
特殊:
boolean,abstract,extends,final,finally,implements,import,
Interface,package,native,strictfp,synchronized,throws,transient
(true,false,null)[3](const,goto)[4]
extern,register,sizeof,struct,union,bool,delete,friend,inline,virtual,operator,template,typedef
操作符
同C++,另加>>>,>>>=
=,>,<,!
~,?
:
==,<=,>=
!
=,&&,||,++,--,+,-,*,/,&,
|,^,%,<<,>>,+=,-=,*=,/=,
&=,|=,^=,%=,<<=,>>=
逗号表达式
只能在for循环中使用
任意地方使用
布尔变量
关键字boolean,与整型没有任何联系
开始是用整型代替的,0为false,非0即为true
字符串变量
String(不可变)
string(可变)
1.2类型、值、变量、表达式
∙Java语言是一种强类型的语言,这意味着所有的变量和表达式在编译期间都有一个类型。
Java的类型有两种:
基本类型(primitivetypes)和引用类型(referencetypes)。
基本类型的存在说明Java语言不是一种纯粹的面向对象的语言(纯粹面向对象的语言一切都是对象,而基本类型不是对象)。
以下是Java类型的分类图:
基本类型<布尔类型(boolean>
<数值类型(numeric)><整型(integral)>
引用类型<类(class)>
<接口(interface)>
<数组(array)>
<空类型(null)>
当任何类型在类变量定义时,如果没有初始化,都会赋予默认值,数值类型默认值为0,布尔类型默认值为false.引用类型默认值为null。
Java中所有数值类型的长度在任何机器、任何平台上都是固定的,因此也没有C/C++的那种sizeof运算符。
本条也是Java语言只所以具有平台无关性的重要原因。
另有一点非常值得注意的是:
对于局域基本类型,Java不允许其不做初始化就使用。
而且不允许重定义一局域变量,以下代码在Java中是错的:
{
intx=12;
{
intq=96;
intx=10;
}
}
∙在Java中,boolean类型除了可以转换为String(true,false)外,不允许转换为整型或浮点类型。
∙数值类型的运算不会产生上溢或下溢异常,这一点值得注意。
doubled=100./0.;d将为Infinity。
Java中没有C++那样的signed和unsigned整型。
∙Java中浮点型向整型转换的过程中默认采用的是去尾法。
∙注意Java语言中的final量与C++中的const量是有区别的:
一个final变量是只能赋值一次的量,这个final量是可以通过类中的方法来改变的,但是C/C++的const量却不能再改变。
类申明中加final保证此类不能再被继承。
Java中voidf(finalinti)类似于C++中voidf(constinti),而voidg(finalBobb)却完全不同于C++中的voidg(constBob&b)。
∙在Java中方法也可以被定义为final的,final方法不能在继承时重定义,可能获得更好效率(编译器可以将它变成内联函数)。
∙在Java中所有的引用类型都在堆中创建,不像C++中有在heap和stack中创建两种选择,在Java中new关键子的使用率远比在C++中使用高。
在C++中,RealPointrp;已经建立对象rp并进行了初始化(假定RealPoint有默认构造函数)。
而在Java中,RealPointrp;只是申明了一个RealPoint的引用,未进行任何初始化,它的值为null。
Java中也不允许用Integeria(3);方式来定义一个Integer,而只能通过Integeria=newInteger(3)的方式。
∙Java语言中,数组类型是一种普通类型。
数组的长度通过访问其公有的length变量得到。
注意,语言Point[]ia=newPoint[5];只是定义了长度为5的Point数组引用,任何一个都未进行初始化。
∙所有的Java基本类型(primitivetypes)都有其对应的包装类(WrapperClasses)。
包装类的作用一是为某一类型相关的方法和变量提供一个家,二是将原始类型包装成类以便为某些只能处理对象引用的类使用,比如HashMap等Collection对象。
∙包装类包括Boolean,Character,Void,Number(Byte,Short,Integer,Long,Float,Double)。
∙应注意Float和Double对象的比较与float和double值的比较是不同的。
每一包装类定义了一个顺序:
-0小于+0,NaN大于所有值(包括+∞),所有的NaN相等。
表1.2Java与C++的比较2
项目
Java
C++
类型
长度固定,无signed,unsigned整型,无sizeof运算符。
整型默认都是signed的。
长度随系统、机器不同,有signed,unsigned整型,有sizeof运算符
类型初始化
类定义中进行默认初始化
类中用构造函数初始化
对象创建方式
堆中创建
堆中或栈中创建
常量表示
final,但是与C++之常量有很大区别。
const
局域变量重定义
不允许
允许
局域变量未初始化使用
不允许
允许
1.3Java类与对象
∙Java中的变量名与方法名可以重名(但这通常不是好的做法),C++中不能。
∙Java是单继承的语言,所有的类都是从Object类继承的,所以可以使用Object类中定义的toString(),clone(),hashCode(),equals()等方法。
∙Java中非static变量可以在定义时进行初始化(这代替了C++中初始化表达式的功能),而C++中只能通过初始化表达式或在构造函数中初始化,C++中非static变量初始化会产生编译错误。
∙Java类中默认的访问(即既不加private,public或protected关键字)控制是包访问,它与private,public,protected都不同。
C++中类的默认访问控制是private。
另外Java中的访问控制是分开定义的(即每个字段或方法分开定义),而C++中是集中定义的(即通过public:
private:
的方式)。
∙Java的函数申明中不能使用默认参数。
这似乎会造成在有多个构造函数时需要做更多的工作,但是Java中允许在一个构造函数中调用另一个构造函数,实际上也很方便。
但是应注意,如果调用其它构造函数,必须在构造函数体的第一个语句使用。
∙Java中this代表对象本身,所以用this.x,this.y方式可以访问对象本身的x,y域。
C++中this是一个指向自身的指针,必须用this->x,this->y方式访问x,y域。
C++用this.x,this.y会产生编译错误。
∙Java语言中没有运算符重载的功能。
唯一一个重载的运算符是String中定义的”+”运算符。
利用这一个运算符,以及Object的toString()方法,可以实现类似C++中重载<<运算符的功能。
∙Java中无const支持(final不能实现类似C++中const的功能),所以要防止改变对象,只有靠用户自己控制(可以使用clone()方法对对象进行拷贝,然后使用)。
Java方法内的参数传递方式,依照文献【3】的说法,“Java语言不是按引用传递对象,而是按值传递对象引用。
”很多文献会说是“Java方法内引用类型按引用传递,基本类型按值传递”。
尽管一般也可以这样说,但严格地说,这种说法是有问题的!
按引用传递意思是,当一个参数传递给一个函数,函数得到一个原始对象的引用,而不是一个值的拷贝。
引用是只能一次赋值的,赋值后不能再改变,而Java中并不是如此。
比如:
classBody{
publiclongidNum;
publicStringname="
publicBodyorbits=null;
privatestaticlongnextID=0;
{
idNum=nextID++;
}
publicBody(StringbodyName,BodyorbitsAround){
name=bodyName;
orbits=orbitsAround;
}
publicStringtoString(){
Stringdesc=idNum+"("+name+")";
if(orbits!
=null)
desc+="orbits"+orbits.toString();
returndesc;
}
}
classBodyRef{
publicstaticvoidmain(String[]args){
Bodysirius=newBody("Sirus",null);
System.out.println("before"+sirius);
commonName(sirius);
System.out.println("after"+sirius);
}
publicstaticvoidcommonName(BodybodyRef){
bodyRef.name="DogStar";
bodyRef=newBody("Other",null);
}
}
输出结果为:
before0(Sirus)
after0(DogStar)
尽管bodyRef已经改为”Other”,但是这并没有改变sirius对象。
如果在C++中使用以下代码:
classBody{
longnextID;
public:
longidNum;
stringname;
Body(stringbodyName){
name=bodyName;
}
stringtoString(){
stringdesc="("+name+")";
returndesc;
}
};
voidcommonName(Body&bodyRef){
bodyRef.name="DogStar";
BodynewBody("Other");
bodyRef=newBody;
}
intmain(void){
Bodysirius("Sirius");
cout<<"before"< commonName(sirius); cout<<"after"< } 则运行结果为: before(Sirius) after(Other) 而C++中才是真正的按引用传递。 ∙Java中没有拷贝构造函数,按C++的方式定义拷贝构造函数会产生问题。 ∙Native方法是用平台相关的代码实现的方法。 ∙在Java中,若基类中有两个public同名方法,派生类overide了其中一个,派生类将继续继承另外一个;这与C++中一个同名方法将overide所有基类方法的方式是不同的。 应能分别Java中的shadowing(阴影化)、obscuring(屏蔽)和hiding(隐藏)和overriding(: (1)Shadowing指一些声明将被另一同名的声明屏蔽掉,以致用单独一个名字难以访问,比如构造函数中A(inti){this.i=i;}中类定义中的i就被局域的i屏蔽(shadow)掉了。 本文件中定义的类也可能屏蔽掉import进的类。 (2)Obscuring是指一个名字可以被解释为变量名、类型名或者包名。 在这种情况下,编译器将优先将其解释为变量名,然后是类型名,最后才是包名。 因此,有可能无法访问一个可见的类型名或包名,这时称声明被obscured.遵守Java的命名规则[5]可以防止obscuring。 (3)Hiding.如果一个类定义一个static方法,这个定义将hide基类或基接口的所有同名声明。 派生类中定义的变量将hide基类中的同名变量。 (4)Overriding指派生类对基类的方法进行重定义,使派生类拥有新的表现。 1.3Java与C++的比较3项目 Java C++ 继承方式 单重继承 多重继承 变量名与方法名是否可重名 可以 不能 缺省参数 不能使用 可以使用 this 对象本身引用 本对象指针 运算符重载 不可 可 拷贝构造函数 不能用 经常使用 参数传递方式 按值传递(但是引用类型传递的是对象引用的拷贝,所以非常类似传递了一个引用,而基本类型则与C++类似) 默认按值传递 默认访问权限 包访问权限 private 访问权限定义方式 单独定义 集中定义 1.4继承和多态 ∙对象、代码重用的重要机制是继承。 Java的继承方式是单重继承,这与C++的多重继承方式有着根本区别。 也正是由于这一区别,使得Java在使用时与C++有着很大不同。 ∙所有的Java对象都从Object基类继承的。 C++没有这种类似的基类,所以它的多重继承性也是逻辑上必然的。 ∙Java有Interface对象,它类似一种纯虚类,通过Interface可以实现多重继承。 C++没有Interface对象。 ∙派生类的构造函数可以调用基类的构造函数,如果不是调用默认构造函数,需要显式调用,并且必须是在第一句调用。 ∙Java没有析构函数,其资源的回收通过垃圾收集器来实现;C++通过析构函数机制来安全消除对象。 ∙在Java中,如果基类中一方法名被重载许多次,在派生类中重定义这一方法名不会隐藏任一基类中的同名方法。 这与C++有着不同。 ∙Java中类继承用extends关键字,而C++中用“: ”来实现。 ∙Java中继承与组合的选择原则与C++一样,is-a关系时用继承,has-a关系时用组合。 ∙Java中类可以被定义为final的,final类不能被继承。 AlanKay关于纯粹面向对象语言的5条规则: (1)Everythingisanobject.(任何东西都是对象); (2)Aprogramisabranchofobjectstellingeachotherwhattodobysendingmessages.(一个程序是一组相互传递信息的对象的集合); (3)EachObjecthasitsownmemorymadeupofotherobjects.(任一对象有它自己的由其它对象组成的内存)。 (4)Everyobjecthasatype.(任一对象都有类型)。 (5)Allobjectsofaparticulartypecanreceivethesamemessages.(所有同一类型的对象能接收相同信息)。 ∙面向对象语言的三个基本特征是: 数据抽象、继承和多态。 ∙Java中所有方法默认都是使用晚绑定的,除非方法是static或者final或者private(private方法默认是final的)。 而C++中函数有晚绑定与早绑定的区别。 晚绑定通过虚函数来实现。 ∙Java中定义有抽象(abstract)方法的类是一个抽象类,这与C++中至少有一个纯虚函数的类是抽象类类似。 但是在Java中抽象类必须用abstract关键字显式说明,而C++中并没有抽象类关键字。 即C++中抽象类是由是否定义纯虚函数决定的,而Java中是由abstract关键字决定的,Java中可以定义一个类为abstract而不定义任何abstract方法。 Java中建构对象的顺序如下: (1)调用基类的构造函数; (2)成员按定义顺序初始化; (3)派生类的构造函数被调用。 ∙Java构造函数中不要轻易调用方法,因为方法在Java中默认是晚绑定的。 这可能会造成基类构造函数调用派生类的方法。 使用构造函数的原则是在保证对象进入正确状态的前提下做尽量少的事,不要调用任何方法。 表1.4Java与C++的比较4(继承) 项目 Java C++ 继承方式 单重继承 多重继承 Interface类 有 无 析构函数 无 有 方法默认绑定方式 晚绑定 早绑定 重定义方法 不隐藏基类同名方法(重载) 隐藏基类所有同名方法 继承关键字 extends(类),implements(接口) 无,用“: ”实现 抽象类 用abstract关键字实现 通过定义纯虚函数实现 1.5命名控制 ∙C++的命名控制主要通过引进命名空间(namespace)来实现的,而Java的命名控制则通过包(package)定义。 ∙Java中field和method和成员类(或接口)可以重名,编译器对两者的区分是通过不同的使用环境。 Java的一般命名规则: (1)类名: 大写开头,接连词首字母大写;类名应该是描述性名词或名词短语,不要太长。 (2)字段名: 一般小写开头,级联词首字母大写;finalstatic字段一般全部大写,各单词间用下横杠隔开。 (3)方法名: 动词或动词短语,首字母小写,接连词首字母大写;getV和setV是获取和设置变量V的值;获取某量长度的方法名应被命名为length,象String方法中一样[6];boolean字段V的值通过isV方法来获取;将对象转化为某一特定格式F时应用toF方法来命名。 (4)临时变量的命名规则: b(byte),c(char),d(double),e(Exception),f(float),i,j,k(integer),l(long),o(Object),s(Str
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)