基本概念
Java 面向?qū)ο缶幊?(Object-Oriented Programming, OOP) 是一種編程范式,旨在通過對象的概念來組織程序的設(shè)計和開發(fā)。OOP 是 Java 語言的核心特點,它幫助開發(fā)者更好地管理和組織代碼,使代碼更易于理解、維護(hù)和重用。
面向?qū)ο笏拇蠡咎匦?/h1>
一. 封裝
封裝是將對象的屬性和方法包裝在一起,并隱藏對象的內(nèi)部實現(xiàn)細(xì)節(jié)。
通過訪問修飾符(如 private、protected、public),可以控制對類成員的訪問級別
例如,使用 private 關(guān)鍵字將 name 和 age 屬性設(shè)為私有,并通過公共方法(如 getName() 和 setName())訪問它們
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
二.繼承
- 繼承允許一個類從另一個類繼承屬性和方法,促進(jìn)代碼的重用和層次化設(shè)計。
- 子類可以繼承父類的特性,并且可以添加新的特性或重寫父類的特性。
- java中實現(xiàn)單繼承,而無法實現(xiàn)多繼承(只能有一個父親)但是可以實現(xiàn)多重繼承(爺爺,父親,兒子)
public class Animal {
private String name;
private int age;
}
public class Dog extends Animal {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("小黑");
dog.setAge(22);
System.out.println(dog);
}
}
三. 多態(tài)
- 多態(tài)允許對象在不同情境下以不同的形式表現(xiàn)。Java 支持方法重載(Overloading)和方法重寫(Overriding),這是多態(tài)的兩種實現(xiàn)方式。
- 例如,可以重寫父類的方法,使得子類具有不同的行為。
public class Main {
public static void main(String[] args) {
// 創(chuàng)建 Dog 對象并賦給 Animal 類型的變量
Animal animal1 = new Dog();
// 多態(tài)性,調(diào)用的是 Dog 類的 makeSound() 方法
animal1.makeSound(); // 輸出: 汪汪!
// 創(chuàng)建 Cat 對象并賦給 Animal 類型的變量
Animal animal2 = new Cat();
// 多態(tài)性,調(diào)用的是 Cat 類的 makeSound() 方法
animal2.makeSound(); // 輸出: 喵喵!
}
}
四. 抽象
- 抽象是指通過抽象類或接口,定義對象的抽象特性,而不具體實現(xiàn)細(xì)節(jié)。
- 抽象類不能實例化,它們通常用來定義通用的行為,由具體的子類實現(xiàn)這些行為。
// 抽象類
abstract class Animal {
// 抽象方法,沒有實現(xiàn)
abstract void makeSound();
}
// Dog 類,繼承自 Animal
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("汪汪! 汪汪!");
}
}
// Cat 類,繼承自 Animal
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("喵! 喵!");
}
}
封裝是將對象的屬性和方法包裝在一起,并隱藏對象的內(nèi)部實現(xiàn)細(xì)節(jié)。
通過訪問修飾符(如 private、protected、public),可以控制對類成員的訪問級別
例如,使用 private 關(guān)鍵字將 name 和 age 屬性設(shè)為私有,并通過公共方法(如 getName() 和 setName())訪問它們
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Animal {
private String name;
private int age;
}
public class Dog extends Animal {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("小黑");
dog.setAge(22);
System.out.println(dog);
}
}
public class Main {
public static void main(String[] args) {
// 創(chuàng)建 Dog 對象并賦給 Animal 類型的變量
Animal animal1 = new Dog();
// 多態(tài)性,調(diào)用的是 Dog 類的 makeSound() 方法
animal1.makeSound(); // 輸出: 汪汪!
// 創(chuàng)建 Cat 對象并賦給 Animal 類型的變量
Animal animal2 = new Cat();
// 多態(tài)性,調(diào)用的是 Cat 類的 makeSound() 方法
animal2.makeSound(); // 輸出: 喵喵!
}
}
// 抽象類
abstract class Animal {
// 抽象方法,沒有實現(xiàn)
abstract void makeSound();
}
// Dog 類,繼承自 Animal
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("汪汪! 汪汪!");
}
}
// Cat 類,繼承自 Animal
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("喵! 喵!");
}
}
接口
- 接口使得設(shè)計更加靈活,允許類實現(xiàn)多個接口,從而在不使用多重繼承的情況下實現(xiàn)多種行為。
- 接口通過將方法的定義與實現(xiàn)分離,可以讓接口的使用者只關(guān)心接口定義的功能,而不關(guān)心具體實現(xiàn)。這種設(shè)計減少了類之間的耦合度,增加了代碼的可維護(hù)性。
- 接口定義了一組規(guī)范,強(qiáng)制實現(xiàn)類必須提供某些方法的實現(xiàn)。這種規(guī)范性可以提高代碼的一致性和可讀性。
- 接口可以很容易地被替換為不同的實現(xiàn),這在編寫測試代碼時尤為重要。可以使用模擬(mock)實現(xiàn)來測試代碼,而不依賴具體的類實現(xiàn)。
- 例子:實現(xiàn)一個簡單的接口案例
- 定義接口
// 接口定義
interface Flyable {
void fly();
}
- 實現(xiàn)接口的類
// Bird 類實現(xiàn)了 Flyable 接口
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("鳥在飛翔");
}
}
// Dog 類沒有實現(xiàn) Flyable 接口
class Dog {
void bark() {
System.out.println("狗在叫");
}
}
- 使用接口的多態(tài)性
public class Main {
public static void main(String[] args) {
// 創(chuàng)建 Bird 對象,并將其賦值給 Flyable 類型的變量
Flyable flyableBird = new Bird();
// 調(diào)用 fly() 方法,實際調(diào)用的是 Bird 的實現(xiàn)
flyableBird.fly(); // 輸出: 鳥在飛翔
// 創(chuàng)建 Dog 對象
Dog dog = new Dog();
dog.bark(); // 輸出: 狗在叫
// 注意:不能將 Dog 對象賦值給 Flyable,因為 Dog 沒有實現(xiàn) Flyable 接口
// Flyable flyableDog = new Dog(); // 這行代碼會編譯錯誤
}
}