一、Object类
java.lang.Object类是Java语言中类层次结构的根类,也就是说任何一个类都是该类的直接或者间接子类
- 如果定义一个Java类时没有使用extends关键字声明其父类,则其父类为 java.lang.Object 类。
- Object类定义了“对象”的基本行为, 被子类默认继承。
- object源码中没有成员变量,只有成员方法,包括 equals() / toString() / getClass() /hashCode() / clone() / finalize() / wait() / notify() / notifyAll()
- Object类只声明了一个空参的构造器
1. equals()方法
public boolean equals(Object obj) {
return (this == obj);
}
- equals方法
- equals()是一个方法,而非运算符,只能适用于引用数据类型
- Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
- 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同
- ==运算符
- ==是一个运算符,可以用于基本数据类型和引用数据类型变量中
- 通常情况下,我们自定义的类如果使用equals()要比较两个对象的"实体内容"是否相同,需要对Object类中的equals()进行重写
- == 符号使用时,必须保证符号左右两边的变量类型一致
- ==如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同,如char可以与int类型比较)
- ==如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
2. toString()
- 当输出一个对象引用时,实际上是调用当前对象的toString()
- String/Date/File/包装类都重写了Object的toString()方法,返回实体内容
- 自定义类也可以重写toString()方法,当调用此方法时,返回对象的"实体内容"
//Object类中toString()的定义
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
二、包装类(Wrapper)
通常情况下基本数据类型的变量不是对象,为了满足万物皆对象的理念就需要对基本数据类型的变量进行打包封装处理变成对象,而负责将这些变量声明为成员变量进行对象化处理的相关类,叫做包装类
- Integer类
java.lang.Integer类内部包装了一个int类型的变量作为成员变量,主要用于实现对int类型的包装并提供int类型到String类之间的转换等方法
- 常用的常量
- 常用的方法
- java5 加入自动装箱机制,将-128到127之间的整数已经装箱完毕,当程序中使用该范围之间的整数时,无需装箱直接取用自动装箱池中的对象即可,从而提高效率
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* jdk.internal.misc.VM class.
*/
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[]; //自动装箱范围-128~127
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
2. Double
- 常用的常量
- 常用的方法
3. Boolean
- 常用的常量
- 常用的方法
4. Character
- 常用的常量
- 常用的方法
总结:
- 基本数据类型转换为对应包装类的方式调用包装类的构造方法或静态方法即可
- 获取包装类对象中基本数据类型变量数值的方式调用包装类中的xxxValue方法即可
- 字符串转换为基本数据类型的方式调用包装类中的parseXxx方法即可
三、单元测试
Java中的JUnit单元测试步骤:
- 选中当前工程 - 右键选择:build path - add libraries - JUnit 4 - 下一步
- 创建Java类,进行单元测试。此时的Java类要求:① 此类是public的 ②此类提供公共的无参的构造器此类中
- 声明单元测试方法。此时的单元测试方法:方法的权限是public,没有返回值,没有形参此单元测试方法上需要声明注解:@Test,并在单元测试类中导入:import org.junit.Test;
- 声明好单元测试方法以后,就可以在方法体内测试相关的代码。左键双击单元测试方法名,右键:run as - JUnit Test
- 如果执行结果没有任何异常:绿条
- 如果执行结果出现异常:红条
四、垃圾回收机制
- 垃圾回收机制只回收JVM堆内存里的对象空间。对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力
- 现在的JVM有多种垃圾回收实现算法,表现各异。
- 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。
- 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。
程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定。
垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象),不要人为的主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。
五、对象之间的关系
- 依赖关系
对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。
class A{
public B method(C c,D d){
E e = new E();
...
B b = new B();
...
return b;
}
}
这里A依赖了BCDE类
- 关联关系(Association)
对象之间一种引用关系,比如客户类与订单类之间的关系。这种关系通常使用类的属性表达。关联可以有方向,即导航。一般导航是双向的,不需要在线上标出箭头。
class Employee{
private int eid;//员工编号
private String name;//员工姓名
private Computer coumputer;//员工所使用的电脑
//....
}
class Computer{
}
- 聚合关系
表示 has-a 的关系。与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。
- 组合关系
对象 A 包含对象 B,对象 B 离开对象 A 没有实际意义。是一种更强的关联关系。人包含手,手离开人的躯体就失去了它应有的作用,表示 contains-a 的关系,是一种强烈的包含关系。组合类负责被组合类的生命周期。也使用属性表达组合关系,是关联关系的一种,是比聚合关系强的关系。
- 继承关系
类与类的继承关系,类与接口的实现关系
六、native关键字
使用 native 关键字说明这个方法是原生函数,也就是这个方法是用 C/C++等非Java 语言实现的,并且被编译成了 DLL,由 java 去调用
- 用于java 应用需要与 java 外面的环境交互 ,本地方法提供了一个非常简洁的接口,无需去了解 java 应用之外的繁琐的细节
- native 声明的方法,对于调用者,可以当做和其他 Java 方法一样使用,一个 native method 方法可以返回任何 java 类型,包括非基本类型,而且同样可以进行异常控制。
- native method 的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。 JVM 将控制调用本地方法的所有细节。
- 如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用 java语言重写这个方法(如果需要的话)。