Java面向?qū)ο蟪绦蛟O(shè)計(jì)(微課視頻)第一章到第六章主要知識(shí)點(diǎn)總結(jié)

本文章知識(shí)點(diǎn)為蔡豪輝所總結(jié),若有錯(cuò)誤請指正

第一章:初識(shí)JAVA與面向?qū)ο蟪绦?/b>

一、Java簡介

Java是一種高級(jí)編程語言,最初由Sun Microsystems的James Gosling等人于1995年開發(fā),最初被稱為Oak,由于Oak名字已經(jīng)被注冊,最終改名為Java。Java語言的設(shè)計(jì)目標(biāo)是“一次編寫,到處運(yùn)行”,這使得它在跨平臺(tái)應(yīng)用中非常受歡迎。Java語言具有簡單性、面向?qū)ο?、分布式、健壯性、安全性、體系結(jié)構(gòu)中立、可移植性、高性能、多線程和動(dòng)態(tài)性等特點(diǎn),這些特點(diǎn)使得Java成為開發(fā)企業(yè)級(jí)應(yīng)用的理想選擇。Java的跨平臺(tái)特性主要得益于JVM(Java Virtual Machine),JVM是一個(gè)虛擬機(jī),可以在不同的操作系統(tǒng)上運(yùn)行。Java代碼首先被編譯成字節(jié)碼,然后由JVM解釋執(zhí)行,這種方式使得Java代碼可以在任何支持JVM的平臺(tái)上運(yùn)行。

二、面向?qū)ο蟪绦蛟O(shè)計(jì)

面向?qū)ο蟪绦蛟O(shè)計(jì)(Object-Oriented Programming,OOP)是一種編程范式,它將數(shù)據(jù)和處理數(shù)據(jù)的方法綁定在一起,形成對象。OOP強(qiáng)調(diào)的是對象之間的交互,而不是具體的步驟。這種范式有助于提高代碼的復(fù)用性和可維護(hù)性。面向?qū)ο蟪绦蛟O(shè)計(jì)相較于面向過程程序設(shè)計(jì),更加強(qiáng)調(diào)數(shù)據(jù)的封裝、繼承和多態(tài)等特性。這些特性使得代碼更加模塊化,易于擴(kuò)展和維護(hù)。

三、Java開發(fā)環(huán)境搭建

JDK與JRE

JDK(Java Development Kit)是Java開發(fā)工具包,包含了JRE(Java Runtime Environment)以及一些開發(fā)工具,如javac編譯器、javadoc文檔生成器等。

JRE是Java運(yùn)行時(shí)環(huán)境,包含了JVM和一些基礎(chǔ)類庫,用于運(yùn)行Java應(yīng)用程序。

安裝JDK

需要下載合適的版本,并按照安裝向?qū)нM(jìn)行安裝。

安裝過程中需要注意選擇合適的路徑,并確保安裝成功。

配置環(huán)境變量

為了能夠在命令行中使用Java命令,需要配置環(huán)境變量。

通常需要設(shè)置JAVA_HOME變量指向JDK的安裝目錄,并將%JAVA_HOME%\bin添加到PATH變量中

四、第一個(gè)Java程序:HelloWorld

顯示文件擴(kuò)展名:在Windows系統(tǒng)中,默認(rèn)情況下文件擴(kuò)展名是隱藏的,可以通過修改文件夾選項(xiàng)來顯示文件擴(kuò)展名。

編寫代碼:創(chuàng)建一個(gè)名為HelloWorld.java的文件,并在其中編寫以下代碼:


五、Java常用開發(fā)工具

Eclipse:一款流行的Java IDE(Integrated Development Environment),提供了豐富的功能,如代碼編輯、調(diào)試、版本控制集成等。

IntelliJ IDEA:另一款強(qiáng)大的Java IDE,以其智能代碼補(bǔ)全、快速導(dǎo)航和高效的重構(gòu)功能而聞名。

六、總結(jié)

本章主要重點(diǎn)是要能夠正確的配置和安裝使用IDEA,要注意IDEA的環(huán)境配置問題

第二章:JAVA編程基礎(chǔ)

一、Java基礎(chǔ)概念

變量與常量

變量:在Java中,變量必須先聲明再使用,且變量名需要遵守小寫字母開頭的駝峰規(guī)則。變量可以改變值。

常量:在變量聲明前加上final關(guān)鍵字,常量一旦被賦值,不可改變。

例如

// 變量聲明與賦值

int number = 10;

double pi = 3.14;

char letter = 'A';

boolean flag = true;

// 常量聲明與賦值

final int MAX_VALUE = 100; // 常量不可改變

數(shù)據(jù)類型

Java中的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。

基本數(shù)據(jù)類型包括整型(byte, short, int, long)、浮點(diǎn)型(float, double)、字符型(char)和布爾型(boolean)。

引用數(shù)據(jù)類型包括類、接口、數(shù)組等。


數(shù)據(jù)類型轉(zhuǎn)換

自動(dòng)類型轉(zhuǎn)換:占用字節(jié)數(shù)少的數(shù)據(jù)類型的值可以直接賦值給占用字節(jié)數(shù)多的數(shù)據(jù)類型的變量。

強(qiáng)制類型轉(zhuǎn)換:強(qiáng)制性地占用字節(jié)數(shù)多的數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換成占用字節(jié)數(shù)少的數(shù)據(jù)類型的數(shù)據(jù),但這個(gè)轉(zhuǎn)換可能存在數(shù)據(jù)精度丟失問題。

例如:

double a = 5.7;

int b = (int) a; // 強(qiáng)制類型轉(zhuǎn)換,結(jié)果為5

二、運(yùn)算符與表達(dá)式

運(yùn)算符

算術(shù)運(yùn)算符:+,-,*,/,%,++,--等。

例如:

int sum = 5 + 3; // 加法

int diff = 5 - 3; // 減法

int product = 5 * 3; // 乘法

int quotient = 5 / 2; // 除法,結(jié)果為2(整數(shù)除法)

int remainder = 5 % 2; // 取余,結(jié)果為1

賦值運(yùn)算符:=,+=,-=,*=,/=等。

關(guān)系運(yùn)算符:>,<,>=,<=,==,!=等。

邏輯運(yùn)算符:&&,||,!等。

例如:

boolean x = true;

boolean y = false;

boolean andResult = x && y; // 邏輯與,結(jié)果為false

boolean orResult = x || y; // 邏輯或,結(jié)果為true

boolean notResult = !x; // 邏輯非,結(jié)果為false

位運(yùn)算符:&,|,^,~,<<,>>等。

三元運(yùn)算符:? :。

表達(dá)式

表達(dá)式由運(yùn)算符和操作數(shù)組成,用于計(jì)算值或產(chǎn)生效果。

三、選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)

選擇結(jié)構(gòu)

if語句:根據(jù)條件判斷執(zhí)行不同的代碼塊。

例如:

int score = 85;

if (score >= 90) {

? ? System.out.println("優(yōu)秀");

} else if (score >= 60) {

? ? System.out.println("及格");

} else {

? ? System.out.println("不及格");

}

switch語句:根據(jù)表達(dá)式的值選擇執(zhí)行不同的代碼塊,適用于多個(gè)精確值的判斷。

例如:

char grade = 'B';

switch (grade) {

? ? case 'A':

? ? ? ? System.out.println("優(yōu)秀");

? ? ? ? break;

? ? case 'B':

? ? case 'C':

? ? ? ? System.out.println("良好");

? ? ? ? break;

? ? default:

? ? ? ? System.out.println("其他");

}


循環(huán)結(jié)構(gòu)

for循環(huán):常用于知道邊界的循環(huán)。

例如:

for (int i = 0; i < 5; i++) {

? ? System.out.println("i = " + i);

}

while循環(huán):常用于不知道邊界的循環(huán)。

例如:

int count = 0;

while (count < 5) {

? ? System.out.println("count = " + count);

? ? count++;

}

do-while循環(huán):至少執(zhí)行一次循環(huán)體,之后再判斷表達(dá)式是否成立,成立則再次執(zhí)行循環(huán)體,否則循環(huán)結(jié)束。

例如:

int num = 0;

do {

? ? System.out.println("num = " + num);

? ? num++;

} while (num < 5);

四、方法

方法聲明與調(diào)用

方法必須先聲明才能在其代碼中調(diào)用。方法聲明包括修飾符、返回值類型、方法名和參數(shù)列表。

方法調(diào)用通過方法名和參數(shù)進(jìn)行,調(diào)用后方法體中的代碼被執(zhí)行。

例如:

// 方法聲明

public int add(int a, int b) {

? ? return a + b;

}

// 方法調(diào)用

int result = add(3, 4); // 調(diào)用add方法,結(jié)果為7

方法重載

方法重載是指同一個(gè)類中可以有多個(gè)方法名相同但參數(shù)個(gè)數(shù)或類型不同的方法。重載的方法具有不同的功能。

例如:

// 方法重載示例

public int add(int a, int b) {

? ? return a + b;

}

public double add(double a, double b) {

? ? return a + b;

}

// 調(diào)用重載的方法

int sumInts = add(3, 4); // 調(diào)用int類型的add方法

double sumDoubles = add(3.5, 4.5); // 調(diào)用double類型的add方法

五、數(shù)組

數(shù)組聲明與初始化

數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)相同類型的多個(gè)元素。數(shù)組元素可以通過索引進(jìn)行訪問。

數(shù)組聲明包括元素類型和數(shù)組名,初始化可以通過賦值語句或new關(guān)鍵字進(jìn)行。

例如:

// 靜態(tài)初始化

int[] numbers = {1, 2, 3, 4, 5};

// 動(dòng)態(tài)初始化

String[] names = new String[5];

names[0] = "Alice";

names[1] = "Bob";

數(shù)組操作

可以對數(shù)組進(jìn)行遍歷、排序、查找等操作

例如:

// 遍歷數(shù)組

for (int i = 0; i < numbers.length; i++) {

? ? System.out.println(numbers[i]);

}

// 查找數(shù)組中的最大值

int max = numbers[0];

for (int i = 1; i < numbers.length; i++) {

? ? if (numbers[i] > max) {

? ? ? ? max = numbers[i];

? ? }

}

System.out.println("Max value: " + max);

六、總結(jié)

本章中主要是對java基礎(chǔ)編程的一些概念性的話術(shù)進(jìn)行總結(jié),主要是要學(xué)會(huì)對一些數(shù)據(jù)的區(qū)分還有最重要的循環(huán)語句進(jìn)行舉例說明,使讀者能夠通過運(yùn)算符,還有對變量的執(zhí)行運(yùn)算等從而實(shí)現(xiàn)一些簡單的事件判斷和數(shù)據(jù)運(yùn)算,同時(shí)還講述了方法的創(chuàng)建,使用和調(diào)用,遞歸等,簡化代碼的復(fù)雜性,將數(shù)組和循環(huán)結(jié)合起來達(dá)到用最小的時(shí)間取到想要的數(shù)組數(shù)據(jù)

第三章 面向?qū)ο蟪绦蛟O(shè)計(jì)(基礎(chǔ))

概念:面向?qū)ο螅∣bject Oriented,簡稱OO)是一種計(jì)算機(jī)編程的思想和方法,其核心是將程序中的行為主體定義為對象。以下是關(guān)于面向?qū)ο蟾拍畹脑敿?xì)解釋:

一、基本概念

對象:對象是面向?qū)ο蟪绦虻幕緲?gòu)成單元,它包含了數(shù)據(jù)(屬性)和操作數(shù)據(jù)的方法。對象可以看作是現(xiàn)實(shí)世界中的實(shí)體,例如人、汽車、動(dòng)物等,它們都具有一些屬性和行為。

類:類是對象的抽象,它定義了對象的結(jié)構(gòu)和行為。類是具有相同特性(數(shù)據(jù)元素)和行為(功能)的對象的抽象。因此,對象的抽象是類,類的具體化就是對象,也可以說類的實(shí)例是對象。類實(shí)際上就是一種數(shù)據(jù)類型,它包含了類變量(定義在類中且在函數(shù)體之外的變量)和類方法(類中定義的函數(shù))。

二、基本特性(對象,封裝,多態(tài))

類和對象的關(guān)系

類是對一類事物的抽象,提取共有屬性和行為。

對象是類的具體實(shí)例,具有確定的屬性值。例如,“學(xué)生”是類,“具體的某個(gè)學(xué)生”是對象。

封裝

隱藏對象內(nèi)部細(xì)節(jié),僅提供公共訪問方式,確保數(shù)據(jù)安全和使用簡便。

繼承

子類可繼承父類的屬性和方法,實(shí)現(xiàn)代碼復(fù)用與功能擴(kuò)展。

多態(tài)

同一方法調(diào)用因?qū)ο蟛煌a(chǎn)生不同行為,增強(qiáng)程序靈活性與擴(kuò)展性。

類定義

使用class關(guān)鍵字定義類,一個(gè).java文件可包含多個(gè)類,但只能有一個(gè)public類且類名與文件名一致。

類名遵循大寫字母開頭的駝峰命名規(guī)則,由變量(字段)和方法組成。

成員變量和方法

變量定義格式為“修飾符 變量類型 變量名 = [默認(rèn)值];”。

方法定義格式為“修飾符 返回值類型 方法名(形參列表) {}”。

對象創(chuàng)建

通過new關(guān)鍵字創(chuàng)建對象,語法為“類名稱 對象名稱 = new 類名稱();”。

成員變量和成員方法隸屬于對象,不同對象的成員變量獨(dú)立存儲(chǔ),互不干擾。

構(gòu)造方法

用于對象初始化,給成員變量賦初始值,名稱與類名相同,無返回值且不能有return關(guān)鍵字。

每個(gè)類必須有構(gòu)造方法,若未定義,編譯器自動(dòng)提供默認(rèn)無參構(gòu)造方法。

例如:

public class Person {

? ? private String name;

? ? private int age;

? ? // 無參構(gòu)造方法

? ? public Person() {

? ? ? ? this.name = "Unknown";

? ? ? ? this.age = 0;

? ? }

? ? // 帶參構(gòu)造方法

? ? public Person(String name, int age) {

? ? ? ? this.name = name;

? ? ? ? this.age = age;

? ? }

}

this關(guān)鍵字

在成員方法或構(gòu)造方法中代表當(dāng)前對象,用于調(diào)用當(dāng)前對象的成員變量、成員方法或構(gòu)造方法。

例如:

public class Person {

? ? String name;

? ? public Person(String name) {

? ? ? ? this.name = name;

? ? }

? ? public Person setName(String name) {

? ? ? ? this.name = name;

? ? ? ? return this; // 返回當(dāng)前對象

? ? }

? ? public void printName() {

? ? ? ? System.out.println(this.name);

? ? }

? ? public static void main(String[] args) {

? ? ? ? Person person = new Person("David").setName("Eva").printName(); // 輸出: Eva

? ? }

}

static關(guān)鍵字

修飾成員變量(靜態(tài)變量或類變量)、成員方法和構(gòu)造代碼塊。

靜態(tài)變量優(yōu)先于對象存在,隨類加載而存在,類的所有實(shí)例共享同一靜態(tài)變量。

靜態(tài)方法屬于類,優(yōu)先于對象存在,可通過“類名.方法名”調(diào)用,不能使用this關(guān)鍵字,不能調(diào)用成員變量和成員方法(非靜態(tài))

例如:

// Student.java

package com.yyds.unit3.demo;

public class Student {

? ? String name;

? ? int age;

? ? static String grade; // 靜態(tài)變量

? ? // 靜態(tài)方法

? ? public static void goHome() {

? ? ? ? System.out.println("學(xué)生回家");

? ? }

? ? public static void main(String[] args) {

? ? ? ? // 通過類名調(diào)用靜態(tài)變量和方法

? ? ? ? Student.grade = "三年級(jí)";

? ? ? ? Student.goHome();

? ? ? ? // 通過對象名調(diào)用靜態(tài)變量(不推薦)

? ? ? ? Student student1 = new Student();

? ? ? ? System.out.println(student1.name + "在" + Student.grade + "學(xué)習(xí)");

? ? }

}

概念:包是Java命名空間機(jī)制的一部分,它使用樹形結(jié)構(gòu)來組織相關(guān)的類、接口和子包。通過使用包,開發(fā)者可以將相關(guān)的功能模塊分組,使代碼更加模塊化、結(jié)構(gòu)化和易于管理。在Java源代碼文件中,包的聲明位于文件的最頂部,使用package關(guān)鍵字進(jìn)行聲明

總結(jié)

在深入學(xué)習(xí)Java面向?qū)ο蟪绦蛟O(shè)計(jì)的第三章后,我深刻感受到了面向?qū)ο缶幊蹋∣OP)的強(qiáng)大與靈活性。這一章的學(xué)習(xí)加深了我對類和對象的概念,分別介紹了類的定義方式和對象的創(chuàng)建與使用,。接著介紹了構(gòu)造方法,使用戶能夠更加靈活地創(chuàng)建對象,并對對象中的成員變量進(jìn)行更便捷的初始化,而當(dāng)成員變量和局部變量存在重名時(shí),成員變量需要加上 this關(guān)鍵字,這一點(diǎn)需要注意再者,介紹了 static 關(guān)鍵字的使用,分別演示了靜態(tài)變量、靜態(tài)方法、靜態(tài)代碼塊與非靜態(tài)變量、方法、代碼塊的區(qū)別。還概述了關(guān)鍵字package的思想以及介紹了package的使用。

第四章 面向?qū)ο蟪绦蛟O(shè)計(jì)(進(jìn)階版)

一、繼承

繼承的概念

繼承是面向?qū)ο缶幊讨械囊粋€(gè)核心概念,允許子類繼承父類的屬性和方法。

通過繼承,子類可以重用父類的代碼,實(shí)現(xiàn)代碼的擴(kuò)展和復(fù)用。

類的繼承關(guān)系

使用extends關(guān)鍵字來實(shí)現(xiàn)類的繼承。

Java只支持單繼承,即一個(gè)類只能有一個(gè)直接父類。

子類可以擁有父類的屬性和方法,也可以增加新的屬性和方法。

方法重寫

子類可以重寫父類中的方法,以提供特定的實(shí)現(xiàn)。

重寫的方法必須具有相同的名稱、返回類型和參數(shù)列表。

重寫的方法可以使用@Override注解來明確標(biāo)識(shí)。

super關(guān)鍵字

super用于引用父類的構(gòu)造方法、屬性和方法。

在子類的構(gòu)造方法中,如果需要使用父類的構(gòu)造方法,則必須使用super()調(diào)用。

通過super可以調(diào)用父類的屬性和方法,實(shí)現(xiàn)子類對父類行為的復(fù)用和擴(kuò)展。

訪問修飾符

訪問修飾符用于控制類、接口、變量、方法的訪問權(quán)限。

Java中的訪問修飾符包括:private(私有)、默認(rèn)(無修飾符,包訪問權(quán)限)、protected(受保護(hù))和public(公有)。

二、多態(tài)性

多態(tài)性的概念

多態(tài)性允許父類類型的引用變量指向子類對象。

通過多態(tài)性,可以在運(yùn)行時(shí)動(dòng)態(tài)地確定調(diào)用哪個(gè)類的方法,實(shí)現(xiàn)方法的動(dòng)態(tài)綁定。

對象的類型轉(zhuǎn)換

向上轉(zhuǎn)型:子類對象轉(zhuǎn)換為父類對象,這是安全的。

向下轉(zhuǎn)型:父類對象轉(zhuǎn)換為子類對象,需要顯式地進(jìn)行類型轉(zhuǎn)換,并可能引發(fā)ClassCastException異常。

instanceof關(guān)鍵字

使用instanceof關(guān)鍵字可以檢查一個(gè)對象是否是某個(gè)類的實(shí)例。

這在進(jìn)行向下轉(zhuǎn)型之前非常重要,可以避免類型轉(zhuǎn)換錯(cuò)誤。

三、類


父類和子類的定義

定義一個(gè)父類,包含一些屬性和方法。

定義一個(gè)子類,繼承父類,并可以重寫父類的方法或增加新的方法。

構(gòu)造方法的調(diào)用

在子類的構(gòu)造方法中,使用super()調(diào)用父類的構(gòu)造方法。

方法的重寫和調(diào)用

在子類中重寫父類的方法,并通過父類類型的引用調(diào)用子類重寫的方法。

對象的類型轉(zhuǎn)換和檢查

使用instanceof關(guān)鍵字檢查對象的類型,并進(jìn)行必要的類型轉(zhuǎn)換。

代碼示例:

// 父類:動(dòng)物

class Animal {

? ? String name;

? ? // 父類的構(gòu)造方法

? ? Animal(String name) {

? ? ? ? this.name = name;

? ? }

? ? // 父類的方法

? ? void makeSound() {

? ? ? ? System.out.println(name + " makes a generic animal sound");

? ? }

}

// 子類:狗

class Dog extends Animal {


? ? // 子類的構(gòu)造方法,調(diào)用父類的構(gòu)造方法

? ? Dog(String name) {

? ? ? ? super(name); // 使用super調(diào)用父類的構(gòu)造方法

? ? }

? ? // 重寫父類的方法

? ? @Override

? ? void makeSound() {

? ? ? ? System.out.println(name + " barks");

? ? }

? ? // 子類特有的方法

? ? void fetch() {

? ? ? ? System.out.println(name + " is fetching a ball");

? ? }

}

// 子類:貓

class Cat extends Animal {


? ? // 子類的構(gòu)造方法,調(diào)用父類的構(gòu)造方法

? ? Cat(String name) {

? ? ? ? super(name); // 使用super調(diào)用父類的構(gòu)造方法

? ? }

? ? // 重寫父類的方法

? ? @Override

? ? void makeSound() {

? ? ? ? System.out.println(name + " meows");

? ? }

? ? // 子類特有的方法

? ? void scratch() {

? ? ? ? System.out.println(name + " is scratching a post");

? ? }

}

public class InheritancePolymorphismDemo {

? ? public static void main(String[] args) {

? ? ? ? // 父類類型的引用指向子類對象(多態(tài)性)

? ? ? ? Animal myDog = new Dog("Buddy");

? ? ? ? Animal myCat = new Cat("Whiskers");

? ? ? ? // 調(diào)用的是子類重寫的方法

? ? ? ? myDog.makeSound(); // 輸出:Buddy barks

? ? ? ? myCat.makeSound(); // 輸出:Whiskers meows

? ? ? ? // 使用instanceof關(guān)鍵字檢查對象的類型,并進(jìn)行類型轉(zhuǎn)換

? ? ? ? if (myDog instanceof Dog) {

? ? ? ? ? ? Dog dog = (Dog) myDog;

? ? ? ? ? ? dog.fetch(); // 輸出:Buddy is fetching a ball

? ? ? ? }

? ? ? ? if (myCat instanceof Cat) {

? ? ? ? ? ? Cat cat = (Cat) myCat;

? ? ? ? ? ? cat.scratch(); // 輸出:Whiskers is scratching a post

? ? ? ? }


? ? }

}

三、接口的基本概念

定義:接口是一個(gè)引用類型,是一種抽象的類型,它是方法聲明的集合。一個(gè)類通過繼承接口,從而繼承接口中聲明的方法。但方法的實(shí)現(xiàn)由類來完成。

作用

定義行為:接口為類提供了一種規(guī)范,規(guī)定了類必須實(shí)現(xiàn)哪些方法。

解耦:通過接口,可以降低類之間的耦合度,提高系統(tǒng)的可擴(kuò)展性和靈活性。

多態(tài):接口是實(shí)現(xiàn)多態(tài)的基礎(chǔ),允許使用接口的引用來指向?qū)崿F(xiàn)了該接口的類的實(shí)例。

接口的特點(diǎn)

抽象性:接口中的方法都是抽象的,沒有方法體。

多重繼承:一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,從而繼承多個(gè)接口中的方法。這是Java等語言支持的一種特性,而C++中的多重繼承是通過多重基類來實(shí)現(xiàn)的,但存在二義性和復(fù)雜性等問題。

隱藏具體實(shí)現(xiàn):接口只關(guān)心方法名、參數(shù)和返回類型,而不關(guān)心方法的具體實(shí)現(xiàn)。

互操作性:接口提供了一種在不同模塊或不同系統(tǒng)之間進(jìn)行通信的標(biāo)準(zhǔn)方式。

接口與類的關(guān)系

繼承:一個(gè)類可以使用關(guān)鍵字implements來實(shí)現(xiàn)一個(gè)或多個(gè)接口。

實(shí)現(xiàn):類必須提供接口中所有方法的實(shí)現(xiàn),否則該類必須聲明為抽象類。

默認(rèn)方法和靜態(tài)方法(Java 8及以上版本):接口可以包含默認(rèn)方法和靜態(tài)方法,這為接口的進(jìn)化提供了更多的靈活性。

默認(rèn)方法:使用default關(guān)鍵字修飾,允許在接口中提供方法的默認(rèn)實(shí)現(xiàn)。

靜態(tài)方法:使用static關(guān)鍵字修飾,可以通過接口名直接調(diào)用。

接口與抽象類的區(qū)別

抽象類

可以包含抽象方法和具體方法。

可以包含字段(成員變量)。

只能單繼承(一個(gè)類只能繼承一個(gè)抽象類)。

接口

只能包含抽象方法(直到Java 8引入了默認(rèn)方法和靜態(tài)方法)。

不能包含字段(直到Java 8引入了靜態(tài)字段,但不允許實(shí)例字段)。

可以多實(shí)現(xiàn)(一個(gè)類可以實(shí)現(xiàn)多個(gè)接口)。

例如:

// 定義一個(gè)接口

public interface Animal {

? ? void eat();

? ? void sleep();

? ? // Java 8引入的默認(rèn)方法

? ? default void breathe() {

? ? ? ? System.out.println("Breathing...");

? ? }

? ? // Java 8引入的靜態(tài)方法

? ? static void info() {

? ? ? ? System.out.println("This is an Animal interface.");

? ? }

}

// 實(shí)現(xiàn)接口的類

public class Dog implements Animal {

? ? @Override

? ? public void eat() {

? ? ? ? System.out.println("Dog is eating.");

? ? }

? ? @Override

? ? public void sleep() {

? ? ? ? System.out.println("Dog is sleeping.");

? ? }

? ? // 可以選擇性地覆蓋默認(rèn)方法

? ? @Override

? ? public void breathe() {

? ? ? ? System.out.println("Dog is breathing through lungs.");

? ? }

}

public class Main {

? ? public static void main(String[] args) {

? ? ? ? Animal myDog = new Dog();

? ? ? ? myDog.eat();

? ? ? ? myDog.sleep();

? ? ? ? myDog.breathe();

? ? ? ? // 調(diào)用接口的靜態(tài)方法

? ? ? ? Animal.info();

? ? }

}

內(nèi)部類概述

內(nèi)部類是指定義在另一個(gè)類內(nèi)部的類。根據(jù)使用場景和定義方式的不同,內(nèi)部類主要可分為以下幾種類型:

成員內(nèi)部類:這是最常見的內(nèi)部類類型,它看起來像是外部類的一個(gè)成員,并擁有與外部類成員相似的訪問權(quán)限。成員內(nèi)部類可以訪問外部類的所有成員,包括私有成員。

局部內(nèi)部類:局部內(nèi)部類是定義在方法或者作用域內(nèi)的類,它僅在該方法或代碼塊內(nèi)有效。局部內(nèi)部類可以訪問外部類的所有成員,但不能有訪問修飾符和static修飾符。

匿名內(nèi)部類:匿名內(nèi)部類是沒有名稱的內(nèi)部類,通常用于簡化代碼編寫,常見于實(shí)現(xiàn)接口或繼承抽象類的實(shí)例化。

靜態(tài)內(nèi)部類:靜態(tài)內(nèi)部類是使用static關(guān)鍵字修飾的內(nèi)部類,它不同于成員內(nèi)部類,靜態(tài)內(nèi)部類不依賴于外部類的實(shí)例,可以直接通過外部類名訪問。靜態(tài)內(nèi)部類不能訪問外部類的非靜態(tài)成員,但可以訪問靜態(tài)成員。

總結(jié)

本章以面向?qū)ο蟮娜筇匦?封裝、繼承、多態(tài)為核心,介紹了很多知識(shí)點(diǎn),這些知識(shí)點(diǎn)都是為這三大特性服務(wù)的。

首先,介紹了訪問修飾符和get()、set()方法的使用,從而將變量進(jìn)行了封裝,使外界無法直接訪問變量,取而代之的則是提供了公共的訪間方法,從而保障了變量的安全性。接著,介紹了繼承,使類與類之間存在了一定的聯(lián)系,為后面的多態(tài)打下了基礎(chǔ)。在繼承中,變量和方法的訪問不同,通過一個(gè)內(nèi)存圖解介紹了super關(guān)鍵字的使用。接著介紹了final關(guān)鍵字和Object類,并對繼承進(jìn)行了詳細(xì)介紹。

之后以前面的知識(shí)點(diǎn)為基礎(chǔ),介紹了多態(tài)特性,并通過抽象類、接口的使用,使程序的展性、復(fù)用性更強(qiáng)。事實(shí)上,抽象類、接口、內(nèi)部類都是為多態(tài)服務(wù)的,通過合理使用多態(tài),可以讓程序的耦合性更小,代碼更易擴(kuò)展。

第五章 異常

一、異常的基本概念

定義:異常是程序在運(yùn)行時(shí)出現(xiàn)的不正常情況或錯(cuò)誤,這些錯(cuò)誤會(huì)打斷程序的正常執(zhí)行流程。

異常類型

Error:系統(tǒng)級(jí)錯(cuò)誤,通常由JVM拋出,無法被程序員捕獲和處理。

Exception:程序級(jí)異常,可以被程序員捕獲并處理。其中,RuntimeException及其子類稱為運(yùn)行時(shí)異常,其他異常稱為受檢異常(checked exception)。

二、異常的處理機(jī)制

try-catch語句

try塊:包含可能產(chǎn)生異常的代碼。

catch塊:用于捕獲并處理try塊中拋出的異常??梢杂卸鄠€(gè)catch塊來捕獲不同類型的異常。

finally塊

finally塊中的代碼無論是否發(fā)生異常都會(huì)執(zhí)行,常用于釋放資源,如關(guān)閉文件、數(shù)據(jù)庫連接等。

throws關(guān)鍵字

在方法簽名中使用throws關(guān)鍵字聲明該方法可能拋出的異常類型。調(diào)用該方法的代碼需要處理這些異?;蚶^續(xù)向上聲明。

throw關(guān)鍵字

用于顯式地拋出一個(gè)異常實(shí)例。通常與自定義異常類一起使用。

三、常見的異常類型

空指針異常(NullPointerException):當(dāng)應(yīng)用程序試圖在需要對象的地方使用null時(shí)拋出。

數(shù)組越界異常(ArrayIndexOutOfBoundsException):當(dāng)索引超出字符串或數(shù)組的長度時(shí)拋出。

類型轉(zhuǎn)換異常(ClassCastException):當(dāng)試圖將對象強(qiáng)制轉(zhuǎn)換為不是其實(shí)例的類時(shí)拋出。

數(shù)字格式異常(NumberFormatException):當(dāng)應(yīng)用程序試圖將字符串轉(zhuǎn)換為一種數(shù)值類型,但該字符串沒有有效的轉(zhuǎn)換格式時(shí)拋出。

文件未找到異常(FileNotFoundException):當(dāng)試圖打開指定路徑名表示的文件失敗時(shí)拋出。

算術(shù)異常(ArithmeticException):如整數(shù)除零時(shí)拋出。

四、自定義異常

定義:程序員可以根據(jù)自己的需求定義新的異常類。

實(shí)現(xiàn):自定義異常類通常通過繼承Exception類或其子類來實(shí)現(xiàn),并可以重載有參構(gòu)造方法來傳遞異常信息。

五、異常處理的原則

避免異常:在編寫代碼時(shí),應(yīng)盡可能避免異常的發(fā)生。例如,在訪問數(shù)組元素之前檢查索引的有效性,在調(diào)用對象方法之前檢查對象是否為null等。

捕獲并處理異常:對于可能發(fā)生的異常,應(yīng)使用try-catch語句塊進(jìn)行捕獲和處理。在處理異常時(shí),應(yīng)根據(jù)異常的類型和上下文信息選擇合適的處理方式。

不要濫用異常:異常不應(yīng)被用作程序流程控制的手段。過度使用異??赡軙?huì)導(dǎo)致代碼的可讀性和可維護(hù)性降低。

記錄異常信息:在處理異常時(shí),應(yīng)記錄異常的相關(guān)信息,如異常類型、異常消息、異常發(fā)生的堆棧跟蹤等。這些信息對于調(diào)試和定位問題非常有幫助。

示例1:基本的異常處理機(jī)制

public class BasicExceptionHandling {

? ? public static void main(String[] args) {

? ? ? ? try {

? ? ? ? ? ? // 可能拋出異常的代碼

? ? ? ? ? ? int[] numbers = {1, 2, 3};

? ? ? ? ? ? System.out.println(numbers[5]); // 這將拋出ArrayIndexOutOfBoundsException

? ? ? ? } catch (ArrayIndexOutOfBoundsException e) {

? ? ? ? ? ? // 捕獲并處理ArrayIndexOutOfBoundsException

? ? ? ? ? ? System.out.println("數(shù)組索引越界:" + e.getMessage());

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? // 捕獲并處理其他所有異常(雖然在這個(gè)例子中不會(huì)被捕獲到)

? ? ? ? ? ? System.out.println("發(fā)生了一個(gè)異常:" + e.getMessage());

? ? ? ? } finally {

? ? ? ? ? ? // 無論是否發(fā)生異常,都會(huì)執(zhí)行的代碼

? ? ? ? ? ? System.out.println("這是finally塊,無論是否發(fā)生異常都會(huì)執(zhí)行。");

? ? ? ? }

? ? }

}

示例2:自定義異常

// 自定義異常類

class MyCustomException extends Exception {

? ? public MyCustomException(String message) {

? ? ? ? super(message);

? ? }

}

public class CustomExceptionHandling {

? ? public static void main(String[] args) {

? ? ? ? try {

? ? ? ? ? ? // 調(diào)用可能拋出自定義異常的方法

? ? ? ? ? ? checkAge(-5);

? ? ? ? } catch (MyCustomException e) {

? ? ? ? ? ? // 捕獲并處理自定義異常

? ? ? ? ? ? System.out.println("捕獲到自定義異常:" + e.getMessage());

? ? ? ? }

? ? }

? ? public static void checkAge(int age) throws MyCustomException {

? ? ? ? if (age < 0) {

? ? ? ? ? ? throw new MyCustomException("年齡不能為負(fù)數(shù)!");

? ? ? ? }

? ? ? ? System.out.println("年齡檢查通過,年齡是:" + age);

? ? }

}

五、方法重寫異常

子類重寫父類方法時(shí),編譯時(shí)異常聲明遵循如下兩點(diǎn)即可。運(yùn)行時(shí)異常不受這兩點(diǎn)約束。

父類方法沒有聲明異常,子類重寫該方法不能聲明異常,如下所示。

父類方法聲明了異常,子類重寫該方法可以不聲明異常,或者只聲明父類的異?;蛟摦惓5淖宇悾缦滤?/p>


總結(jié)

本章主要介紹了異常的使用。首先對異常的概念和體系進(jìn)行了介紹,通過繼承關(guān)系講述了異常的分類,以及異常與錯(cuò)誤的區(qū)別。然后介紹了異常的拋出、聲明、捕獲,要求開發(fā)者對能夠預(yù)知到的異常必須進(jìn)行處理。接著介紹了自定義異常,開發(fā)者可以盡可能地根據(jù)業(yè)務(wù)場景定義出對應(yīng)的異常,從而便于在生產(chǎn)環(huán)境中排查錯(cuò)誤。

第六章:Java常用的類

一、包裝類

定義:Java為每種基本數(shù)據(jù)類型提供了對應(yīng)的包裝類,使得基本數(shù)據(jù)類型可以作為對象來處理。

特點(diǎn):包裝類是不可變的,即一旦構(gòu)造了包裝器對象,就不能修改包裝在其中的值。包裝類還是final類,因此不能定義它們的子類。

用途:在需要將基本數(shù)據(jù)類型作為對象傳遞或需要對象特性的場合(如使用集合類時(shí)),可以使用包裝類。

代碼示例:

public class WrapperClassExample {

? ? public static void main(String[] args) {

? ? ? ? // 使用自動(dòng)裝箱將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝類對象

? ? ? ? Integer num1 = 10;


? ? ? ? // 使用構(gòu)造方法創(chuàng)建包裝類對象

? ? ? ? Integer num2 = new Integer(20);


? ? ? ? // 使用包裝類對象的方法

? ? ? ? System.out.println("num1的值: " + num1.intValue()); // 將包裝類對象轉(zhuǎn)換為基本數(shù)據(jù)類型

? ? ? ? System.out.println("num2的字符串表示: " + num2.toString());


? ? ? ? // 比較包裝類對象(注意:比較值應(yīng)使用equals方法,而不是==)

? ? ? ? Integer num3 = 100;

? ? ? ? Integer num4 = 100;

? ? ? ? System.out.println(num3 == num4); // false,因?yàn)閚um3和num4指向不同的對象(對于-128到127之間的值,Java會(huì)進(jìn)行緩存)

? ? ? ? System.out.println(num3.equals(num4)); // true,因?yàn)橹迪嗟?/p>

? ? }

}

二、String類

定義:String類代表字符串,是Java中常用的類之一。

不可變性:String類的對象是不可變的,即創(chuàng)建后不能修改其內(nèi)容。

常用方法:包括length()、charAt()、substring()、indexOf()、trim()、toLowerCase()、toUpperCase()等,用于獲取字符串長度、字符、子字符串、查找字符位置、去除空格、轉(zhuǎn)換大小寫等操作。

代碼示例:

public class StringExample {

? ? public static void main(String[] args) {

? ? ? ? String str1 = "Hello";

? ? ? ? String str2 = "World";


? ? ? ? // 字符串拼接

? ? ? ? String str3 = str1 + " " + str2;

? ? ? ? System.out.println(str3); // 輸出:Hello World


? ? ? ? // 獲取字符串長度

? ? ? ? int length = str3.length();

? ? ? ? System.out.println("字符串長度: " + length);


? ? ? ? // 查找字符位置

? ? ? ? int index = str3.indexOf("World");

? ? ? ? System.out.println("World的索引位置: " + index);


? ? ? ? // 去除空格

? ? ? ? String trimmedStr = "? Hello World? ".trim();

? ? ? ? System.out.println("去除空格后的字符串: " + trimmedStr);


? ? ? ? // 轉(zhuǎn)換大小寫

? ? ? ? String lowerStr = str3.toLowerCase();

? ? ? ? String upperStr = str3.toUpperCase();

? ? ? ? System.out.println("小寫字符串: " + lowerStr);

? ? ? ? System.out.println("大寫字符串: " + upperStr);

? ? }

}

三、StringBuffer和StringBuilder類

定義:StringBuffer和StringBuilder類都表示可變的字符序列,與String類的不可變性形成對比。

區(qū)別:StringBuffer是線程安全的,而StringBuilder是非線程安全的。因此,在單線程環(huán)境下,StringBuilder的性能通常比StringBuffer更高。

常用方法:包括append()、insert()、reverse()、delete()等,用于在字符串緩沖區(qū)中追加、插入、反轉(zhuǎn)、刪除字符或字符串。

代碼示例:

public class StringBuilderExample {

? ? public static void main(String[] args) {

? ? ? ? StringBuilder sb = new StringBuilder("Hello");


? ? ? ? // 追加字符

? ? ? ? sb.append(" ");

? ? ? ? sb.append("World");


? ? ? ? // 插入字符

? ? ? ? sb.insert(5, "!");


? ? ? ? // 反轉(zhuǎn)字符串

? ? ? ? sb.reverse();


? ? ? ? // 刪除字符

? ? ? ? sb.delete(0, 1); // 刪除第一個(gè)字符


? ? ? ? // 獲取字符串

? ? ? ? String str = sb.toString();

? ? ? ? System.out.println(str); // 輸出:!dlroW olleH(注意:反轉(zhuǎn)后的結(jié)果)

? ? }

}

四、時(shí)間和日期相關(guān)類

舊版類:在Java早期版本中,常用的時(shí)間和日期類包括Date、Calendar和GregorianCalendar等。Date類表示特定的瞬時(shí)、年、月、日、時(shí)、分、秒。Calendar類是一個(gè)抽象類,為操作年、月、日、時(shí)、分、秒等日歷字段提供方法。GregorianCalendar是Calendar的一個(gè)具體子類,提供了世界上大多數(shù)國家/地區(qū)使用的標(biāo)準(zhǔn)日歷系統(tǒng)。

新版類:Java 8引入了新的時(shí)間和日期API,包括LocalDate、LocalTime、LocalDateTime、ZonedDateTime等類,這些類位于java.time包下,提供了更強(qiáng)大、更靈活的時(shí)間和日期處理能力。

代碼示例:

import java.time.LocalDate;

import java.time.LocalTime;

import java.time.LocalDateTime;

public class DateTimeExample {

? ? public static void main(String[] args) {

? ? ? ? // 獲取當(dāng)前日期和時(shí)間

? ? ? ? LocalDate date = LocalDate.now();

? ? ? ? LocalTime time = LocalTime.now();

? ? ? ? LocalDateTime dateTime = LocalDateTime.now();


? ? ? ? // 打印日期和時(shí)間

? ? ? ? System.out.println("當(dāng)前日期: " + date);

? ? ? ? System.out.println("當(dāng)前時(shí)間: " + time);

? ? ? ? System.out.println("當(dāng)前日期和時(shí)間: " + dateTime);


? ? ? ? // 創(chuàng)建自定義的日期和時(shí)間

? ? ? ? LocalDate customDate = LocalDate.of(2023, 10, 1);

? ? ? ? LocalTime customTime = LocalTime.of(14, 30, 45);

? ? ? ? LocalDateTime customDateTime = LocalDateTime.of(customDate, customTime);


? ? ? ? // 打印自定義的日期和時(shí)間

? ? ? ? System.out.println("自定義日期: " + customDate);

? ? ? ? System.out.println("自定義時(shí)間: " + customTime);

? ? ? ? System.out.println("自定義日期和時(shí)間: " + customDateTime);

? ? }

}

五、其他常用類

Math類:提供了基本的數(shù)學(xué)運(yùn)算方法和常數(shù),如sin()、cos()、sqrt()、PI等。

Random類:用于生成偽隨機(jī)數(shù)。

UUID類:用于生成全局唯一的標(biāo)識(shí)符。

枚舉類:使用enum關(guān)鍵字定義,表示一組固定的常量。枚舉類是一個(gè)特殊的類,它繼承自java.lang.Enum類。

代碼示例:

import java.util.Random;

public class OtherClassesExample {

? ? public static void main(String[] args) {

? ? ? ? // 使用Math類

? ? ? ? double randomNum = Math.random(); // 生成0.0到1.0之間的隨機(jī)數(shù)

? ? ? ? double sinValue = Math.sin(Math.PI / 2); // 計(jì)算正弦值

? ? ? ? System.out.println("隨機(jī)數(shù): " + randomNum);

? ? ? ? System.out.println("sin(π/2)的值: " + sinValue);


? ? ? ? // 使用Random類

? ? ? ? Random rand = new Random();

? ? ? ? int randomInt = rand.nextInt(100); // 生成0到99之間的隨機(jī)整數(shù)

? ? ? ? System.out.println("隨機(jī)整數(shù): " + randomInt);

? ? }

}

六、Object類

定義:Object類是Java中所有類的超類,即每個(gè)類都直接或間接地繼承自O(shè)bject類。

常用方法

equals():用于比較兩個(gè)對象是否相等。

hashCode():用于獲取對象的哈希碼,哈希碼是一個(gè)整數(shù),表示對象的存儲(chǔ)地址(或某種與對象存儲(chǔ)相關(guān)的數(shù)值)。兩個(gè)相等對象的哈希碼一定相等。

toString():返回對象的字符串表示形式。

getClass():返回對象的運(yùn)行時(shí)類。

代碼示例:

public class ObjectExample {

? ? public static void main(String[] args) {

? ? ? ? Object obj1 = new Object();

? ? ? ? Object obj2 = new Object();


? ? ? ? // 使用toString方法

? ? ? ? System.out.println(obj1.toString()); // 輸出對象的哈希碼和類名(默認(rèn)實(shí)現(xiàn))


? ? ? ? // 使用equals方法比較對象

? ? ? ? System.out.println(obj1.equals(obj2)); // false,因?yàn)閛bj1和obj2指向不同的對象


? ? ? ? // 使用hashCode方法獲取對象的哈希碼

? ? ? ? System.out.println(obj1.hashCode());


? ? ? ? // 使用getClass方法獲取對象的運(yùn)行時(shí)類

? ? ? ? System.out.println(obj1.getClass().getName()); // 輸出對象的類名

? ? }

}

總結(jié)

本章主要介紹Java開發(fā)中常見的一些類的使用,包括包裝類、字符串、時(shí)間日期、工具類等都是在開發(fā)中經(jīng)常用到的類。本章首先介紹了包裝類的用處,以及包裝類與基本數(shù)類型之間的轉(zhuǎn)換,進(jìn)而引出自動(dòng)拆箱、裝箱機(jī)制;接著介紹了3種字符串:String、StringBufeStringBuilder的使用方式,以及它們之間的區(qū)別,并通過一個(gè)程序演示了三者之間的性能耗,讀者需要能夠根據(jù)不同的場景選擇不同的字符串類;之后介紹了日期相關(guān)類及其用法包括如何獲取日期、格式化日期、對日期進(jìn)行計(jì)算等

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容