日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java面向对象(1) —— 封装

發布時間:2023/12/10 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java面向对象(1) —— 封装 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、封裝的概念
  • 二、類的封裝以及使用
  • 三、訪問修飾符
  • 四、屬性封裝的實現
  • 五、方法封裝的實現
  • 六、UML類圖
  • 七、類的構造方法與可重載
  • 八、this關鍵字
  • 九、static關鍵字
  • 十、方法重載:overload
  • 十一、包:package

一、封裝的概念

將字段(C結構體中的屬性)和方法(C結構體中的函數)包裝進類中,加上具體實現的隱藏(訪問修飾符),共同被稱作為封裝,其結果是一個同時帶有特征和行為的數據類型。

定義類,定義其屬性、方法的過程稱為封裝類。

學會從C語言的結構體中轉換概念:

struct Student {int age; //類似與java中的屬性 特征char* name;void (*introduce)(int age,int name,int score); //函數 = 方法void (*testFunc)(); };

二、類的封裝以及使用

//封裝一個類 class Student //寫規范來,第一個字母大寫 {int age; //特征String name; //JAVA中沒有char*double score;void introduce(){ // 方法 = C語言中的函數System.out.println("my name is"+name + "age:"+age + "score"+score);} //面向對象的特性就是方法可以訪問本類的特征屬性,不需要額外的去傳參void testFunc(){System.out.println("testFunc");} }//怎么使用這個類呢? public class Demo1 {public static void main(String[] args) {Student stu1 = new Student(); //這操作叫實例化一個對象//類 = 模板,類不能直接使用,不能直接訪問變量,需要先實例化,申請一個空間。//改成Student stu1 = null,好比C語言的指針使用前不malloc開辟空間/*這操作就等同于在c語言中,我們對結構體指針的定義及訪問struct Student* p;p = malloc(sizeof(struct Student));*/stu1.age = 18;stu1.score = 99.5;stu1.name = "小明"; //不需要像C語言中strcpy賦值stu1.introduce();} }

其中比較重要的概念:

面向對象的特性就是方法可以訪問本類的特征屬性,不需要額外傳參

三、訪問修飾符

訪問修飾符用于信息隱藏,是OOP(Object Oriented Programming面向對象的編程)重要的功能。

隱藏信息的原因:


(1)對模塊的任何實現細節所做的更改不會影響使用該模塊的代碼
(2)防止用戶意外修改數據
(3)使模塊易于維護和使用(就是電腦配件)
(4)規范方法,特征的使用空間


訪問修飾符:訪問權限(通過“.”來訪問),可以看到private是最嚴格的:

位置private默認protectedpublic
同一個類
同一個包(文件)內的類
不同包內的子類
不同包且不是子類

權限怎么理解呢?

下面就以 “只有正確輸入銀行卡密碼才能讀取銀行卡信息” 為例子

四、屬性封裝的實現

封裝屬性:修改屬性的可見性來限制對屬性的訪問。

為每個屬性創建一對賦值方法(getter)和取值(setter)方法,用于公開對這些屬性的訪問接口,在getter和setter方法中,根據需要加入對屬性操作的限制。

舉一個最簡單的例子:

public class Student {private String name; //可以通過下面的方法間接訪問隱私屬性public void setName(String name){this.name = name;}public String getName(){return name;} }

五、方法封裝的實現

方法封裝的目的:隱藏方法實現細節(方法體),向外部提供公開接口(方法頭),以供安全調用;簡化調用,方便修改維護;可以私有化方法,以提供內部使用——幫助方法helper。

先設置自己的真實年齡為36歲,當別人當面問你多少歲時,通過“封裝的”不對外公開的方法修改了自己的真實年齡,再告訴他我18歲。

但是如果直接訪問簡歷上的年齡,通過這個方法訪問到的就是真實年齡36歲

class Age//注意這個類的名字第一個大寫(好習慣),不能跟下面的age一樣 {private int age;void setAge(int realAge){age = realAge;}private void tellAlie(int falseAge){age = falseAge;}void askMyAge()//當別人問我的姓名 假{tellAlie(18); //外部不知道這個方法的存在System.out.println("別人問我我就說我永遠"+age);}void resumeAge() //真{System.out.println("簡歷上是真實年齡:"+age);} } public class Demo3 {public static void main(String[] args) {Age a1 = new Age();a1.setAge(36);a1.resumeAge();//通過這個方法訪問到的是真實年齡a1.askMyAge(); //不對外公開的方法修改了真實年齡} }

六、UML類圖

UML-Unified Modeling Language 統一建模語言,又稱標準建模語言。

(1)類的命名盡量采用應用領域內的術語

(2)類的屬性、操作中的可見性用+ # -分別表示public protected private

七、類的構造方法與可重載

類的構造方法的概念和作用

構造方法負責對象初始化工作,為對象的屬性賦合適的初始值。

在用戶操作對象之前,系統就已經完成了類的構造方法。

構造方法的語法規則

(1)構造方法名與類名一致
(2)沒有返回類型
(3)方法實現主要為特征賦初值

構造方法的調用很特別:實例化對象(new)的時候,自動被調用

java系統保證每個類都有構造方法:如果沒有指明,系統將自動為其分配“空參數”的構造方法。

class Student {private int age;int momAge;String name;float score;Student(int newAge,String newName,float newScore)//方法名字與類名相同{ //構造方法在實例化對象new時會被調用,到時候再傳遞參數//如果不寫,系統自動實現,無參無內容System.out.println("構造方法一被調用");age = newAge;name = newName;score = newScore;}//java中,方法是可重載的,即為函數名一樣,參數列表不同即可,C語言是不允許的Student(String newName){System.out.println("構造方法二被調用");name = newName;}Student(String newName,float newScore){System.out.println("構造方法三被調用");name = newName;score = newScore;}Student(float newScore,String newName) //傳入參數類型不同,調換順序就成為新的構造方法{System.out.println("構造方法四被調用");name = newName;score = newScore;}/* 不能同時有兩個int int類似的構造方法,否則數據混淆,IDEA不給你用Student(int newAge,int newMomAge){System.out.println("構造方法五被調用");age = newAge;momAge = newMomAge;}Student(int newMomAge,int newAge){System.out.println("構造方法五被調用");age = newAge;momAge = newMomAge;}*/ } public class Demo1 {public static void main(String[] args) { //使用哪種構造方法,根據傳入的參數而定(不僅是靠個數判斷)Student stu1 = new Student(20,"小明",100);Student stu2 = new Student("小明");Student stu3 = new Student("小明",100);Student stu4 = new Student(100,"小明");//Student stu5 = new Student(100,100);System.out.println(stu1.name + stu1.score);} }

運行結果:

構造方法一被調用 構造方法二被調用 構造方法三被調用 構造方法四被調用 小明100.0

八、this關鍵字

(1) 調用此方法的對象的引用
(2)可以看做是一個變量,它的值是對當前對象的引用
(3)可以處理方法中的成員變量與形參同名的問題
(4)在類的構造方法中可以調用this([參數列表])來調用該類的指定構造方法

舉例子看看這4個用法:

class student {String name;int age;void thisTest(){//第一種使用方法示例:System.out.println(this.name);//第二種使用方法示例:student stuTemp = null;//臨時的對象,太像結構體指針了stuTemp = this; //把當前對象賦給stuTemp.當前對象:如果是對象stu1,那么就是stu1對象賦給它System.out.println(stuTemp.age);//必須開辟空間(有對象)}//第三種使用方法示例:最常用的解決同名問題/*student(String name,int age){name = name;age = age;} */student(String name,int age){System.out.println("構造方法1被調用了");this.name = name; //name傳給當前對象的namethis.age = age;}//第四種使用方法示例:構造方法中又調用另一個構造方法student(String name){this("小明",21); //this構造方法只能放在第一句!!!System.out.println("構造方法2被調用了");this.name = name;} }public class Demo1 {public static void main(String[] args) {student stu1 = new student("小明");//被指定了使用這個構造方法stu1.thisTest();//thisTest是一種方法,而stu1是調用這個方法的對象//this就是對這個對象的一種引用,引用他的特征,所以//會輸出stu1對象的信息} }

九、static關鍵字

(1)用來修飾類的成員 —— 修飾成員變量的稱為類變量(靜態變量)

(2)用來修飾成員方法 —— 稱之為類方法(靜態方法)


(3)用來修飾語句塊 —— 稱之為靜態代碼塊

靜態代碼塊先于構造方法之前執行,只會執行一次,用來對靜態成員做初始化。當類被加載的時候靜態代碼塊就會被加載,優先于對象的存在。

因為靜態代碼塊的優先于對象存在,所以靜態方法中不能出現this關鍵字:this指的是對象的引用,而static是先于對象存在的

(4)不實例化直接使用類的特征,就是依賴于對象直接對類進行訪問
(5)調用的時候可以直接通過類名.成員來進行訪問。

例子

class Student {String name;int score;static int money; //1、類變量(靜態變量)Student(String name,int score){ //構造方法System.out.println("構造方法");this.name = name;this.score = score;}static { //3、靜態代碼塊的格式要求System.out.println("靜態代碼塊"); //靜態代碼塊優先于構造方法執行money = 5; //并且只執行一次,因為靜態變量同類一起,一開始就存在了(相對于需要創建的對象)} //但構造方法每次在實例化一個對象都會執行/*static void test(){System.out.println(this.name); //靜態方法中不能出現this關鍵字}*/ //因為靜態代碼塊早于對象的創建,而this就是對對象的引用//并且只能對靜態成員做初始化 即moneyvoid introduce(){System.out.println("名字:"+name + " 分數:"+score);} }public class Demo1 {public static void main(String[] args) {Student stu1 = new Student("小明",98);Student stu2 = new Student("陳立臣",100);Student.money = 10; //不通過對象,直接通過類名訪問類的特征。//這個靜態變量優先于對象的存在(當類被加載時,money也就被加載了)//而對象實例化之后才有System.out.println("ret = "+add(1,1));//2、不通過對象,直接訪問類的方法 /*如果不用static,只能new,用對象.方法的方式來訪問Demo1 d1 = new Demo1();System.out.println("ret = "+d1.add(1,1));*/}static int add(int a,int b){ //2、類方法 脫離對象,直接使用方法 優先于對象的存在return a + b;} }

運行結果(注意執行順序!):

靜態代碼塊 構造方法 構造方法 ret = 2

十、方法重載:overload

同一個類中,同名不同參的方法成為重載方法(在上文類的構造方法與可重載中有大量的例子。)

多數程序設計語言(C語言)要求為每個方法(函數)提供一個獨一無二的方法名,不存在方法重載的概念。而在java中,規定方法簽名是解析方法的規則而不是方法名,為方法重載開創了條件。

方法重載使得在一個類中,方法名相同而參數列表不同的方法可同時存在,代表相似的行為或功能。

注意:僅有返回值不同的方法不能成為重載

System.out.print下面有很多的構造方法,也就是方法的重載

十一、包:package

標準java庫是由一系列包組成,包括java.lang ,java.util,java.net等等。

java.lang

java語言的核心,它提供了java中的基礎類。包括基本Object類、Class類、String類、基本類型的包裝類、基本的數學類等等最基本的類。

java.net

和網絡相關

java.util

集合類、時間處理模式、日期時間工具等各類常用工具包

打包的意義:

1、java的包是為了更好地規劃代碼,防止命名沖突和混亂。所以java出現了打包機制。

2、當把類組織起來放進一個包內時,也就給包中的成員賦予了相互訪問的權限

package —— 聲明包

java程序員都可以編寫屬于自己的java包,為了保證包名唯一性,要求程序員在自己定義包的名字前加上唯一前綴。

由于互聯網上的域名名稱不會重復,所以推薦采用公司在互聯網上的域名的倒置作為包的唯一前綴,如 com.iotek.ch09(倒置,當然這也不是絕對的啦)

一個類可以使用同一個包中的所有類
一個類可以使用其他包中的所有公開類

怎樣使用其他包中的公開類?

①在每個類的簽名之前加上完整包名,例如:

java.util.Data today = new java.util.Date();
  • 1

②更簡潔更通用的方式:使用import語句來導包(ctrl +shift +O快捷導入)

import java.util.Date
  • 1

實際地去做一個包

一個類可以使用同一個包中的所有類,不同包之間記得前面加上public


同一個工程中盡量避免出現兩個完全一樣的類名。容易混淆,雖然有解決的辦法(導包)。

同一個類、同一個包、同一個工程。

總結

以上是生活随笔為你收集整理的Java面向对象(1) —— 封装的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。