基本类型 & 引用
-
对于一个给定的JVM, 所有引用的大小都相同, 不论他们引用什么对象
-
基本类型变量值就是这个变量值的二进制位, 引用变量值也是二进制位
-
一个类可以有任意多个 实例变量, 获取方法, 设置方法, 方法
只有设置方法能更新 实例变量
数学
生成随机数
// 返回 0 - 4之间的一个数
int randNum = (int)(Math.random() * 5);
Math.random() 方法返回0 - 1(不包括1) 之间的一个数, 注意强制转换
也可以用 java.util.Random的nextInt()方法, 这种不需要强转
Java API
“我怎么知道API里有什么?” – 成功的关键
- 对一个项目或库的整体组织有帮助, 不再是一大堆杂乱的类, 可以分组到特定功能的包中
- 包会提供一个命名作用域, 如果和其他人都创建了一个同名的类, 需要告诉JVM想使用的是哪个包的类
- 提供一层安全性, 使得只有同一个包中的其他类能访问那些代码
- import 可以让少敲代码, 只是为java提供类全名的方法 运行速度不会因此变慢,也不会膨胀
ArrayList
add(E, e)
将指定元素增加到列表末尾
remove(int index)
删除指定位置上的元素
remove(Object o)
删除指定元素的第一次出现
contains(Object o)
如果列表中还有指定元素, 返回true
indexOf(Object o)
返回元素的第一个索引 或者 -1
get(int index)
返回指定位置的元素
import java.util.ArrayList;
ArrayList <Egg> myList = new ArrayList<Egg>();
// 增
Egg egg1 = new Egg();
myList.add(egg1);
// 查
boolean isIn = myList.contains(egg1);
// 找
int idx = myList.indexOf(egg1);
// 删
myList.remove(egg1);
类
继承 & 多态
- 如果类B扩展类A => 类B是类A
- 编译器检查的是引用变量的类, 而不是引用指向的具体对象的类
- 如果没有显示扩展另一个类, 所有这样的类都隐含扩展了Object
class Object
{
boolean equals(); // 确认两个对象是否相等
Class getClass(); // 返回那个对象的类类型, 即他是从哪个类实例化得来的
int hashCode(); // 打印对象的一个散列码
String toString(); // 打印一个字符串, 包含这个类名+数字
}
接口(interface定义 implements实现) & 抽象类
- 如果不希望实例化一个类, 就用abstract标记抽象类
- 所有抽象方法必须在继承树种的第一个具体子类中实现
- 抽象方法没有方法体, 而且声明以一个分号结尾
- Java中的每个类要么是类Object的直接子类, 要么是他的间接子类
- 如果不做强制类型转换, Object类型的引用变量不能赋给任何其他引用类型
Dog d = (Dog) x.getObject(aDog);
- 不能多重继承, 会带来"致命的死亡菱形", 一个类只能有一个直接超类
构造器 & 垃圾回收
- 构造器: 调用new时所运行的代码
- 构造器没有返回值
public Duck{ System.out.println("Quack"); }
- 构造器不能继承
- 两个构造器不能有相同的参数列表(包括类型和顺序)
- super()语句必须放在第一行
- 每个构造器可以有一个super()或者this()调用
import java.awt.color; class Mini extends Car{ private Color color; // 无参数构造器提供一个默认的color, 并调用重载的实际构造器(调用super()的那个构造器) public Mini(){ this(Color.RED); } // 完成初始化对象具体工作(包括调用super())的实际构造器 public Mini(Color c){ super("Mini"); } // ERROR 不能同时有super()和this()因为他们都必须位于第一条语句 public Miini(int size){ this(Color.RED); super(size); } }
- “你的父母, 在你之前先到来”
一个对象的超类部分必须先完成构建, 之后新的子类对象才可能存在
8. 寿命
实例变量的寿命与他的对象相同
异常处理
- 异常 是一个Exception类型的对象
- 抛出异常的方法必须声明它可能抛出异常
- 如果要准备处理异常, 把调用包在一个try/catch中, 并把异常处理/恢复代码放在catch块中
- 如果无法从异常恢复, 至少使用printStackTrace()得到一个栈轨迹
- 编译器不该耐心RuntimeException类型的异常
- try成功 => catch块中的代码就不会运行, 转到finally块, 然后再运行方法的其余部分
try失败, 则try中其余代码不会运行, 转到catch块, catch块完成时, finally块开始运行, 然后再继续运行方法的其余部分
如果try/catch块中有一个return语句 => finally块还是会运行