Java從入門到精通之旅類和對象全面解析
一、面向?qū)ο蟪跆?/h2>
1.1 什么是面向?qū)ο螅?/h3>
Java是一門純面向?qū)ο蟮恼Z言(OOP),在面向?qū)ο蟮氖澜缋?,一切皆為對象。面向?qū)ο笫墙鉀Q問題的一種思想,主要依靠對象之間的交互完成一件事情。
面向?qū)ο蟮奶攸c:
- 更符合人類對事物的認知方式
- 對大型程序的設(shè)計、擴展和維護更加友好
- 通過對象之間的交互來完成任務(wù)
1.2 面向?qū)ο?vs 面向過程
讓我們通過洗衣服的例子來理解兩者的區(qū)別:
傳統(tǒng)洗衣服(面向過程):


現(xiàn)代洗衣服(面向?qū)ο?:


對象:人、衣服、洗衣粉、洗衣機交互過程:人將衣服放進洗衣機、倒入洗衣粉、啟動洗衣機
面向?qū)ο蠓绞讲魂P(guān)注具體洗衣過程,而是通過對象間的交互完成任務(wù)。
二、類的定義和使用
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 小練習(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("按時上課,不要遲到,如果請假,及時去補");
}
public void DoHomework() {
System.out.println("教務(wù)系統(tǒng),完成作業(yè),一旦拖沓,神仙難救");
}
public void Exam() {
System.out.println("考試目的,了解學(xué)情,人人必考,暴露問題");
}
}注意事項:
- 一般一個文件只定義一個類
- main方法所在的類通常用public修飾
- public修飾的類必須與文件名相同
- 不要輕易修改public類的名稱
三、類的實例化
3.1 什么是實例化?
用類類型創(chuàng)建對象的過程稱為類的實例化,在Java中使用new關(guān)鍵字。
實例化示例:
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();
}
}輸出結(jié)果:
小黃: 旺旺旺~~~
小黃: 搖尾巴~~~
賽虎: 旺旺旺~~~
賽虎: 搖尾巴~~~
3.2 類和對象的關(guān)系
- 類是一個模型,用于描述實體
- 類是一種自定義類型,可以用來定義變量
- 一個類可以實例化多個對象
- 類比:類就像建筑設(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; // 這里會有歧義
month = month;
day = day;
}
}問題:
- 形參名與成員變量名相同時,賦值語句有歧義
- 多個對象調(diào)用同一方法時,方法如何知道操作的是哪個對象的數(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)前對象的成員變量
this.month = month;
this.day = day;
}
public void printDate() {
System.out.println(this.year + "/" + this.month + "/" + this.day);
}
}4.3 this引用特性
- this的類型:對應(yīng)類類型引用
- this只能在成員方法中使用
- 在成員方法中,this只能引用當(dāng)前對象
- this是成員方法的第一個隱藏參數(shù),編譯器自動傳遞
五、對象的構(gòu)造及初始化
5.1 構(gòu)造方法
構(gòu)造方法是一種特殊成員方法,用于初始化對象。
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); // 自動調(diào)用構(gòu)造方法
d.printDate(); // 輸出:2021-6-9
}
}5.2 構(gòu)造方法特性
- 名字必須與類名相同
- 沒有返回值類型,void也不行
- 創(chuàng)建對象時由編譯器自動調(diào)用,生命周期內(nèi)只調(diào)用一次
- 可以重載
- 用戶未定義時,編譯器生成默認無參構(gòu)造方法
- 構(gòu)造方法中可通過this調(diào)用其他構(gòu)造方法
- 通常使用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 封裝概念
封裝是面向?qū)ο笕筇匦灾?,將?shù)據(jù)和操作數(shù)據(jù)的方法有機結(jié)合,隱藏對象的屬性和實現(xiàn)細節(jié),僅對外公開接口。
舉個栗子??:
計算機廠商在出廠時,在外部套上殼子,將內(nèi)部實現(xiàn)細節(jié)隱藏起來,僅僅對外提供開關(guā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("開機---");
}
}6.3 包(package)
包是對類的封裝機制,用于更好地組織類。(可以理解為目錄)

包的導(dǎo)入:
import java.util.Date; // 導(dǎo)入特定類 import java.util.*; // 導(dǎo)入整個包(不推薦)
自定義包:
package com.example.demo;
public class Test {
// 類內(nèi)容
}七、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)方法特性:
- 屬于類方法
- 推薦通過類名調(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)造代碼塊(實例代碼塊)
定義在類中,用于初始化實例成員變量。
public class Student {
private String name;
private int age;
// 實例代碼塊
{
this.name = "bit";
this.age = 12;
System.out.println("實例代碼塊執(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í)行");
}
}注意事項:
- 靜態(tài)代碼塊只會執(zhí)行一次
- 多個靜態(tài)代碼塊按定義順序執(zhí)行
- 實例代碼塊每次創(chuàng)建對象都會執(zhí)行
九、內(nèi)部類
9.1 實例內(nèi)部類
未用static修飾的成員內(nèi)部類。
public class OutClass {
private int a = 10;
// 實例內(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 局部內(nèi)部類
定義在方法中的內(nèi)部類。
public class OutClass {
public void method() {
class InnerClass {
public void print() {
System.out.println("局部內(nèi)部類");
}
}
InnerClass inner = new InnerClass();
inner.print();
}
}9.4 匿名內(nèi)部類
沒有名字的內(nèi)部類,通常用于實現(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");
}
}十、對象的打印
默認打印對象時輸出的是對象的哈希碼,可以通過重寫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中類和對象的各個方面,包括:
- 類的定義和實例化
- 成員變量和成員方法
- this引用的使用
- 構(gòu)造方法和對象初始化
- 封裝特性和訪問控制
- static成員的使用
- 各種代碼塊的作用
- 內(nèi)部類的分類和使用
- 對象的打印和toString()方法
到此這篇關(guān)于Java從入門到精通之旅類和對象全面解析的文章就介紹到這了,更多相關(guān)java類和對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java如何將任意類型的Object對象轉(zhuǎn)換為相應(yīng)的實體對象
- Java實現(xiàn)對象列表導(dǎo)出為excel表格的實用工具類
- java使用BeanUtils.copyProperties方法對象復(fù)制同名字段類型不同賦值為空問題解決方案
- Java類加載之Class對象到Klass模型詳解
- Java中使用instanceof判斷對象類型的示例
- java如何遍歷對象中的所有屬性(字段)和類型
- Java 中一個類提供一個默認對象的多種方法
- java String類型對象轉(zhuǎn)換為自定義類型對象的實現(xiàn)
- Java?GenericObjectPool?對象池化技術(shù)之SpringBoot?sftp?連接池工具類詳解
- Java redis存Map對象類型數(shù)據(jù)的實現(xiàn)
相關(guān)文章
完美解決idea創(chuàng)建文件時,文件不分級展示的情況
這篇文章主要介紹了完美解決idea創(chuàng)建文件時,文件不分級展示的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
java?Springboot實現(xiàn)教務(wù)管理系統(tǒng)
這篇文章主要介紹了java?Springboot實現(xiàn)教務(wù)管理系統(tǒng)的過程,文章圍繞實現(xiàn)過程展開全文詳細內(nèi)容,具有一定的參考價值,需要的朋友可以參考一下,希望對你有所幫助2021-11-11
Spring?cloud網(wǎng)關(guān)gateway進行websocket路由轉(zhuǎn)發(fā)規(guī)則配置過程
這篇文章主要介紹了Spring?cloud網(wǎng)關(guān)gateway進行websocket路由轉(zhuǎn)發(fā)規(guī)則配置過程,文中還通過實例代碼介紹了Spring?Cloud?Gateway--配置路由的方法,需要的朋友可以參考下2023-04-04
Mybatis實現(xiàn)分包定義數(shù)據(jù)庫的原理與過程
這篇文章主要給大家介紹了關(guān)于Mybatis實現(xiàn)分包定義數(shù)據(jù)庫的原理與過程,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-01-01
Spring Boot中自動執(zhí)行sql腳本的實現(xiàn)
這篇文章主要介紹了Spring Boot中自動執(zhí)行sql腳本的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

