wordpress 附件自定義南京百度快速排名優(yōu)化
方法重載
請記住下面重載的條件
- 方法名稱必須相同。
- 參數(shù)列表必須不同(個數(shù)不同、或類型不同、參數(shù)類型排列順序不同等)。
- 方法的返回類型可以相同也可以不相同。
- 僅僅返回類型不同不足以成為方法的重載。
- 重載是發(fā)生在編譯時的,因為編譯器可以根據(jù)參數(shù)的類型來選擇使用哪個方法。
方法的重寫
- 重寫的方法必須要和父類保持一致,包括返回值類型,方法名,參數(shù)列表也都一樣。
- 重寫的方法可以使用 @Override 注解來標識
- 子類中重寫方法的訪問權(quán)限不能低于父類中方法的訪問權(quán)限。
This關(guān)鍵字
這段代碼比較精妙,精妙在哪呢,我一個 eatApple0方法竟然可以調(diào)用多次,你在后面還可以繼續(xù)調(diào)
用,這就很神奇了,為啥呢? 其實就是 this 在作票了,我在 eatApple 方法中加了一個 return
this 的返回值,也就是說哪個對象調(diào)用 eatApple 方法都能返回對象的自身。
main 方法中傳遞了一個 int 值為 10 的參數(shù),它表示的就是蘋果的數(shù)量,并把這個數(shù)量賦給了 num 全局變量。所以 num 的值現(xiàn)在就是 10。
你會發(fā)現(xiàn)上面這段代碼使用的不是this,而是this(參數(shù))。它相當于調(diào)用了其他構(gòu)造方法,然后傳遞參數(shù)進去。這里注意一點:this0必須放在構(gòu)造方法的第一行,否則編譯不通過
public Apple(int num)
:
-
- 這個構(gòu)造方法接收一個整數(shù)參數(shù)
num
,表示蘋果的數(shù)量。 - 它調(diào)用了另一個構(gòu)造方法
Apple(int num, String color)
,并傳入了num
和一個固定的字符串"紅色 "
作為參數(shù)。 - 這里的
this(num, "紅色 ")
表示調(diào)用Apple(int num, String color)
構(gòu)造方法,其中this
指的是當前正在創(chuàng)建的對象。
- 這個構(gòu)造方法接收一個整數(shù)參數(shù)
public Apple(String color)
:
-
- 這個構(gòu)造方法接收一個字符串參數(shù)
color
,表示蘋果的顏色。 - 它調(diào)用了另一個構(gòu)造方法
Apple(int num, String color)
,并傳入了默認數(shù)量1
和color
作為參數(shù)。 - 這里的
this(1, color)
表示調(diào)用Apple(int num, String color)
構(gòu)造方法,其中this
指的是當前正在創(chuàng)建的對象。
- 這個構(gòu)造方法接收一個字符串參數(shù)
public Apple(int num, String color)
:
-
- 這個構(gòu)造方法接收兩個參數(shù):一個整數(shù)
num
和一個字符串color
。 - 在這個構(gòu)造方法中,
this
關(guān)鍵字被用來給成員變量num
和color
分別賦值為傳入的參數(shù)num
和color
。 - 這里的
this.num = num;
和this.color = color;
中的this
指的是當前正在創(chuàng)建的對象,而num
和color
是傳入構(gòu)造方法的參數(shù)。
- 這個構(gòu)造方法接收兩個參數(shù):一個整數(shù)
Apple myApple = new Apple(5);
會創(chuàng)建一個數(shù)量為 5、顏色為紅色的蘋果。Apple myGreenApple = new Apple("綠色");
會創(chuàng)建一個數(shù)量為 1、顏色為綠色的蘋果。Apple myApples = new Apple(10, "黃色");
會直接創(chuàng)建一個數(shù)量為 10、顏色為黃色的蘋果。
繼承
繼承的關(guān)鍵字是extends
多態(tài)
多態(tài)指的是同一個行為具有多個不同表現(xiàn)形式。是指一個類實例(對象)的相同方法在不同情形下具有不同表現(xiàn)形式。封裝和繼承是多態(tài)的基礎(chǔ),也就是說,多態(tài)只是一種表現(xiàn)形式而已。
多態(tài)的實現(xiàn)具有三種充要條件
- 繼承
- 重寫父類方法
- 父類引用指向子類對象
你可以發(fā)現(xiàn) main 方法中有一個很神奇的地方, Fruit fruit = new Apple( ) , Fruit 類型的對象
竟然指向了 Apple 對象的引用,這其實就是多態(tài) ->父類引l用指向子類對象,因為 Apple 繼承于
Fruit,并且重寫了 eat 方法,所以能夠表現(xiàn)出來多種狀態(tài)的形式。
static關(guān)鍵字
final關(guān)鍵字
接口
interface
抽象類
abstract
異常
常見的Exception
RuntimeException 和 CheckedException
與 Exception 有關(guān)的 Java 關(guān)鍵字
throws 和 throw
try 、 finally 、 catch
集合
Iterable接口
頂層接口
ArrayList
Vector
Vector 同 ArrayList 一樣,都是基于數(shù)組實現(xiàn)的,只不過 Vector 是一個線程安全的容器, 它對內(nèi)部的每
個方法都簡單粗暴的上鎖,避免多線程引起的安全性問題,但是通常這種同步方式需要的開銷比較大,
因此,訪問元素的效率要遠遠低于 ArrayList。
還有一點在于擴容上,ArrayList 擴容后的數(shù)組長度會增加 50%,而 Vector 的擴容長度后數(shù)組會增加一
倍。
LinkedList
雙向鏈表
Stack
堆棧
HashSet
TreeSet
LinkedHashSet
Map類
Collections類
Collections 不屬于 Java 框架繼承樹上的內(nèi)容,它屬于單獨的分支, Collections 是一個包裝類,它的作
用就是為集合框架提供某些功能實現(xiàn),此類只包括靜態(tài)方法操作或者返回 collections。
匯總圖
泛型
泛型其實就是一種參數(shù)化的集合,它限制了你添加進集合的類型。泛型的本質(zhì)就是一種參數(shù)化類型。多
態(tài)也可以看作是泛型的機制。一個類繼承了父類,那么就能通過它的父類找到對應(yīng)的子類,但是不能通
過其他類來找到具體要找的這個類。泛型的設(shè)計之處就是希望對象或方法具有最廣泛的表達能力。
類、接口、方法、通配符
泛型方法的使用
泛型接口的使用
問題:接口中方法不是不能有方法體嗎,為什么max有
從 Java 8 開始,引入了兩種特殊類型的接口方法,它們可以包含方法體:
- 默認方法 (
default
方法):這些方法允許為接口方法提供默認實現(xiàn)。默認方法在接口中定義,并使用default
關(guān)鍵字標記。 - 靜態(tài)方法 (
static
方法):這些方法允許在接口中定義靜態(tài)方法,它們的行為類似于類中的靜態(tài)方法,而不是對象的方法。
泛型通配符
反射
Java 反射機制是在程序的運行過程中,對于任何一個類,都能夠知道它的所有屬性和方法;對于任意
一個對象,都能夠知道調(diào)用它的任意屬性和方法,這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為
java語言的反射機制。
反射舉例解釋一下
枚舉
values() 方法顯示順序的值。
IO
File類
IO類
注解
AOP
AOP(Aspect-Oriented Programming,面向切面編程)是一種編程范式,它旨在通過分離橫切關(guān)注點(cross-cutting concerns)來提高代碼的模塊化程度。AOP 允許開發(fā)者將與業(yè)務(wù)邏輯無關(guān)的功能(如日志記錄、事務(wù)管理、權(quán)限控制等)從業(yè)務(wù)邏輯中解耦出來,封裝成獨立的組件。
AOP 的核心概念
- 切面(Aspect):封裝了橫切關(guān)注點的模塊。例如,日志記錄或事務(wù)管理等。
- 連接點(Join Point):程序執(zhí)行過程中的特定點,如方法調(diào)用或異常拋出等。
- 通知(Advice):在特定連接點上執(zhí)行的動作。通知可以是前置通知(before)、后置通知(after)、環(huán)繞通知(around)等。
- 切入點(Pointcut):匹配連接點的表達式,用來指定哪些連接點應(yīng)應(yīng)用通知。
- 目標對象(Target Object):被通知的對象。
- 代理(Proxy):由 AOP 框架創(chuàng)建的對象,用來攔截目標對象的方法調(diào)用,并插入通知。
AOP 的使用場景
- 日志記錄:在方法開始和結(jié)束時記錄日志。
- 性能監(jiān)控:測量方法執(zhí)行的時間。
- 事務(wù)管理:自動管理事務(wù)邊界。
- 權(quán)限驗證:在方法調(diào)用前進行權(quán)限檢查。
- 緩存管理:自動緩存方法結(jié)果。
AOP 的實現(xiàn)方式
AOP 可以通過多種方式實現(xiàn),包括但不限于:
- Spring AOP:Spring 框架提供的 AOP 支持,廣泛用于 Java 應(yīng)用程序中。
- AspectJ:一種強大的 AOP 框架,支持編譯時、加載時和運行時的織入。
Spring AOP 示例
以下是一個使用 Spring AOP 的簡單示例,展示了如何為一個服務(wù)類的方法添加日志記錄通知。
步驟 1: 創(chuàng)建一個切面類
創(chuàng)建一個切面類 LoggingAspect
,該類包含前置通知和后置通知。
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {@Around("execution(* com.example.service.*.*(..))")
11 public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {12 System.out.println("Before method: " + joinPoint.getSignature().getName());13 try {14 Object result = joinPoint.proceed();15 System.out.println("After method: " + joinPoint.getSignature().getName());16 return result;17 } catch (Throwable ex) {18 System.out.println("Error in method: " + joinPoint.getSignature().getName());19 throw ex;20 }21 }
22}
步驟 2: 創(chuàng)建一個服務(wù)類
創(chuàng)建一個服務(wù)類 Service
,該類包含一個方法。
java深色版本1import org.springframework.stereotype.Service;
2
3@Service
4public class Service {
5
6 public void doSomething() {
7 System.out.println("Doing something...");
8 }
9}
步驟 3: 配置 Spring
確保你的 Spring 配置正確啟用了 AOP 支持。
java深色版本1import org.springframework.context.annotation.Configuration;
2import org.springframework.context.annotation.EnableAspectJAutoProxy;
3
4@Configuration
5@EnableAspectJAutoProxy
6public class AppConfig {
7 // 配置類
8}
步驟 4: 使用服務(wù)類
在主類中使用 Service
類。
java深色版本1import org.springframework.beans.factory.annotation.Autowired;
2import org.springframework.boot.CommandLineRunner;
3import org.springframework.boot.SpringApplication;
4import org.springframework.boot.autoconfigure.SpringBootApplication;
5
6@SpringBootApplication
7public class Application implements CommandLineRunner {
8
9 @Autowired
10 private Service service;
11
12 public static void main(String[] args) {
13 SpringApplication.run(Application.class, args);
14 }
15
16 @Override
17 public void run(String... args) throws Exception {
18 service.doSomething();
19 }
20}
運行結(jié)果
當你運行這個應(yīng)用程序時,你會看到在 doSomething
方法調(diào)用前后都有日志輸出,這是因為切面中的通知被執(zhí)行了。
總結(jié)
AOP 是一種強大的工具,可以幫助開發(fā)者更好地組織和管理代碼中的橫切關(guān)注點。通過將這些關(guān)注點從業(yè)務(wù)邏輯中分離出來,可以提高代碼的可維護性和可擴展性。Spring AOP 是實現(xiàn) AOP 的一種流行方式,適用于大多數(shù)基于 Spring 的 Java 應(yīng)用程序。
例子
需求:統(tǒng)計各個業(yè)務(wù)層方法執(zhí)行耗時。
實現(xiàn)步驟:
- 導(dǎo)入依賴:在pom.xml中導(dǎo)入AOP的依賴
- 編寫AOP程序:針對于特定方法根據(jù)業(yè)務(wù)需要進行編程
為演示方便,可以自建新項目或?qū)胩峁┑?code>springboot-aop-quickstart項目工程
pom.xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
AOP程序:TimeAspect
@Component
@Aspect //當前類為切面類
@Slf4j
public class TimeAspect {@Around("execution(* com.itheima.service.*.*(..))") public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//記錄方法執(zhí)行開始時間long begin = System.currentTimeMillis();//執(zhí)行原始方法Object result = pjp.proceed();//記錄方法執(zhí)行結(jié)束時間long end = System.currentTimeMillis();//計算方法執(zhí)行耗時log.info(pjp.getSignature()+"執(zhí)行耗時: {}毫秒",end-begin);return result;}
}