## 接口
> 關鍵字: `interface`修飾
>
> 只負責聲明函數 ,不負責具體實現
> 接口中的所有定義其實都是抽象的,隱藏了`public abstract`
>
> 通過`Idea`編寫,可以看出`public abstract`是灰色的,可以默認不寫
~~~
?public interface UserService {
? ? ?
? ? ?// public abstract可以不寫
? ? ?public abstract void add(String username);
?}
~~~
> 接口都需要一個實現類 : `Impl`結尾進行命名
>
> 關鍵字:`implements`
>
> 實現了接口中的類,就需要重寫接口中的方法
>
> 可以實現偽多繼承
> 接口中定義常量
~~~
?// public static final可以隱藏
?public static final int AGE = 99;
~~~
**作用**
1. 約束
2. 定義一些方法,讓不同的人實現
3. `public abstract`修飾方法可以隱藏
4. `public static final`修飾常量可以隱藏
5. 接口不能被實例化,接口中沒有構造方法
6. `implements`可以實現多個接口
7. 必須要重寫接口中的方法!
## 內部類(奇葩。。。)
~~~
?public class Outer {
??
? ? ?private int id;
??
? ? ?public void out() {
? ? ? ? ?System.out.println("這是外部類的方法");
? ? }
??
? ? ?public class Innner {
? ? ? ? ?public void in() {
? ? ? ? ? ? ?System.out.println("這是內部類的方法");
? ? ? ? }
? ? }
?}
??
~~~
~~~
?// 實例化內部類的操作
?public static void main(String[] args) {
? ? ?// 外部類
? ? ?Outer outer = new Outer();
? ? ?
? ? ?// 內部類
? ? ?Outer.Inner inner = new outer.new Inner();
?}
~~~
> 匿名內部類
>
> 沒有名字初始化類,不用將實例保存到變量中
~~~
?public class Test {
? ? ?public static void main(String[] args) {
? ? ? ? ?new Apple().eat();
? ? ? ? ?
? ? ? ? ?UserService userService = new UserService() {
? ? ? ? ? ? ?@Override
? ? ? ? ? ? ?public void hello() {
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? }
? ? ? ? }
? ? }
?}
??
?class Apple {
? ? ?public void eat() {
? ? ? ? ?System.out.println("1");
? ? }
?}
??
?interface UserService {
? ? ?void hello();
?}
~~~
## 給憨憨寫的階乘的實現原理
> 一個數的階乘
>
> 當這個`數 = 1`的時候,算式為:`1 * (1 - 0) = 1`,所以1的階乘就是1
>
> 當這個`數 = 2`的時候,算式為:`2! = 2 * 1 = 2 * (2 - 1) = 2`,所以2的階乘就是
>
> 前2個數為特殊情況
>
> 假設這個數為`n`
>
> `n = 1` , `n! = 1 * (1 - 0)`
>
> `n = 2`,`n! = 2 * (2 - 1)`
>
> `n = 3`,`n! = 3 * (3 - 1) * (3 - 2)`
>
> `....等等等....`
>
> 由此引發出遞歸的思想
~~~
?public class Test {
? ? ?pulic static void main(String[] args) {
? ? ? ? ?System.out.println(5); // 120
? ? }
? ? ?
? ? ?public static int F(int n) {
? ? // 首先來處理2個特殊情況
? ? ? ? ?if (n == 1) {
? ? ? ? ? ? ?// 如果 n 和 1 相等,直接返回結果為1
? ? ? ? ? ? ?return 1;
? ? ? ? }
? ? ? ? ?if (n == 2) {
? ? ? ? ? ? ?// 如果n 和 2 相等,直接返回結果為2
? ? ? ? ? ? ?return 2;
? ? ? ? }
? ? ? ? ?
? ? ? ? ?if (n > 2) {
? ? ? ? ? ? ?return n * F(n - 1);
? ? ? ? }
? ? }
?}
~~~
> 上述還可以簡化為
~~~
?public class Test {
? ? ?pulic static void main(String[] args) {
? ? ? ? ?System.out.println(5); // 120
? ? }
? ? ?
? ? ?// 因為這是在java語言中,需要返回值,所以更改之后寫成這樣
? ? ?public static int f(int n) {
? ? ? ? ?if (n == 1) {
? ? ? ? ? ? ?return 1;
? ? ? ? } else if (n == 0) {
? ? ? ? ? ? ?return 1;
? ? ? ? } else {
? ? ? ? ? ? ?return n * f(n - 1);
? ? ? ? }
? ? }
?}
~~~
> 5代入的執行流程
>
> `n = 5`,第一個判斷不執行,`n`現在是`>=`2的,就執行`return n * F(n - 1);`,這就相當于小時候的數學的方程式代入感一樣,5代入,`5 * F(4)` , 這里的`F(4)`又是調用了一遍這個函數,`F(4) = 4 * F(3)`,依次下去,就會最終變成`5 * 4 * 3 * 2 * 1`;
- PHP獲取客戶端瀏覽器信息和版本
- PHP獲取客戶端操作系統信息
- 無限級分類
- git使用
- 權限檢測思路
- Vue學習
- 遇到的一些問題
- PHP的編碼思維和技巧
- mysql復習
- tp5
- ThinkPHP5.x 公共函數
- TP5登錄注冊
- TP5使用模板繼承
- ThinkPHP5.1 清除緩存
- thinkphp5實現安裝程序
- 安全
- tp中實現跨域代碼
- ThinkPHP5.1配合pjax實現菜單欄無刷新跳轉
- 獲取數據庫版本和數據庫大小
- 模型的基本CURD操作
- 商品spu
- 全局異常處理類
- ExceptionHandler
- BaseException
- PHP函數之error_reporting(E_ALL ^ E_NOTICE)詳細說明
- 微信小程序
- wx:for
- tp6
- 分離的一些模塊
- session開啟
- Spring
- 依賴注入
- 數據結構
- 二叉樹
- js獲取地址欄變量
- PHP設計模式
- 面向對象
- PHP1
- PHP性能優化
- Java學習
- static關鍵字
- 多態
- 接口、階乘
- 大佬給的面試題
- 訪問量為5000萬的博客系統設計
- PHP可變參數
- Nginx的配置案例
- 求數組中的最大值,并返回數組索引
- PHP面試方向
- PHP數組工具類ArrUtil
- 字符串工具類StrUtil
- PHP使用curl發送請求
- mysql
- PHP上傳base64圖片處理函數
- webstorm小程序常用配置
- 郵箱正則表達式
- leetcode mysql記錄
- 函數庫