Java從入門到精通之旅類和對象全面解析
一、面向對象初探
1.1 什么是面向對象?
Java是一門純面向對象的語言(OOP),在面向對象的世界里,一切皆為對象。面向對象是解決問題的一種思想,主要依靠對象之間的交互完成一件事情。
面向對象的特點:
- 更符合人類對事物的認知方式
- 對大型程序的設計、擴展和維護更加友好
- 通過對象之間的交互來完成任務
1.2 面向對象 vs 面向過程
讓我們通過洗衣服的例子來理解兩者的區(qū)別:
傳統(tǒng)洗衣服(面向過程):
現(xiàn)代洗衣服(面向對象):
對象:人、衣服、洗衣粉、洗衣機交互過程:人將衣服放進洗衣機、倒入洗衣粉、啟動洗衣機
面向對象方式不關注具體洗衣過程,而是通過對象間的交互完成任務。
二、類的定義和使用
2.1 什么是類?
類是用來對一個實體(對象)進行描述的,主要描述該實體具有哪些屬性(外觀尺寸等)和哪些功能(用來做什么)。
例如,洗衣機類的屬性和功能:
- 屬性:品牌、型號、重量、尺寸、顏色等
- 功能:洗衣、烘干、定時等
2.2 類的定義格式
// 創(chuàng)建類 class ClassName { field; // 字段(屬性)或成員變量 method; // 行為或成員方法 }
洗衣機類示例:
class WashMachine { // 成員變量(屬性) public String brand; // 品牌 public String type; // 型號 public double weight; // 重量 public double length; // 長 public double width; // 寬 public double height; // 高 public String color; // 顏色 // 成員方法(功能) public void washClothes() { // 洗衣服 System.out.println("洗衣功能"); } public void dryClothes() { // 脫水 System.out.println("脫水功能"); } public void setTime() { // 定時 System.out.println("定時功能"); } }
2.3 小練習
2.3.1 定義狗類
class PetDog { // 屬性 public String name; // 名字 public String color; // 顏色 // 行為 public void bark() { System.out.println(name + ":旺旺旺~~"); } public void wag() { System.out.println(name + ":搖尾巴~~"); } }
2.3.2 定義學生類
public class Student { // 屬性 public String name; public String gender; public short age; public double score; // 方法 public void DoClass() { System.out.println("按時上課,不要遲到,如果請假,及時去補"); } public void DoHomework() { System.out.println("教務系統(tǒng),完成作業(yè),一旦拖沓,神仙難救"); } public void Exam() { System.out.println("考試目的,了解學情,人人必考,暴露問題"); } }
注意事項:
- 一般一個文件只定義一個類
- main方法所在的類通常用public修飾
- public修飾的類必須與文件名相同
- 不要輕易修改public類的名稱
三、類的實例化
3.1 什么是實例化?
用類類型創(chuàng)建對象的過程稱為類的實例化,在Java中使用new
關鍵字。
實例化示例:
class PetDog { public String name; public String color; public void bark() { System.out.println(name + ":旺旺旺~~~"); } public void wag() { System.out.println(name + ":搖尾巴~~~"); } } public class Main { public static void main(String[] args) { // 通過new實例化對象 PetDog dogH = new PetDog(); dogH.name = "小黃"; dogH.color = "黑黃"; dogH.bark(); dogH.wag(); PetDog dogS = new PetDog(); dogS.name = "賽虎"; dogS.color = "棕色"; dogS.bark(); dogS.wag(); } }
輸出結果:
小黃: 旺旺旺~~~
小黃: 搖尾巴~~~
賽虎: 旺旺旺~~~
賽虎: 搖尾巴~~~
3.2 類和對象的關系
- 類是一個模型,用于描述實體
- 類是一種自定義類型,可以用來定義變量
- 一個類可以實例化多個對象
- 類比:類就像建筑設計圖,對象是根據(jù)設計圖建造的實際房子
四、this引用
4.1 為什么需要this引用?
考慮以下日期類:
public class Date { public int year; public int month; public int day; public void setDay(int year, int month, int day) { year = year; // 這里會有歧義 month = month; day = day; } }
問題:
- 形參名與成員變量名相同時,賦值語句有歧義
- 多個對象調用同一方法時,方法如何知道操作的是哪個對象的數(shù)據(jù)?
4.2 this引用解決方案
public class Date { public int year; public int month; public int day; public void setDay(int year, int month, int day) { this.year = year; // 使用this明確指向當前對象的成員變量 this.month = month; this.day = day; } public void printDate() { System.out.println(this.year + "/" + this.month + "/" + this.day); } }
4.3 this引用特性
- this的類型:對應類類型引用
- this只能在成員方法中使用
- 在成員方法中,this只能引用當前對象
- this是成員方法的第一個隱藏參數(shù),編譯器自動傳遞
五、對象的構造及初始化
5.1 構造方法
構造方法是一種特殊成員方法,用于初始化對象。
public class Date { public int year; public int month; public int day; // 構造方法 public Date(int year, int month, int day) { this.year = year; this.month = month; this.day = day; System.out.println("Date(int,int,int)方法被調用了"); } public void printDate() { System.out.println(year + "-" + month + "-" + day); } public static void main(String[] args) { Date d = new Date(2021, 6, 9); // 自動調用構造方法 d.printDate(); // 輸出:2021-6-9 } }
5.2 構造方法特性
- 名字必須與類名相同
- 沒有返回值類型,void也不行
- 創(chuàng)建對象時由編譯器自動調用,生命周期內只調用一次
- 可以重載
- 用戶未定義時,編譯器生成默認無參構造方法
- 構造方法中可通過this調用其他構造方法
- 通常使用public修飾
5.3 默認初始化和就地初始化
默認初始化:成員變量未顯式初始化時,Java會賦予默認值
數(shù)據(jù)類型 | 默認值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0 |
char | ‘\u0000’ |
boolean | false |
reference | null |
就地初始化:聲明成員變量時直接賦初值
public class Date { public int year = 1900; public int month = 1; public int day = 1; // ... }
六、封裝
6.1 封裝概念
封裝是面向對象三大特性之一,將數(shù)據(jù)和操作數(shù)據(jù)的方法有機結合,隱藏對象的屬性和實現(xiàn)細節(jié),僅對外公開接口。
舉個栗子??:
計算機廠商在出廠時,在外部套上殼子,將內部實現(xiàn)細節(jié)隱藏起來,僅僅對外提供開關機、鼠標以及鍵盤插孔等,讓用戶可以與計算機進行交互即可。
6.2 訪問限定符
Java提供四種訪問權限:
封裝示例:
public class Computer { private String cpu; // private: 僅本類可訪問 private String memory; // private: 僅本類可訪問 public String screen; // public: 任何類可訪問 String brand; // default: 同包可訪問 public Computer(String brand, String cpu, String memory, String screen) { this.brand = brand; this.cpu = cpu; this.memory = memory; this.screen = screen; } public void Boot() { System.out.println("開機---"); } }
6.3 包(package)
包是對類的封裝機制,用于更好地組織類。(可以理解為目錄)
包的導入:
import java.util.Date; // 導入特定類 import java.util.*; // 導入整個包(不推薦)
自定義包:
package com.example.demo; public class Test { // 類內容 }
七、static成員
7.1 static修飾成員變量
static修飾的成員變量屬于類,所有對象共享。
public class Student { private String name; private static String classRoom = "Bit306"; // 靜態(tài)成員變量 public static String getClassRoom() { return classRoom; } } public class Test { public static void main(String[] args) { System.out.println(Student.getClassRoom()); // 輸出:Bit306 } }
7.2 static修飾成員方法
靜態(tài)方法屬于類,不依賴于特定對象實例。
public class Student { private static String classRoom = "Bit306"; public static String getClassRoom() { return classRoom; } }
靜態(tài)方法特性:
- 屬于類方法
- 推薦通過類名調用
- 不能訪問非靜態(tài)成員變量
- 不能調用非靜態(tài)方法
- 無法重寫
八、代碼塊
8.1 普通代碼塊
定義在方法中的代碼塊。
public class Main { public static void main(String[] args) { { int x = 10; System.out.println("x1 = " + x); } int x = 100; System.out.println("x2 = " + x); } }
8.2 構造代碼塊(實例代碼塊)
定義在類中,用于初始化實例成員變量。
public class Student { private String name; private int age; // 實例代碼塊 { this.name = "bit"; this.age = 12; System.out.println("實例代碼塊執(zhí)行"); } public Student() { System.out.println("構造方法執(zhí)行"); } }
8.3 靜態(tài)代碼塊
使用static定義,用于初始化靜態(tài)成員變量。
public class Student { private static String classRoom; // 靜態(tài)代碼塊 static { classRoom = "bit306"; System.out.println("靜態(tài)代碼塊執(zhí)行"); } }
注意事項:
- 靜態(tài)代碼塊只會執(zhí)行一次
- 多個靜態(tài)代碼塊按定義順序執(zhí)行
- 實例代碼塊每次創(chuàng)建對象都會執(zhí)行
九、內部類
9.1 實例內部類
未用static修飾的成員內部類。
public class OutClass { private int a = 10; // 實例內部類 class InnerClass { public void print() { System.out.println(a); // 可以直接訪問外部類成員 } } }
9.2 靜態(tài)內部類
用static修飾的成員內部類。
public class OutClass { private static int b = 20; // 靜態(tài)內部類 static class InnerClass { public void print() { System.out.println(b); // 只能訪問外部類靜態(tài)成員 } } }
9.3 局部內部類
定義在方法中的內部類。
public class OutClass { public void method() { class InnerClass { public void print() { System.out.println("局部內部類"); } } InnerClass inner = new InnerClass(); inner.print(); } }
9.4 匿名內部類
沒有名字的內部類,通常用于實現(xiàn)接口或抽象類。
interface Message { void send(String msg); } public class Test { public static void main(String[] args) { Message m = new Message() { // 匿名內部類 @Override public void send(String msg) { System.out.println("發(fā)送消息:" + msg); } }; m.send("Hello"); } }
十、對象的打印
默認打印對象時輸出的是對象的哈希碼,可以通過重寫toString()方法自定義輸出。
public class Person { String name; String gender; int age; public Person(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; } @Override public String toString() { return "Person[name=" + name + ", gender=" + gender + ", age=" + age + "]"; } public static void main(String[] args) { Person p = new Person("張三", "男", 25); System.out.println(p); // 輸出:Person[name=張三, gender=男, age=25] } }
總結
本文全面介紹了Java中類和對象的各個方面,包括:
- 類的定義和實例化
- 成員變量和成員方法
- this引用的使用
- 構造方法和對象初始化
- 封裝特性和訪問控制
- static成員的使用
- 各種代碼塊的作用
- 內部類的分類和使用
- 對象的打印和toString()方法
到此這篇關于Java從入門到精通之旅類和對象全面解析的文章就介紹到這了,更多相關java類和對象內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Java如何將任意類型的Object對象轉換為相應的實體對象
- Java實現(xiàn)對象列表導出為excel表格的實用工具類
- java使用BeanUtils.copyProperties方法對象復制同名字段類型不同賦值為空問題解決方案
- Java類加載之Class對象到Klass模型詳解
- Java中使用instanceof判斷對象類型的示例
- java如何遍歷對象中的所有屬性(字段)和類型
- Java 中一個類提供一個默認對象的多種方法
- java String類型對象轉換為自定義類型對象的實現(xiàn)
- Java?GenericObjectPool?對象池化技術之SpringBoot?sftp?連接池工具類詳解
- Java redis存Map對象類型數(shù)據(jù)的實現(xiàn)
相關文章
Spring AOP里的靜態(tài)代理和動態(tài)代理用法詳解
這篇文章主要介紹了 Spring AOP里的靜態(tài)代理和動態(tài)代理用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07SpringBoot+ThreadLocal+AbstractRoutingDataSource實現(xiàn)動態(tài)切換數(shù)據(jù)源
最近在做業(yè)務需求時,需要從不同的數(shù)據(jù)庫中獲取數(shù)據(jù)然后寫入到當前數(shù)據(jù)庫中,因此涉及到切換數(shù)據(jù)源問題,所以本文采用ThreadLocal+AbstractRoutingDataSource來模擬實現(xiàn)dynamic-datasource-spring-boot-starter中線程數(shù)據(jù)源切換,需要的朋友可以參考下2023-08-08