一、引用类型
针对java的对象,我们操作的标识符实际上是“引用”,通过引用指向一个对象的地址,类似于C中的指针。我们通过标识符来对对象进行操作。
四种引用类型
java针对不同的引用类型有不同的垃圾回收方式。
1、强引用
java默认的声明方式就是强引用。只要引用还指向某个对象,该对象就不会被回收。
Object obj = new Object();//强引用
//如果需要让Object可以被回收,只需要:
obj = null;
手动将引用设置为“null”可以使对象能被回收。
2、软引用
java的软引用可以将对象设为可被清理状态,当JVM内存不足时,系统将会清理被标识为软引用的对象。
SoftReference<Object> ref = new SoftReference<>(obj);
可用ref.get()
来获取引用指向的对象。
3、弱引用
设置弱引用,只要JVM进行垃圾回收,则弱引用指向的对象无论内存剩余情况如何,都会被系统清理。
WeakReference<Object> ref = new WeakReference<>(obj);
4、虚引用
虚引用是最弱的一种引用,即使有弱引用指向,没有其他引用指向的对象仍然会被回收。
PhantomReference<Object> ref = new PhantomReference<>(obj);
instanceof 运算符
instanceof
是java保留字,用于测试它左边的对象书否是它右边类的实例。返回值是逻辑型。
String s = "String类是Object的子类";
boolean isObject = s instanceof Object;
//返回值是true
二、组合
组合是一种实现程序复用的手段,但不借助继承。相比继承,使用组合的方法进行代码复用能够保证更好的封装性。组合思想将要被复用的父类当做新类(子类)的组成部分,由新类直接调用父类的方法。
例子:
class father{
public void do(){
System.out.println("do sth..");
}
}
class child{
private father f;
public child(father a){
f = a; //将父类的对象引入
}
public void do(){
//重新定义一个do方法
f.do() //直接调用父类的方法
}
}
在上述例子中,新建child对象时需要传递一个father对象。
father f1 = new father();
child c1 = new child(f1);
三、初始化块
初始化与构造器类似,都在类中定义用于对对象进行初始化操作。
初始化块分为静态初始化块和非静态初始化块两种:
-
静态初始化块:
在初始化块之前加上
static
修饰符,只会在类装载到系统时执行一次。 -
非静态初始化块:
不加任何修饰符,在该类的每个对象生成时都会执行一次,且执行顺序在构造方法之前。
初始化块语法格式:
class test{
[修饰符] {
dosth();
}
}
初始化块没有命名,只有{ }
。
可以定义多个初始化块,运行顺序仅依据定义的先后。
四、包装类
java是面向对象的语言,但其包含的8种基本数据类型并不是标准的对象,不支持面向对象的编程机制。如果需要将基本数据类型转换为对应的按类编写的引用类型,从而可以像对象一样对其进行操作。
int i = 1;
Integer itObj = new Integer(i);
int i2 = itObj.intValue(); //取出int变量