基本概念
- 实例变量有默认值,局部变量没有默认值。
- JAVA中都是值的(拷贝)传递。
- 引用到对象的变量并不是对象的容器,而是类似指向对象的指针/地址。所有引用的大小都一样。
类与对象
- ArrayList&一般数组区别:
- 一般数组创建时确定大小、以索引存放、使用特殊语法[]
- ArrayList是参数化的 ArrayList
- final:
- final的变量代表你不能改变它的值。
- final的Method代表你不能覆盖这个方法
- final的类代表你不能继承它
- 方法的重载与多态无关,两个方法名称相同但参数不同。
- 抽象类代表类必须要被extent,抽象方法代表方法必须要被覆盖。抽象方法没有实体。必须实现所有的抽象方法。
- 编译器是根据引用类型(定义变量时指定的类型)判断哪个方法可以调用,而不是根据对象的实际类型。
- extent只能有1个,implement(接口)可以有多个。
- 一个类可以有多个构造函数,但参数必须不一样。
- 函数构造链:创建新对象时,所有继承下来的构造函数都会执行。
- 调用父类构造函数super().使用this()调用对象本身的其他构造函数。两者不能同时使用。
- 静态变量:所有实例都共享的,且只会在类第一次载入的时候初始化。
- 静态变量 == Python类变量, 非静态变量即实例变量。
- 静态变量会在该类的任何对象创建之前就完成初始化
- 静态变量会在该类的任何静态方法执行之前就初始化
- 常量:静态的final变量 (常量名应全大写)
变量
- 所有对象存活于可垃圾回收的堆(heap)中。
- 变量存活空间:
- 如果在方法体内定义的,这时候就是在栈上分配的
- 如果是类的成员变量,这时候就是在堆上分配的
- 如果是类的静态成员变量,在方法区(堆,各个线程共享的内存区域)上分配的
异常处理
- JAVA虚拟机只会从头开始往下找到第一个符合范围的异常处理块
- 可以抛出多重异常
1
public void function name () throw PantException, LionException{}
序列化与反序列化
序列化保存对象的状态
1
2
3
4FileOutputStream fileStream = new FileOutputStream (“TEST.ser”);
ObjectOutputStream os = new ObjectOutputStream(fileStream);
os.writeObject(characterOne);
os.close();反序列化
1
2
3
4FileInputStream fileStream = new FileInputStream(“TEST.ser”);
ObjectInputStream os = new ObjectInputStream(fileStream);
Object one = os.readObject();
GameChara one = (GameChara) one;类如果可序列化,必须implements Serializable。如果某实例变量不应该被序列化,定义为transient。
网络编程
- 网络 java.net
建立socket
1
2
3
4Socket s = new Socket(’127.0.0.0’,8888);
InputStream steam = new InputStream(s.getInputStream());
BufferReader reader = new BufferReader(stream);
String msg = reader.readLine();建立socket Server
1
2ServerSocket ser = new ServerSocket(8888)
Socket s = ser.accept()线程Thread 需要一个实现Runnable接口的类,类需要实现run()方法
- 线程命名 setName()
- synchronized修饰方法使其每次只能被一个线程存取。锁是在对象上。没有处理死锁机制。
集合
- 集合
- TreeSet:有序防重复
- HashMap
- LinkedList:针对经常插入删除
- HashSet
- LinkedHaskMap:记住元素插入顺序
泛型
泛型的类代表类的声明用到类型函数,泛型的方法代表方法的声明特征用到类型函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class GenericTest {
// 这个类是个泛型类
public class Generic<T>{
private T key;
public Generic(T key) {
this.key = key;
}
}
// 这是一个泛型方法。
// 首先在public与返回值之间的<T>必不可少,这表明这是一个泛型方法,并且声明了一个泛型T
// 这个T可以出现在这个泛型方法的任意位置.
// 泛型的数量也可以为任意多个
public <T,K> K showKeyName(Generic<T> container){
...
}
}- 相等
- 引用的相等性 ==
- 对象的相等性 equals() ,必须要覆盖hashCode()方法保证两个对象有相同的hashcode
- TreeSet集合中的元素必须实现comparable类型,或者使用重载,取用comparator参数构造函数创建TreeSet
万用字符 <?>
1
2
3public void takeThing(ArrayList<? extent Animal> list)
// 相当于
public <T extent Animal> void takeThing (ArrayList<T> list)<> 使编译器验证类型安全,不用到运行时才去验证
参考:
《Head First JAVA》
重学Java-一个Java对象到底占多少内存