您的位置:首页 > 编程语言 > Java开发

读书笔记:Java语言复习(未完)

2011-07-16 11:10 323 查看
1、Java的基本数据类型有四类八种(整数型(byte 1、short 2、int 4、long 8)、字符型(char 2)、布尔型(boolean 1)、浮点型(float 4、double 8)),各基本数据类型有固定的表数范围和字段长度,不受具体操作系统影响,以保障Java程序的可移植性。Java字符采用“Unicode”编码,每个字符占两个字节。对于整数型,Java默认int,如果声明long型常量,必须在数后加l或L。对于浮点型,Java默认为double,如果要声明一常量为float型,必须在数字后面加 f 或 F。浮点数有一定误差,当判断一浮点变量与一浮点数相等时,不能用“==”,而是采用相减比以较小值小即可。
2、boolean类型不能转换成其他类型,反之也不行。整型、字符型、浮点型可以相互转换。容量小的类型自动转换为容量大的类型:byte、short、char -> int -> long -> float -> double。值得注意的是byte、short、char之间不能互相转换,三者运算时首先回转成int类型,结算结果也为int型。容量大的类型转换成容量小的类型须进行强制类型转换,但可能造成精度降低或溢出。多类型数据混合运算时,系统自动把所有数据自动转换成容量最大的类型再进行转换。基本数据类型间的转换除了自动转换、强制转换,还可以通过包装类进行转换,Java为每一个基本数据类型都提供了包装类。对于引用类型,只有继承关系的父类与子类间才可以进行类型的转换。
3、Java中,“==”运算符比较基本数据类型时比较的是这两个操作元的值是否相等,在比较时不考虑操作元的数据类型,比较引用类型时比较的是这两个变量是否引用了同一个对象,在比较引用类型的变量时,其被显式声明的类型必须相同或者具有继承关系。equals()方法的比较规则实际上就是“==”运算符的比较,但JDK中一些类重写了Object类中的equals(),重新定制了比较规则:如果两个对象的类型一致,并且内容相同(不能同时为null),则返回true,这些类包括包装类、String、java.util.Date等。所以在比较字符串时,应该采用equals()方法进行比较。
4、分支语句switch(表达式){case 常量表达式:***}语句中,表达式必须为int类型,byte、char、short等可自动转换成int的自然可以,常量表达式的值必须是一个与表达式数据类型相兼容的值,如可以是整数,但不可以是实数,可以是字符,但不可以是字符串。
5、break语句只能中止switch语句或退出当前循环,如果要退出嵌套很深的循环时,可以使用带标签的break语句。continue语句只能用于for、while和do...while循环语句中,用于直接跳过其后面的语句,进行下一次循环。也可以和标签搭配使用,跳出深层循环。return语句可以从一个方法返回,把控制权交给调用它的语句,通常放在方法最后,当把单独的return语句放进一个方法的中间时,会产生“Unreachable code”编译错误,但可以使用if语句把return括起来的方法来将return语句放技能一个方法的中间。
6、Java中进行方法调用中传递参数时,遵循值传递的原则,基本类型传递的是该数据值本身,引用类型传递的是对该对象的引用,而并非对象本身。Java在声明了一个变量后,在内存中就为其分配存储空间,若数据类型为基本类型的变量,该空间用来存放具体的值,而对于引用类型变量,则存放的是该被引用对象的存放地址。对于声明的局部变量,若不指定要存储的值,则该空间内不会存放任何值,此时对该变量操作会编译错误。对于类的成员变量,允许只进行声明,若变量为基本类型,Java虚拟机会自动将它们初始化为默认值,若为引用型变量,则被初始化为null。
7、并非所有的递归都能转换成非递归实现,递归方法转为非递归实现时要把握规律,注意有限变量的角色转换,再进行循环。
8、Java语言与C++相比,用接口取代了多重继承,并取消了指针。
9、面向对象程序设计的特点主要有封装性、继承性和多态性。封装性是指将对象的属性和方法封装起来,用户只需要知道并使用对象提供的属性与方法等接口即可,不需要知道对象的具体实现,这样可以使对象以外的部分不能随意存取对象内部的数据,避免外部错误对内部数据的影响。多态性是指在基类中定义的属性和方法被子类继承后,可以具有不同的数据类型或表现出不同的行为。在Java中,通常使用方法重载(Overloading)和方法覆盖(Overwriting)来实现类的多态性。方法重载是指在一个类中出现多个方法名相同、但参数表不同的方法,方法返回值的类型不能作为区分方法的标志。方法的覆盖用于子类重写覆盖父类的方法,通过覆盖可以使一个方法在不同子类中表现出不同的行为。进行方法覆盖时,子类的声明方法也必须跟父类中被覆盖的方法的声明一样;子类不能覆盖父类中声明为final或static的方法;子类必须覆盖父类中声明为abstract的方法,或者子类也该声明为abstract。
10、在声明时,不能使用public、protected、private和static关键字对局部变量进行修饰,但可以使用final,用于指定该局部变量为取值不会改变的常量。
11、Java提供垃圾自动回收机制,但垃圾回收系统的运行是不可预测的,因此,Java中也可以使用析构方法finalize()随时来销毁一个对象。析构方法finalize()没有任何参数和返回值,每个类有且仅有一个析构方法。
12、抽象方法不能使用private或static进行修饰,包含一个或多个抽象方法的类必须声明为抽象类,不能被实例化。final类不能被继承,final方法不能被重写。
13、数组在Java中也被看作是一个对象,即使使用new创建数组后,它也只是一个引用,数组的定义与数组的分配空间和赋值也是分开的。字符串同样也是Java对象。一个空字符串并不是说它的值等于null,空字符串和null是两个概念,空字符串是有空的“”符号定义的,它是实例化之后的字符串对象,但是不还任何字符。而null并不是字符串的实例对象,它是一个常量,但不包含和人东西,更不是空字符串。String字符串对象的长度是固定的,它的内容不能被改变和编辑。每次使用“+”连接符连接并生成新的字符串,都要在内存中创建新的字符串变量,并为该对象分配新的空间,极大增加系统开销。使用StringBuilder类可以动态的更改字符串的内容,使字符串的执行效率大大提高。
14、集合类——如List、Set和Map——和数组不同,数组的长度是固定的,存放的基本类型的数据,而集合的长度是可变的,存放的是对象的引用。List接口和Set接口都实现了Collection接口,但List接口允许存放重复的对象,排列方式为按照对象的插入顺序,而Set接口不允许存放重复的对象,排序方式为按照自身内部的排序规则。Map接口以键值对(key-value)的形式存放对象,其中键(key)对象不可以重复,值(value)对象可以重复,排序方式为按照内部的排序规则。装进集合的类型都会被当做Object对待,从而就失去了原有的实际类型,从集合中取出时也需要进行类型转换。泛型就是解决集合类的这种不足的。泛型中存放的是原类型的数据。
15、在try-catch-finally语句中,无论程序中有无异常发生,finally语句都会执行。finally语句为异常处理提供一个统一的出口。不能单独使用try、catch或finally语句块,否则编译出错。try语句块后既可以只使用catch语句块,也可以只使用finally语句块。当与catch语句块一起使用时,可以存在多个catch语句块,而对于finally语句块只能存在一个。当catch与finally同时存在是,finally必须放在catch之后。try只与catch语句块使用时,可以使用多个catch语句块来捕获可能的是异常,异常发生后,Java虚拟机会由上而上检测当前catch语句块所捕获的异常是否与发生的匹配,若匹配,则不再执行其他的catch语句块。如果多个catch语句块捕获的是同种类型的异常,捕获子类异常的catch语句块要放在前面。throws关键字通常用来在方法声明中指定方法可能抛出的异常,多个异常可用逗号分隔。而throw关键字则用于方法体内,且抛出一个异常类对象,通常用来抛出用户自定义的异常。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则同样需要在抛出异常方法中使用throws关键字在方法的声明中指明要抛出的异常;如果想在当前方法中捕获并处理throw抛出的异常,则必须使用try-catch语句。此外,使用throw语句抛出一个异常对象时,该语句之后的代码将永远不会执行。
16、Java异常是指运行期出现的错误。Java的异常类都继承自java.lang.Throwable类,Throwable类有两个子类:Error类和Exception类。Error类及其子类通常描述Java运行系统中的内部错误以及资源耗尽的错误,一般比较严重,仅靠修改程序本身是不能恢复执行的,被称为致命性类。Exception类称为非致命类,程序发生的异常可以通过捕获处理后正常运行。在Java开发中要进行的异常处理主要是针对Exception类及其子类。Exception类根据错误发生的原因可以分为两类:RuntimeException异常和其他异常。RuntimeException异常也成为不检查异常,是程序员编写了错误的程序导致,修改了就可继续运行,可以不通过try-catch、throws语句捕获或抛出,在编译时是可以通过的,只是在运行时由java虚拟机来抛出。RuntimeEXception异常之外的异常被称为检查异常,要求必须通过try-catch语句捕获或由throws抛出,不然会编译出错。
17、自定义异常类必须继承自Throwable类,才被视作异常类,通常是继承Exception类及其子孙类。自定义异常的使用步骤:a、创建自定义异常类。b、在方法中通过throw关键字抛出异常对象。c、如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则在方法的声明处通过throws关键字指明要跑出给方法调用者的异常,继续下一步操作。d、在出现异常方法的调用中捕获并处理异常。
18、子类重写父类的方法时,需要抛出与父类方法所抛出异常类型一样的异常(不能大也不能小)或不抛出异常。
19、内存空间主要分为四个区域:代码区(code segment)、数据区(data segment)、栈区(stack)以及堆区(heap),代码区存放代码,数据存放静态变量以及常量,栈区存放临时变量,堆区存放new出来的对象。在数据区对存放的数据要进行优化,比如当其中已存在一常量时要再定义一个相同常量时,就只会将该常量的引用返回,而不会真实生成它。
20、StringBuffer与String类似,但StringBuffer可以对其字符串进行改变,代表的是可变的字符序列。在对两String常量进行“+”运算时,是经过生成一新的字符串常量再把引用返回。StringBuffer则是直接对字符串进行操作。
21、Java的输入输出流主要有4个抽象类提供:InputStream类、OutputStream类、Reader类和Writer类。流按照不同的分类可以分为:字节流和字符流、节点流和处理流、输入流和输出流。有很多时候需要把字节流转换成字符流进行操作。在输出流操作时,调用close()关闭流前最好使用flush()来输出缓冲区数据。
22、对象序列化可以使保存对象类型成为可能,被序列化的对象必须实现java.io.Serializable接口,否则不能实现序列化。writeObject()函数实现序列化,而readObject()函数实现反序列化(转化为具体对象需强制类型转换)。
23、线程必须拥有父进程,一个进程中的多个线程共享该进程的系统资源。在Java中,线程也是一种对象,只有实现Runnable接口的类的对象才能成为线程。创建线程有继承Thread类方式(Thread类已经实现Runnable接口)和实现Runnable接口方式。继承Thread类一般也要重写类中的run()方法以实现用户所需要的功能,实现Runnable接口要覆写其唯一的方法run()。实现Runnable接口启动线程时,需要实例化一个对象,使用该对象作为实例化Thread对象的参数,然后使用Thread类中的start()方法启动线程。
public class Simple implements Runnable{
Simple simple = new Simple(); //实例化Simple对象Thread thread = new Thread(simple); //实例化Thread对象thread.start(); //启动线程}24、结束线程有两种方法:自然消亡和强制死亡。其中调用Thread类中stop()方法强制停止已经被废弃。后台线程即Daemon线程,是一个在背景执行服务的线程。如果所有的非后台线程结束了,则后台线程也会自动终止。可以使用Thread类中的setDaemon()方法来设置一个线程为后台线程,但必须在线程启动前调用setDaemon()方法,这样才能将这个线程设置为后台线程。
25、Java中线程的同步可采用两种方式:同步方法和同步块。同步方式是将访问共享资源的方法都标记为synchronized。同步块是一块用synchronized关键字和大括号括起来的一段代码块。线程间用于通信的方法主要是wait()和notify()方法,在实际应用中,wait()与notify()必须在同步方法或同步块中调用,因为只有获得这个共享对象,才可能释放它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: