《java核心技术》基础知识篇学习笔记(一)
基本数据类型
Java无(unsigned)形式的int, long,short,byte。但可以将有符号整数值解释为无符号数。解释器会自己判断的(仅限于加减乘)。
其他特殊运算可以用Byte.toUnsignedInt(b)转换成一个0-255的int值,然后运算,再转换成byte。
UTF-16码点设计(不太懂
尽量避免使用char类型,大多时候用String类处理
java基本数据类型的变量未声明不可使用
设置类常量,使用static final
非基本类型
Sring类
String类原理是共享内存,相互赋值可理解为相互引用。
拼接字符串通常经过
substring
以特定字符串分割,可用join方法
可以用equal方法检测两个字符串是否相等。
1 | s.equals(t); |
一定不要用==去判断,因为这个只能确定字符串是否在同一位置上。
string变量为””表示串长度和内容为空。
为null时意味着没有任何对象与该变量相关联。
StringBuilder和StringBuffer可以用append方法
可以用toString方法得到一个String对象
Console类
Console类可以处理密码
1 | Console cons=System.console(); |
Scanner 类
1 | new Scanner(InputStream in); |
大数
BigInteger和BigDecimal
1 | BigInteger a=BigInteger.valueOf(100); |
数组
new出一个数组时,如果是对象数组则元素对应null值。
for each遍历
java数组也可以通过数组本身遍历
1 | for(variable:collection) statement |
也可用System.out.Print(Arrays.toString(a));
拷贝
数组变量互相=赋值拷贝属于是两个引用共用一个数组
但是可以用copyOf方法
1 | copyLuck=Arrays.copyOf(luck,luck.length); |
sort方法
1 | int []a=new int [1000]; |
多维数组打印
1 | System.out.Println(Arrays.deepToString); |
如何分配一个长度不等的二维数组
1 | int[][] odds=new int[NMAX][]; |
运算符
java中不存在重载操作符这一操作!!!!
特殊的break
代替goto的break;(带标签的break)
1 | label: |
带标签的contiune同理
对象和类
java事一门把封装继承当祖师爷的语言
java的对象变量并不是等于一个对象,它只是一个引用。
//c++没有null引用,引用也不能赋值。
java中的对象都放在堆上,而且会自动回收内存
文件名必须与public类的名字相同。同一个文件中,只能有一个public类,非公有类可以有很多。
关于返回对象的属性
不要编写返回可变对象的访问器方法,这一点和c++很像。
如果需要返回一个可变对象的引用,首先做的是克隆。
final字段
类似于const,必须在构造对象时初始化。
所有类型都加上final,这样的类就是不可变类。
如果可变的类需要用final
可以考虑用
1 | private final StringBuilder evalutaions; |
编译程序的细节
1 | ////method one |
相当于自带了make工具
定义的位置
java不可以在类内先声明然后再定义。
必须在类的内部定义
并且内联不内联由编译器决定。
静态字段和静态方法
静态字段
如果一个字段加上了static修饰,则说明它属于类而不是单独的一个对象。
静态常量比较常用。
1 | public static final double PI=3.1415926; |
静态方法
1、非static方法调用非static方法,直接通过方法名调用
2、static方法调用static方法,直接通过方法名调用
3、非static方法调用static方法,直接通过方法名调用
4、static方法调用非static方法,通过类对象来调用
不在对象上执行。
静态方法不能访问实例字段。
只能访问的类的静态变量。
建议使用类名而不是对象来调用静态方法。
方法参数
JAVA总是按值调用。方法得到的是所有参数值的拷贝。
基本数据类型无法通过方法改变,但可以修改对象参数的状态,是因为对象克隆,克隆的是对象的引用,引用指向的对象是不变的。
重载
java不能重载操作符。
初始化
- java可以直接在类成员声明时初始化(显式字段初始化)
1 | class Employee{ |
初始值未必是常量,“=”号可以加返回值每次变化的函数。
包
每一个包都是独立的类集合。
一个包可以使用所属包中的所有类,以及其他包中的公共类。
使用另一个包的公共类
1 | ##包名后面跟着类名(use fully qualified name) |
在包中增加类
源文件必须放到与完整包名相匹配的子目录中。
(如com.horstmann.corejava包中的所有源文件应该放置在子目录 com/horstmann/corejava 中。编译器将类文件也放在相同的目录结构。)
编译器处理文件(带有文件分隔符和扩展名.java的文件),而java解释器加载类(带有.分隔符)。
必须将所有的类文件移到正确的位置,不然虚拟机找不到。
如果没有指定public和private,这个部分(类,方法或变量)可以被同一个包中的所有方法访问。
一定要注意给一些必须私有的变量加上private
null指针处理
在java中如果变量对应的是空指针,可能会引发程序停止的错误。
有以下方法可以用来捕获并且修正异常。
1 | static <T> void requireNonNULL(T obj); |
JAR文件
jar的语法和tar的类似
jar工具的位置在(jdk/bin)下
1 | jar cvf jarFileName file1 file2 |
清单文件
除了类文件,图像和其他资源外,每个JAR文件必须包含一个清单文件(manifest)
一般被命名为MANIFEST.MF
位于jar文件一个特殊的META-INF子目录。
一般包含很多条目,这些清单条目被分成多个节。第一节被称为主节(main section),作用于整个JAR文件。
随后的条目用来指定命名实体的属性,如单个文件,包或者URL。它们都必须以一个name条目开始。节与节之间用空行分开。
例如
1 | Manifest-version: 1.0 |
要想编辑清单文件,需要将希望添加到清单文件中的行放到文本文件中,然后运行:
1 | jar cfm jarFileName manifestFileName ... |
如果只是想更新已有的JAR的清单,则需要将增加的部分放置到一个文本文件中。
只要执行
1 | jar ufm MyArchive.jar manifest-additions.mf |
可执行的JAR文件
可以使用jar命令的e选项指定程序的入口点,即通常需要在调用java程序启动器时指定的类。
1 | jar cvfe MyProgram.jar com.mycompany.mypkg.MainAppClass <files to add> |
或者,在清单文件指定程序的主类
1 | Main-Class: com.mycompany.mypkg.MainAppClass |
不要为主类名添加扩展名.class
之后就可以通过
1 | java -jar Myprogram.jar |
多版本jar
即是可以包含面向不同java版本的类文件。
为了保证向后兼容
如果要增加不同版本的类文件,可以使用– release标志
1 | jar uf MyProgram.jar --release 9 Apllication.class |
从头构建一个多版本JAR文件。
1 | jar cf MyProgram.jar -C bin/8 . --release 9 -C bin/9 Application.class |
面对不同版本编译的时候,
1 | javac -d bin/8 --release 8 . . . |
应当注意的是
多版本jar针对的是不同java版本,并不适用不同版本的程序和库。对于不同的版本,所有类的公用api都是相同的。多版本的jar是针对不同jdk版本的。
类设计技巧
一定要保证数据私有,并且给给一些数据设置单独的访问器和修改器。
一定要自己对数据初始化
不要使用太多的基本类型
分解有过多职责的类
类名和方法名要规范,要一眼能看出它们的用途
优先使用不可改变的类。