### 概念
將類寫在其他類的內部,可以寫在其他類的成員位置和局部位置,這時寫在其他類內部的類就稱為內部類。其他類也稱為外部類。
~~~
public class Outer {
public class Inner{
}
}
~~~
### 使用場景
在描述事物時,若一個事物內部還包含其他可能包含的事物,比如在描述汽車時,汽車中還包含這發動機,這時發動機就可以使用內部類來描述。
### 分類
1. 成員內部類 .
2. 局部內部類 .
### 使用方法
1. 可以使用成員修飾符 .
2. 也可以繼承,也可以實現接口 .
3. 外部類要使用內部類必須建立內部對象 (內部類不能有靜態成員).
~~~
外部類名.內部類名 變量名 = new 外部類名().new 內部類名()
~~~
### 成員內部類的同名變量調用
代碼如下
~~~
public class Outer {
public int x = 1;
public class Inner{
public int x = 2;
public void show()
{
int x = 3;
System.out.print(x);
}
}
}
~~~
如何訪問三個同名變量呢 ? 從里向外依次為 :
~~~
System.out.print(x); //3
~~~
~~~
System.out.print(this.x); //2
~~~
~~~
System.out.print(Outer.this.x); //1
~~~
### 局部內部類
調用 :
~~~
public class Outer {
public void show()
{
class Inner {
public void show()
{
System.out.print("內部類");
}
}
Inner in = new Inner(); //必須要在內部方法中new 內部類,然后使用內部類的成員進行調用 .
in.show();
}
}
~~~
### 匿名內部類
內部類是為了應對更為復雜的類間關系。查看源代碼中會涉及到,而在日常業務中很難遇到,這里不做贅述。
最常用到的內部類就是匿名內部類,它是局部內部類的一種。
定義的匿名內部類有兩個含義:
1. 臨時定義某一指定類型的子類 .
2. 定義后即刻創建剛剛定義的這個子類的對象 .
## 匿名內部類
1. 是一種特殊的語法,用來快速創建抽象類的子類對象.
## 不用匿名內部類
1. 創建子類.繼承抽象類.
2. 重寫抽象類中的所有抽象方法.
3. new 子類.
## 匿名內部類快速創建抽象類子類
注意,這里創建的不是AbstractAnimal的對象,而是AbstractAnimal子類的對象.
~~~
public abstract class AbstractAnimal
{
public abstract void eat();
public abstract void sleep();
}
~~~
第一種方式
~~~
new AbstractAnimal() {
@Override
public void eat()
{
}
@Override
public void sleep()
{
}
};
~~~
第二種方式
~~~
new AbstractAnimal()
{
@Override
public void eat()
{
System.out.println("子類吃");
}
@Override
public void sleep()
{
System.out.println("子類睡");
}
}.eat(); //直接調用.
~~~
第三種(常用)
~~~
AbstractAnimal animal = new AbstractAnimal() //因為不知道子類類型,所以用父類類型指向子類對象,這里運用了多態.
{
@Override
public void eat()
{
System.out.println("子類吃");
}
@Override
public void sleep()
{
System.out.println("子類睡");
}
};
animal.eat();
animal.sleep();
~~~
## 匿名內部類快速創建接口的實現類對象
~~~
public interface Girl
{
void cook();
void kiss();
}
~~~
~~~
Girl g = new Girl() //因為不知道實現類的類型,所以用接口的類型.
{
@Override
public void cook()
{
System.out.println("炒菜");
}
@Override
public void kiss()
{
System.out.println("親吻");
}
};
g.cook();
g.kiss();
~~~
### 匿名內部類作用
匿名內部類 , 簡化問題 . 定義實現類,重寫接口或者抽象類方法 ,建立實現類對象, 合為一步完成 .
**使用前提**: 必須要實現一個接口或者繼承一個抽象類, 且只能寫在方法中 .
語法 :
假設有一個接口Parent
~~~
public class Test {
public static void main(String[] args)
{
Parent p = new Parent() {
@Override
public void show()
{
System.out.print("匿名內部類");
}
};
p.show();
}
}
~~~
或者
~~~
new Parent() {
//@Override
public void show()
{
System.out.print("匿名內部類");
}
}.show();
~~~
結果
~~~
匿名內部類
~~~
- 環境
- Java基礎
- 數據類型
- 基本類型
- 引用類型
- Array
- Class
- ArrayList
- 流程控制
- ASCII碼表
- 面向對象
- 概述
- 變量
- this
- 修飾符
- 封裝
- 繼承
- final
- static
- 接口
- 接口
- 抽象類
- overload
- 接口和抽象類區別
- 案例
- 多態
- 構造方法
- super
- 匿名對象
- 內部類
- 靜態導入
- 包的聲明和訪問
- 代碼塊
- 代理設計模式
- 靜態代碼塊
- Object類
- lambda表達式
- 枚舉
- 定義枚舉
- 常用方法
- 枚舉常量
- 異常
- 可變參數
- Properties
- 概述
- Properties和持久化有關的方法
- 反射
- 類加載器
- 概述
- Class類
- 獲取構造方法并運行
- 獲取成員變量并改值
- 獲取成員方法并運行
- 反射泛型擦除
- 反射通過配置文件運行
- 常用 API
- Date類
- DateFormat類
- Calendar類
- Math類
- String類
- object類
- System類
- 正則表達式
- BigInteger類
- BigDecimal類
- Arrays工具類
- StringBuffer類
- 基本類型包裝類
- 自動裝箱和自動拆箱
- 框架集合
- collection接口
- 概述
- 接口方法
- 迭代器
- 迭代器并發異常
- 增強for循環
- 泛型
- hashCode和equals
- List接口
- 概述
- ArrayList
- LinkedList
- vector
- Set接口
- 概述
- 對象的哈希值
- HashSet
- LinkedHashSet
- 保證自定義元素的唯一性(重寫)
- ArrayList和HashSet的contains原理
- Map接口
- 概述
- Map集合常用方法
- 迭代Map
- Map存儲自定義類型
- HashMap
- LinkedHashMap
- Hashtable
- 嵌套Map遍歷
- 方法的可變參數
- collections工具類
- 集合嵌套
- 集合特點總結
- Collection集合工具類
- Arrays工具類
- File類
- 概述
- 獲取方法
- 創建和刪除
- 判斷方法
- 其他方法
- 文件過濾器
- IO流
- 字節流
- 概述
- 字節流
- 字節流復制文件
- 字節緩沖流
- 復制單級文件夾
- 使用字節流讀取中文的亂碼問題
- 字符編碼表
- 方便程序員的IO流
- 轉換流
- 概述
- OutputStreamWriter類
- InputStreamWriter類
- 轉換流和其他子類的區別
- 序列化流
- 概述
- 序列化接口以及版本號問題
- transient
- 打印流
- 多線程
- 概述
- main線程介紹
- 開啟線程方式一:Thread類
- 開啟線程方式二:Runnable類
- 線程的執行原理
- 使用哪種方式好
- 使用匿名內部類創建線程
- 線程安全
- ThreadLocal
- 網絡編程
- XML
- 概述
- 語法
- 元素標簽
- 屬性
- 轉義字符
- CDATA區
- XML約束
- DTD約束
- 三種引入DTD的方式
- DTD語法
- Schema約束
- JDBC
- 概述
- JDBC原理
- JDBC查詢操作
- JDBCUtils
- 預處理對象
- JDBC連接池
- 概述
- DBCP
- C3P0
- DBUtils操作
- ArrayHandler
- ArrayListHandler
- BeanHandler
- BeanListHandler
- ColumnListHandler
- MapHandler
- MapListHandler
- ScalarHandler
- 事務
- 事務概述
- 原生JDBC完成轉賬
- DBUtils完成轉賬
- 事務特性
- 三層思想
- 概述
- JavaWEB
- tomcat
- servlet
- 概述
- 映射servlet
- Servlet接口
- HttpServlet類
- load-on-startup
- servletContext
- ServletRequest
- ServletResponse
- Cooike&Session
- servlet三大域對象
- JSP
- 概述
- jsp內置對象
- 指令
- page
- include
- taglib
- JSP中的四個域對象
- jsp的一個動作標簽
- EL表達式
- 概述
- 獲取域中數據
- 執行運算
- el表達式中的內置對象
- jsti標簽
- 概念
- jstl分類
- Filter過濾器
- 概述
- 生命周期
- url-pattern配置
- filter的chain過濾鏈
- filter-mapping子標簽
- 全局統一錯誤頁面
- filterConfig
- 自動登錄實例
- 全局統一編碼
- Listener監聽器
- 概念
- 監聽器分類
- 監聽三個對象的創建和銷毀
- 監聽三個對象屬性的變化
- 監聽javabean在session中的狀態變化
- 定時器
- 概念
- calendar日歷
- 郵件
- 概述
- JSON
- 數據結構
- 堆棧結構
- 隊列結構
- 數組結構
- 鏈表結構
- 基礎加強
- 面試題:增強一個對象的方法有幾種方式?
- 裝飾者增強
- 動態代理
- 動態代理
- 動態代理細節
- 使用動態代理解決字符集編碼
- 注解
- 概述
- 擴展的自定義注解
- 類加載器
- 全盤負責托管機制
- 開發模式
- 問題
- lambda
- 函數式編程思想概述
- String字符串