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