# java面向对象简要总结 三

***

## 一、引用类型

针对java的对象，我们操作的标识符实际上是“引用”，通过引用指向一个对象的地址，类似于C中的指针。我们通过标识符来对对象进行操作。

### 四种引用类型

java针对不同的引用类型有不同的垃圾回收方式。

### 1、强引用

java默认的声明方式就是强引用。只要引用还指向某个对象，该对象就不会被回收。

```java
Object obj = new Object();//强引用
//如果需要让Object可以被回收，只需要：
obj = null;
```

手动将引用设置为“null”可以使对象能被回收。

### 2、软引用

java的软引用可以将对象设为可被清理状态，当JVM内存不足时，系统将会清理被标识为软引用的对象。

```java
SoftReference<Object> ref = new SoftReference<>(obj);
```

可用`ref.get()`来获取引用指向的对象。

### 3、弱引用

设置弱引用，只要JVM进行垃圾回收，则弱引用指向的对象无论内存剩余情况如何，都会被系统清理。

```java
WeakReference<Object> ref = new WeakReference<>(obj);
```

### 4、虚引用

虚引用是最弱的一种引用，即使有弱引用指向，没有其他引用指向的对象仍然会被回收。

```java
PhantomReference<Object> ref = new PhantomReference<>(obj);
```

### instanceof 运算符

`instanceof`是java保留字，用于测试它左边的对象书否是它右边类的实例。返回值是逻辑型。

```java
String s = "String类是Object的子类";
boolean isObject = s instanceof Object;
//返回值是true
```

## 二、组合

组合是一种实现程序复用的手段，但不借助继承。相比继承，使用组合的方法进行代码复用能够保证更好的封装性。组合思想将要被复用的父类当做新类（子类）的组成部分，由新类直接调用父类的方法。

例子：

```java
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对象。

```java
father f1 = new father();
child c1 = new child(f1);
```

## 三、初始化块

初始化与构造器类似，都在类中定义用于对对象进行初始化操作。

初始化块分为静态初始化块和非静态初始化块两种：

* 静态初始化块：

  在初始化块之前加上`static`修饰符，只会在类装载到系统时执行一次。
* 非静态初始化块：

  不加任何修饰符，在该类的每个对象生成时都会执行一次，且执行顺序在构造方法之前。

初始化块语法格式：

```java
class test{
    [修饰符] {
    dosth();
	}
}
```

初始化块没有命名，只有`{ }`。

可以定义多个初始化块，运行顺序仅依据定义的先后。

## 四、包装类

java是面向对象的语言，但其包含的8种基本数据类型并不是标准的对象，不支持面向对象的编程机制。如果需要将基本数据类型转换为对应的按类编写的引用类型，从而可以像对象一样对其进行操作。

```java
int i = 1;
Integer itObj = new Integer(i);
int i2 = itObj.intValue(); //取出int变量
```
