🎁個人主頁:User_芊芊君子
🎉歡迎大家點贊👍評論📝收藏?文章
🔍系列專欄:【Java】內容概括
【前言】
在Java編程中,類和對象是面向對象編程的核心概念。而包(Package)、封裝(Encapsulation)以及代碼塊(Code Block)作為重要的語言特性,在組織代碼結構、保障數據安全和控制代碼執行流程等方面發揮著關鍵作用。本文將通過詳細的代碼示例和圖解,帶大家深入理解這些特性。
文章目錄:
- 一、包(Package)——代碼的“收納盒”
- 1.定義
- 2.導入包中的類
- 3.自定義包
- 3.1 基本規則
- 3.2 使用 IDEA 創建包過程
- 3.3 常見的包
- 3.4 包訪問權限
- 二、封裝
- 1. 什么是封裝
- 2. 代碼演示
- 3. 封裝的好處:
- 4. 訪問限定符詳解
- 三、static 關鍵字
- 1. static 修飾成員變量
- 2. 靜態成員變量的訪問
- 3. static 修飾成員方法
- 4.static 成員變量的初始化
- 四、代碼塊
- 1.普通代碼塊
- 2.構造代碼塊
- 3.靜態代碼塊
一、包(Package)——代碼的“收納盒”
1.定義
包
(Package)是Java中?個組織類的?式,?于防?類名沖突和提?代碼的可讀性。包允許將類組織在?個層次結構中,類似于?件系統中的?錄。- 包是對類、接?等的封裝機制的體現,是?種對類或者接?等的很好的組織?式。類似于
文件夾
。
2.導入包中的類
Java 中已經提供了很多現成的類供我們使?,例如Date
類:可以使?java.util.Date
導?java.util
這個包中的 Date 類.
方法一:寫全路徑導入
public class Test {public static void main(String[] args) {java.util.Date date = new java.util.Date();System.out.println(date.getTime());}
}
方法二:使用import導入
java.util.Date date = new java.util.Date();
上面的寫法就比較麻煩了,我們可以直接使用
import
導入包
import java.util.Date;public class Test {public static void main(String[] args) {// java.util.Date date = new java.util.Date();Date date = new Date();System.out.println(date.getTime());}
}
快捷方式:輸入Date,回車即可
方法三:使用 import java.util.*
導入,就可以使用java.util
中的其他類
import java.util.*;public class Test {public static void main(String[] args) {// java.util.Date date = new java.util.Date();Date date = new Date();System.out.println(date.getTime());}
}
建議顯示的指定要導入的類名,否則容易出現沖突,如下圖:當有兩個包都有Date類時,編譯器就不知道該引入哪個包中的類了
3.自定義包
3.1 基本規則
- 在?件的最上?加上?個
package
語句指定該代碼在哪個包中. - 包名需要盡量指定成唯?的名字, 通常會?公司的域名的顛倒形式(例如
com.bit.demo1
). - 包名要和代碼路徑相匹配. 例如創建com.bit.demo1 的包, 那么會存在?個對應的路徑com/bit/demo1 來存儲代碼.
- 如果?個類沒有 package 語句, 則該類被放到?個默認包中.
3.2 使用 IDEA 創建包過程
- 在 IDEA 中先新建?個包: 右鍵 src -> 新建 -> 包
注意:包名要小寫
- 輸入包名
- 出現 Package 語句
package com.bit.demo1;public class TestDame {
}
3.3 常見的包
java.lang
:系統常?基礎類(String、Object),此包從JDK1.1后?動導?。java.lang.reflect
:java 反射編程包;java.net
:進??絡編程開發包。java.sql
:進?數據庫開發的?持包。java.util
:是java提供的?具程序包。(集合類等) ?常重要java.io
:I/O編程開發包。
3.4 包訪問權限
如果我們在定?個類的時候,如果沒有指定成員變量/成員?法的訪問權限,此時默認的訪問權限就是包訪問權限
。
package com.bit.demo1;public class Computer {private String cpu; //cpuprivate String memory;//內存public String screen; //屏幕String brand; //品牌 包訪問權限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("開機~~~");}public void PowerOff(){System.out.println("關機~~~");}public void SurfInternet(){System.out.println("上網~~~");}
}
package com.bit.dame2;import com.bit.demo1.Computer;import javax.swing.*;public class Tes {public static void main(String[] args) {Computer computer = new Computer("華為","英特爾","8G","三星");System.out.println(computer.brand);System.out.println(computer.screen);System.out.println(computer.cpu);System.out.println(computer.memory);}
}
- public 修飾符
public修飾的成員在哪里都能訪問,它的權限是最大的
public String screen; //屏幕
System.out.println(computer.screen);
- private 修飾符
只能在當前類中使用
- 默認修飾符
只能在dema1包中使用
二、封裝
1. 什么是封裝
- ?向對象程序三?特性:
封裝、繼承、多態
。?類和對象階段,主要研究的就是封裝特性。何為封裝呢?簡單來說就是套殼屏蔽細節。 - 封裝就像是把東西放在?個盒??,并且控制誰可以打開這個盒?,以及如何使?盒??的東西。在編程中,它指的是將數據(屬性)和操作這些數據的?法(函數)包裝在?個單元(通常是類)內。
- ?如:對于電腦這樣?個復雜的設備,提供給??的就只是:開關機、通過鍵盤輸?,顯?器,USB插孔等,讓??來和計算機進?交互,完成?常事務。
- 對于計算機使?者??,不?關?內部核?部件,?如主板上線路是如何布局的,CPU內部是如何設計的等,??只需要知道,怎么開機、怎么通過鍵盤和?標與計算機進?交互即可。因此計算機?商在出?時,在外部套上殼?,將內部實現細節隱藏起來,僅僅對外提供開關機、?標以及鍵盤插孔等,讓??可以與計算機進?交互即可。
封裝
:將數據和操作數據的?法進?有機結合,隱藏對象的屬性和實現細節,僅對外公開接?來和對象進?交互
2. 代碼演示
package com.bit.demo1;public class Computer {private String cpu; //cpuprivate String memory;//內存public String screen; //屏幕String brand; //品牌 包訪問權限public Computer(String brand,String cpu,String memory,String screen){this.brand = brand;this.cpu = cpu;this.memory = memory;this.screen = screen;}public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}public String getMemory() {return memory;}public void setMemory(String memory) {this.memory = memory;}public void Boot(){System.out.println("開機~~~");}public void PowerOff(){System.out.println("關機~~~");}public void SurfInternet(){System.out.println("上網~~~");}
}
package com.bit.dame2;import com.bit.demo1.Computer;import javax.swing.*;public class Tes {public static void main(String[] args) {Computer computer = new Computer("華為","英特爾","8G","三星");System.out.println(computer.getCpu());System.out.println(computer.screen);System.out.println(computer.getMemory());}
}
通過
private
對Computer中的成員變量進行隱藏,但是可以提供get或者set方法,讓內外進行交互(這里編譯器也可以自動生成),方法如下:
3. 封裝的好處:
降低代碼的耦合性
封裝可以降低對象和對象之間的耦合度,當對象內部發?變化時,只需要修改對象內部即可,不會影 響到外部程序,因為公開的接?是不會發?改變的降低代碼的復雜性
封裝是隱藏了對象內部的實現細節,只提供了公開的接?給外部,使?起來更加簡單提?安全性
封裝可以隱藏對象的具體實現細節,阻?外部程序直接訪問對象的內部狀態,從?保護數據不被意外 修改或破壞
4. 訪問限定符詳解
Java中主要通過類和訪問權限來實現封裝:類可以將數據以及封裝數據的?法結合在?起,更符合?類對事物的認知,?訪問權限?來控制?法或者字段能否直接在類外使?。Java中提供了四種訪問限定符:
? public修飾的成員變量,在所指定情況下均是可以正常訪問的
? private修飾的成員變量,只能在當前類中來使?
? default表?什么修飾符都不加,此時只能在包當中才能被訪問
三、static 關鍵字
1. static 修飾成員變量
在Java中,被static
修飾的成員,稱之為靜態成員
,也可以稱為類成員,其不屬于某個具體的對象,是所有對象所共享的
創建一個Student 類,其中包含兩名學生的姓名,年齡和班級(一樣),這時就可以用
static
修飾班級,如下代碼:
package demo;public class Student {public String name;public int age;public static String classRoom;//靜態}
package demo;public class Test {public static void main(String[] args) {Student.classRoom = "1";Student student1 = new Student();student1.name = "lisa";student1.age = 18;Student student2 = new Student();student2.name = "baby";student2.age = 20;System.out.println(Student.classRoom);}
}
執行結果:
【靜態成員變量特性】
- 不屬于某個具體的對象,是類的屬性,所有對象共享的,不存儲在某個對象的空間中
- 既可以通過對象訪問,也可以通過類名訪問,但?般更推薦使?類名訪問
- 類變量存儲在?法區當中
- ?命周期伴隨類的??(即:隨類的加載?創建,隨類的卸載?銷毀)
2. 靜態成員變量的訪問
類名.靜態成員變量的?式進?訪問
System.out.println(Student.classRoom);
3. static 修飾成員方法
Java中,被static修飾的成員?法稱為靜態成員?法,是類的?法,不是某個對象所特有的。靜態成員?般是通過靜態?法來訪問的。
public static String getClassRoom(){return classRoom;}
System.out.println(Student.getClassRoom());
【靜態?法特性】
- 不屬于某個具體的對象,是類?法
- 可以通過對象調?,也可以通過類名.靜態?法名(…)?式調?,更推薦使?后者
- 不能在靜態?法中訪問任何?靜態成員變量
- 靜態?法中不能調?任何?靜態?法,因為?靜態?法有this參數,在靜態?法中調?時候?法傳 遞this引?
public void doClass(){System.out.println("學習");}public static String getClassRoom(){doClass();}
4.static 成員變量的初始化
就地初始化
在定義時直接給出初始值
pubilc class Student{private String name;private static String classRoom = "1"
四、代碼塊
使? {} 定義的?段代碼稱為代碼塊
? 普通代碼塊
? 構造塊(實例代碼塊)
? 靜態塊
? 同步代碼塊(
1.普通代碼塊
普通代碼塊就是定義在方法中的代碼塊
public static void main(String[] args) {int a = 0;System.out.println(a);}
2.構造代碼塊
定義在類中的代碼塊,也叫實例代碼塊,一般用于初始化實例成員變量
public class Student {//實例代碼塊{this.name = "lisi";this.age = 18;System.out.println("實例代碼塊執行");}
public class Test {public static void main(String[] args) {Student student1 = new Student();System.out.println(student1.name);System.out.println(student1.age);}
執行結果
【執行順序】
- 先執行實例代碼塊,再執行對應的構造方法
- 實例成員變量與實例代碼塊,誰在前先執行誰
- 當有靜態代碼塊時,先執行靜態代碼塊,再執行實例代碼塊
3.靜態代碼塊
使?static
定義的代碼塊稱為靜態代碼塊。?般?于初始化靜態成員變量。
public class Student {//實例代碼塊{this.name = "lisi";this.age = 18;System.out.println("實例代碼塊執行");}//靜態代碼塊static {System.out.println("靜態代碼塊被執行");}public class Test {public static void main(String[] args) {Student student1 = new Student();System.out.println(student1.name);System.out.println(student1.age);}
執行結果
注意事項
? 靜態代碼塊不管?成多少個對象,其只會執??次
? 靜態成員變量是類的屬性,因此是在JVM加載類時開辟空間并初始化的
? 如果?個類中包含多個靜態代碼塊,在編譯代碼時,編譯器會按照定義的先后次序依次執?(合并)
? 實例代碼塊只有在創建對象時才會執?
【總結】
- 包管理:遵循反向域名命名,合理劃分模塊
- 封裝設計:屬性私有,方法公開,增加數據校驗
- 代碼塊使用:靜態代碼塊用于類級初始化,實例代碼塊簡化構造邏輯 通過掌握這些特性,開發者能夠編寫出結構清晰、安全可靠的Java程序。希望本文的示例和解析能幫助你更好地理解和應用這些核心概念!
如果對某個知識點有疑問,歡迎在評論區留言交流! 🚀