基本数据类型

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
2
3
s.equals(t);
//return true or false;
s和t即可以是变量也可以是字面量

一定不要用==去判断,因为这个只能确定字符串是否在同一位置上。

string变量为””表示串长度和内容为空。

为null时意味着没有任何对象与该变量相关联。

StringBuilder和StringBuffer可以用append方法

可以用toString方法得到一个String对象

Console类

Console类可以处理密码

1
2
3
Console cons=System.console();
String username=cons.readLine("username");
char [] passwd =cons.readPassword("passwd");

Scanner 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
new Scanner(InputStream in);
//用给定的的输入流创造一个scanner对象
String netLine();
//读取下一行内容
String next();
//读取下一个单词,分割符是空格的那种
int nextInt();double nextDouble();
//////////////////////////////////////
//////////////////////////////////////
boolen hasNext<类型>();
//检测是否还有下一个表示此类型的字符串序列;
boolen hasNext();
//检测输入是否还有其他单词
Scanner in=new Scanner(Path.of("myfile.txt",standardCharsets.UTF_8));
//用文件作为输入流

大数

BigIntegerBigDecimal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BigInteger a=BigInteger.valueOf(100);
//for a very large number, you need convert String to BigInteger
BigInteger rea=new BigInteger("1145141919810");
//BigInteger can not be plused or multiplied directly,you should use its methlod
//because java can not reload the operator
BigInteger c=a.add(b);
BigInteger b=c.multiply(BigInteger.valueOf(2));
还有
subtract
divide
mod
sqrt
int compareTo();
//还有BigDecimal的divide如果结果是无限循环小数,就会抛出异常,就应该在第二个参数写上RoundingMode.HALF_UP or HALF_DOWN

数组

new出一个数组时,如果是对象数组则元素对应null值。

for each遍历

java数组也可以通过数组本身遍历

1
2
3
4
5
for(variable:collection) statement
///////////////////////////
for(int element:a)
System.out.println(element);
////element用来暂存

也可用System.out.Print(Arrays.toString(a));

拷贝

数组变量互相=赋值拷贝属于是两个引用共用一个数组

但是可以用copyOf方法

1
2
3
4
copyLuck=Arrays.copyOf(luck,luck.length);
//此方法也可以用来扩容
luck=Arrays.copyOf(luck,2*luck.length);
//数值型额外元素被赋值为0,boolen为false,如果较短则只拷贝前面的值。

sort方法

1
2
int []a=new int [1000];
Arrays.sort(a);

多维数组打印

1
System.out.Println(Arrays.deepToString);

如何分配一个长度不等的二维数组

1
2
3
4
5
6
7
8
9
10
11
12
int[][] odds=new int[NMAX][];
//相当于分配了一个包含NMAX个指针的数组
for(int n=0;n<NMAX;n++){
odds[n]=new int[n+1];
};
//类似于c++的
///////////////////////////////
double** balances=new double*[10];
for(int i=0;i<10;i++){
balances[i]=new double[6];
}
////在java中上述数组是自动分配的,除非你要求不等。

运算符

java中不存在重载操作符这一操作!!!!

特殊的break

代替goto的break;(带标签的break)

1
2
3
4
5
6
label:
{{
if(condition)
break label;
}}
//jump here after break;

带标签的contiune同理

对象和类

java事一门把封装继承当祖师爷的语言

java的对象变量并不是等于一个对象,它只是一个引用。

//c++没有null引用,引用也不能赋值。

java中的对象都放在堆上,而且会自动回收内存

文件名必须与public类的名字相同。同一个文件中,只能有一个public类,非公有类可以有很多。

关于返回对象的属性

不要编写返回可变对象的访问器方法,这一点和c++很像。

如果需要返回一个可变对象的引用,首先做的是克隆。

final字段

类似于const,必须在构造对象时初始化。

所有类型都加上final,这样的类就是不可变类。

如果可变的类需要用final

可以考虑用

1
2
3
4
private final StringBuilder evalutaions;
evalutions=new StringBuilder();
//使得存储在evaluations变量中的对象引用不会再指示另一个不同的StringBuilder对象。
//但它自身可以修改

编译程序的细节

1
2
3
4
5
////method one
javac Employee*.java//使用通配符
////two
javac <带main方法的文件>
//////第二种情况会在使用其他类时编译,并且能在其更新时自动重新编译

相当于自带了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
2
3
class Employee{
private String name="hua";
}

初始值未必是常量,“=”号可以加返回值每次变化的函数。

  • 如果构造器的第一个语句形如this(…),这个构造器直接调用另一个同类构造器。

    初始化块

    使用初始化块之后,首先运行初始化块,然后才运行构造器的主体部分。

    静态量需要加一个static。

每一个包都是独立的类集合。

一个包可以使用所属包中的所有类,以及其他包中的公共类。

使用另一个包的公共类

1
2
3
4
##包名后面跟着类名(use fully qualified name)
java.time.LocalDate today = java.time.LocalDate.now();
##import methlod
不必多说

在包中增加类

源文件必须放到与完整包名相匹配的子目录中。

(如com.horstmann.corejava包中的所有源文件应该放置在子目录 com/horstmann/corejava 中。编译器将类文件也放在相同的目录结构。)

编译器处理文件(带有文件分隔符和扩展名.java的文件),而java解释器加载类(带有.分隔符)。

必须将所有的类文件移到正确的位置,不然虚拟机找不到。

如果没有指定public和private,这个部分(类,方法或变量)可以被同一个包中的所有方法访问。

一定要注意给一些必须私有的变量加上private

null指针处理

在java中如果变量对应的是空指针,可能会引发程序停止的错误。

有以下方法可以用来捕获并且修正异常。

1
2
3
4
5
6
7
static <T> void requireNonNULL(T obj);
static <T> void requireNonNULL(T obj,String message);
static <T> void requireNonNULL(T obj,Supplier<String> messageSupplier);
//如果opj为null,这些方法会抛出一个NULLPointerException异常而没有消息或者给定的消息。
static <T> void requireNonNULLElse(T obj,T defaultObj);
static <T> void requireNonNULLElseGet(T obj,Supplier<String> messageSupplier);
//如果obj不为null则返回obj,如果为null则返回指定对象。

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
2
3
4
5
6
Manifest-version: 1.0
##描述这个文件包的
Name: Woozle.class
##描述这个文件的
Name: com/mycompany/mypkg/
##描述这个包的

要想编辑清单文件,需要将希望添加到清单文件中的行放到文本文件中,然后运行:

1
2
3
jar cfm jarFileName manifestFileName ...
eg
jar cfm MyArchive.jar manifest.mf com/mycompany/mypkg/*.class

如果只是想更新已有的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
2
jar uf MyProgram.jar --release 9 Apllication.class
#给java9添加application

从头构建一个多版本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版本的。

类设计技巧

  • 一定要保证数据私有,并且给给一些数据设置单独的访问器和修改器。

  • 一定要自己对数据初始化

  • 不要使用太多的基本类型

  • 分解有过多职责的类

  • 类名和方法名要规范,要一眼能看出它们的用途

  • 优先使用不可改变的类。