# 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变量
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.mcyou.cc/java-xiang-guan/java-mian-xiang-dui-xiang-jian-yao-zong-jie-san.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
