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