基本概念
Java 面向?qū)ο缶幊?(Object-Oriented Programming, OOP) 是一種編程范式宋渔,旨在通過(guò)對(duì)象的概念來(lái)組織程序的設(shè)計(jì)和開發(fā)狼纬。OOP 是 Java 語(yǔ)言的核心特點(diǎn)诞仓,它幫助開發(fā)者更好地管理和組織代碼洒沦,使代碼更易于理解幕与、維護(hù)和重用挑势。
面向?qū)ο笏拇蠡咎匦?/h1>
一. 封裝
封裝是將對(duì)象的屬性和方法包裝在一起,并隱藏對(duì)象的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)啦鸣。
通過(guò)訪問(wèn)修飾符(如 private潮饱、protected、public)诫给,可以控制對(duì)類成員的訪問(wèn)級(jí)別
例如香拉,使用 private 關(guān)鍵字將 name 和 age 屬性設(shè)為私有,并通過(guò)公共方法(如 getName() 和 setName())訪問(wèn)它們
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
二.繼承
- 繼承允許一個(gè)類從另一個(gè)類繼承屬性和方法中狂,促進(jìn)代碼的重用和層次化設(shè)計(jì)凫碌。
- 子類可以繼承父類的特性,并且可以添加新的特性或重寫父類的特性胃榕。
- java中實(shí)現(xiàn)單繼承盛险,而無(wú)法實(shí)現(xiàn)多繼承(只能有一個(gè)父親)但是可以實(shí)現(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)允許對(duì)象在不同情境下以不同的形式表現(xiàn)苦掘。Java 支持方法重載(Overloading)和方法重寫(Overriding),這是多態(tài)的兩種實(shí)現(xiàn)方式楔壤。
- 例如鹤啡,可以重寫父類的方法,使得子類具有不同的行為蹲嚣。
public class Main {
public static void main(String[] args) {
// 創(chuàng)建 Dog 對(duì)象并賦給 Animal 類型的變量
Animal animal1 = new Dog();
// 多態(tài)性递瑰,調(diào)用的是 Dog 類的 makeSound() 方法
animal1.makeSound(); // 輸出: 汪汪!
// 創(chuàng)建 Cat 對(duì)象并賦給 Animal 類型的變量
Animal animal2 = new Cat();
// 多態(tài)性祟牲,調(diào)用的是 Cat 類的 makeSound() 方法
animal2.makeSound(); // 輸出: 喵喵!
}
}
四. 抽象
- 抽象是指通過(guò)抽象類或接口,定義對(duì)象的抽象特性泣矛,而不具體實(shí)現(xiàn)細(xì)節(jié)疲眷。
- 抽象類不能實(shí)例化,它們通常用來(lái)定義通用的行為您朽,由具體的子類實(shí)現(xiàn)這些行為。
// 抽象類
abstract class Animal {
// 抽象方法换淆,沒(méi)有實(shí)現(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("喵! 喵!");
}
}
封裝是將對(duì)象的屬性和方法包裝在一起,并隱藏對(duì)象的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)啦鸣。
通過(guò)訪問(wèn)修飾符(如 private潮饱、protected、public)诫给,可以控制對(duì)類成員的訪問(wèn)級(jí)別
例如香拉,使用 private 關(guān)鍵字將 name 和 age 屬性設(shè)為私有,并通過(guò)公共方法(如 getName() 和 setName())訪問(wèn)它們
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 對(duì)象并賦給 Animal 類型的變量
Animal animal1 = new Dog();
// 多態(tài)性递瑰,調(diào)用的是 Dog 類的 makeSound() 方法
animal1.makeSound(); // 輸出: 汪汪!
// 創(chuàng)建 Cat 對(duì)象并賦給 Animal 類型的變量
Animal animal2 = new Cat();
// 多態(tài)性祟牲,調(diào)用的是 Cat 類的 makeSound() 方法
animal2.makeSound(); // 輸出: 喵喵!
}
}
// 抽象類
abstract class Animal {
// 抽象方法换淆,沒(méi)有實(shí)現(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è)計(jì)更加靈活倍试,允許類實(shí)現(xiàn)多個(gè)接口讯屈,從而在不使用多重繼承的情況下實(shí)現(xiàn)多種行為。
- 接口通過(guò)將方法的定義與實(shí)現(xiàn)分離县习,可以讓接口的使用者只關(guān)心接口定義的功能涮母,而不關(guān)心具體實(shí)現(xiàn)。這種設(shè)計(jì)減少了類之間的耦合度躁愿,增加了代碼的可維護(hù)性叛本。
- 接口定義了一組規(guī)范,強(qiáng)制實(shí)現(xiàn)類必須提供某些方法的實(shí)現(xiàn)彤钟。這種規(guī)范性可以提高代碼的一致性和可讀性来候。
- 接口可以很容易地被替換為不同的實(shí)現(xiàn),這在編寫測(cè)試代碼時(shí)尤為重要逸雹∮粒可以使用模擬(mock)實(shí)現(xiàn)來(lái)測(cè)試代碼,而不依賴具體的類實(shí)現(xiàn)梆砸。
- 例子:實(shí)現(xiàn)一個(gè)簡(jiǎn)單的接口案例
- 定義接口
// 接口定義
interface Flyable {
void fly();
}
- 實(shí)現(xiàn)接口的類
// Bird 類實(shí)現(xiàn)了 Flyable 接口
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("鳥在飛翔");
}
}
// Dog 類沒(méi)有實(shí)現(xiàn) Flyable 接口
class Dog {
void bark() {
System.out.println("狗在叫");
}
}
- 使用接口的多態(tài)性
public class Main {
public static void main(String[] args) {
// 創(chuàng)建 Bird 對(duì)象转质,并將其賦值給 Flyable 類型的變量
Flyable flyableBird = new Bird();
// 調(diào)用 fly() 方法,實(shí)際調(diào)用的是 Bird 的實(shí)現(xiàn)
flyableBird.fly(); // 輸出: 鳥在飛翔
// 創(chuàng)建 Dog 對(duì)象
Dog dog = new Dog();
dog.bark(); // 輸出: 狗在叫
// 注意:不能將 Dog 對(duì)象賦值給 Flyable帖世,因?yàn)?Dog 沒(méi)有實(shí)現(xiàn) Flyable 接口
// Flyable flyableDog = new Dog(); // 這行代碼會(huì)編譯錯(cuò)誤
}
}