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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)

發(fā)布時間:2024/7/23 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第2節(jié) 面向?qū)ο筮M(jìn)階

一、封裝與private

概述:

封裝的意義在于保護(hù)或者防止代碼(數(shù)據(jù))被我們無意中破壞。保護(hù)成員屬性,不讓類以外的程序直接訪問和修改。

封裝原則:

隱藏對象的屬性和實現(xiàn)細(xì)節(jié),僅對外公開訪問方法,并且控制訪問級別。 我們觀察如下代碼: class Person {private String name; //表示姓名private int age; //表示年齡void tell() {System.out.println("姓名:"+name+",年齡:"+age);} }public class Demo {public static void main(String args[]) {Person per = new Person();per.name = "張三";per.age = -30;per.tell();} }以上的操作代碼并沒有出現(xiàn)語法錯誤,但是出現(xiàn)了邏輯錯誤(年齡)。在開發(fā)中,為了避免出現(xiàn)邏輯錯誤,建議對所有屬性進(jìn)行封裝, 并為其提供setter和getter方法進(jìn)行設(shè)置和取得操作。修改代碼如下: class Person {private String name;private int age;void tell() {System.out.println("姓名:" + getName() + ",年齡:" + getAge());}public void setName(String str) {name = str;}public void setAge(int a) {if(a>0&&a<150) {age = a;}}public String getName() {return name;}public int getAge() {return age;} } public class OODemo10 {public static void main(String args[]) {Person per = new Person();per.setName("張三");per.setAge(-30);per.tell();} }這樣,當(dāng)輸入一個不符合邏輯的年齡時,不會對其賦值,所以保護(hù)了成員屬性。

二、this關(guān)鍵字

在Java基礎(chǔ)中,this關(guān)鍵字是一個最重要的概念,使用this關(guān)鍵字可以完成以下的操作:
  • 調(diào)用類中的屬性

  • 調(diào)用類中的方法或構(gòu)造方法

????- 在一個構(gòu)造方法中,調(diào)用另一個構(gòu)造方法時,調(diào)用的代碼必須編寫在構(gòu)造方法的第一行。

  • 表示當(dāng)前對象
package com.kaikeba.objectoriented.advanced;public class thiskeyword {public static void main(String[] args) {Person3 p1 = new Person3("張三", 18);Person3 p2 = new Person3("李四", 18);p1.say();p2.say();Person3 p3 = new Person3();p3.say();} }/*** this指的是當(dāng)前對象*/ class Person3 {private String name;private int age;Person3() {//無參構(gòu)造方法內(nèi)調(diào)用了全參構(gòu)造方法this("默認(rèn)姓名", 1);}Person3(String name, int age) {//this表示當(dāng)前對象this.name = name;this.age = age;}void say() {System.out.println("姓名:" + this.name + ",年齡:" + this.age);} }

結(jié)果如下:

姓名:張三,年齡:18 姓名:李四,年齡:18 姓名:默認(rèn)姓名,年齡:1

三、static關(guān)鍵字

概述:

static表示“靜態(tài)”的意思,可以用來修飾成員變量和成員方法 (后續(xù)還會學(xué)習(xí) 靜態(tài)代碼塊靜態(tài)內(nèi)部類 )。

static的主要作用在于創(chuàng)建獨立于具體對象的域變量或者方法。

簡單理解:

被static關(guān)鍵字修飾的方法或者變量不需要依賴于對象來進(jìn)行訪問,只要類被加載了,就可以通過類名去進(jìn)行訪問。并且不會因為對象的多次創(chuàng)建而在內(nèi)存中建立多份數(shù)據(jù)。

觀察如下代碼:

package com.kaikeba.objectoriented.advanced;public class statickeyword {public static void main(String[] args) { // Emp e1 = new Emp("張三", "北京"); // Emp e2 = new Emp("李四", "北京"); // Emp e3 = new Emp("王五", "北京"); // Emp e4 = new Emp("趙六", "北京");Emp.region = "北京";Emp e1 = new Emp("張三");Emp e2 = new Emp("李四");Emp e3 = new Emp("王五");Emp e4 = new Emp("趙六");e1.say();e2.say();e3.say();e4.say(); // //假設(shè):公司遷址到 天津 // e1.setRegion("天津"); // e2.setRegion("天津"); // e3.setRegion("天津"); // e4.setRegion("天津");Emp.region = "天津";e1.say();e2.say();e3.say();e4.say();} }class Emp {//不帶static的可以理解為對象的屬性,帶static的可以理解為類的屬性private String name;static String region; //static修飾的屬性存在方法區(qū)中Emp(String name, String region) {this.name = name;this.region = region;}Emp(String name) {this.name = name;}Emp(){}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getRegion() {return region;}public void setRegion(String region) {this.region = region;}void say() {System.out.println("員工姓名:"+name+",員工所在地區(qū):"+region);}}

其內(nèi)存的存儲如下所示,static修飾的region屬性或方法,被存儲在方法區(qū)中,類被加載的時候,就已經(jīng)在方法區(qū)中開辟,且只會開辟一次,一般是通過類名來設(shè)置或修改,通過對象名也可以,但是它會把所有對象的這個屬性都改了。

重點:

  • 靜態(tài)成員 在類加載時加載并初始化;

  • 無論一個類存在多少個對象,靜態(tài)的屬性,永遠(yuǎn)在內(nèi)存中只有一份(可以理解為所有對象公用);

  • 在訪問時:靜態(tài)不能訪問非靜態(tài),非靜態(tài)可以訪問靜態(tài) ,因為靜態(tài)比非靜態(tài)先創(chuàng)建,如下面的代碼所示:

  • package com.kaikeba.objectoriented.advanced;public class statickeyword3 {public static void main(String[] args) {StaticDemo.say();} }class StaticDemo {/*** 通過類名來調(diào)用,對象名也行,因為創(chuàng)建對象要先加載類* 靜態(tài)修飾的方法,被調(diào)用時,有可能對象還未創(chuàng)建*/static void say() {System.out.println("勇敢牛牛,不怕困難");}/*** 通過對象來調(diào)用* 非靜態(tài)方法可以調(diào)用靜態(tài)方法,反之不行(先后創(chuàng)建順序)*/void say2() {System.out.println("鋤禾日當(dāng)午");say();} }

    四、4種代碼塊

  • 普通代碼塊 :在執(zhí)行的流程中 出現(xiàn)的 代碼塊。

  • 構(gòu)造代碼塊 :在類中的成員代碼塊,每次對象創(chuàng)建時執(zhí)行,執(zhí)行在構(gòu)造方法之前。

  • 靜態(tài)代碼塊 :在類中使用static修飾的成員代碼塊,在類加載時執(zhí)行。每次程序啟動到關(guān)閉,只會執(zhí)行一次的代碼塊。

  • 同步代碼塊 :后續(xù)多線程技術(shù)中學(xué)習(xí)。

  • package com.kaikeba.objectoriented.advanced;public class codeblock {public static void main(String[] args) {/*** 普通代碼塊:編寫在順序執(zhí)行的代碼流程中的代碼塊*/{System.out.println("==普通代碼塊執(zhí)行==");}Person4 p1 = new Person4();Person4 p2 = new Person4();{System.out.println("==普通代碼塊執(zhí)行==");}} }class Person4 {private String name;private int age;/*** 構(gòu)造代碼塊:隨著對象的每次創(chuàng)建,執(zhí)行一次,且執(zhí)行在構(gòu)造方法之前* 區(qū)別于構(gòu)造方法的是:* 無論用戶調(diào)用哪一個構(gòu)造方法來創(chuàng)建對象,構(gòu)造代碼塊都必然執(zhí)行**/{System.out.println("構(gòu)造代碼塊執(zhí)行");}/*** 靜態(tài)代碼塊,隨著類的加載(第一次使用),靜態(tài)代碼塊執(zhí)行。* 因為類只加載一次,所以靜態(tài)代碼塊只執(zhí)行一次。*/static {System.out.println("\n靜態(tài)代碼塊執(zhí)行\(zhòng)n");}public Person4() {System.out.println("構(gòu)造方法執(zhí)行");}public Person4(String name) {System.out.println("構(gòu)造方法執(zhí)行");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}void say() {System.out.println("姓名:"+name+",年齡:"+age);} }

    結(jié)果如下:

    ==普通代碼塊執(zhí)行==靜態(tài)代碼塊執(zhí)行構(gòu)造代碼塊執(zhí)行 構(gòu)造方法執(zhí)行 構(gòu)造代碼塊執(zhí)行 構(gòu)造方法執(zhí)行 ==普通代碼塊執(zhí)行==

    從上面的代碼可以看出一個常考的知識點:

    構(gòu)造方法 與 構(gòu)造代碼塊 與 靜態(tài)代碼塊的執(zhí)行順序:
    靜態(tài)代碼塊 —> 構(gòu)造代碼塊 —> 構(gòu)造方法

    五、包

    5.1 包介紹

  • 把功能相似或相關(guān)的類或接口組織在同一個包中,方便類的查找和使用;

  • 包如同文件夾一樣,不同的包中類的名字是可以相同的,當(dāng)同時調(diào)用兩個不同包中相同類名的類時,應(yīng)該加上包名加以區(qū)別。因此,也可以避免名字沖突。

  • 包也限定了訪問權(quán)限,擁有包訪問權(quán)限的類才能訪問某個包中的類。

  • 5.2 包的使用規(guī)則

    包中java文件的定義:

    在.java文件的首部,必須編寫類所屬哪個包,格式:`package 包名;`

    包的定義:

    通常由多個單詞組成,所有單詞的字母小寫,單詞與單詞之間使用 . 隔開,一般命名為“com.公司名.項目名.模塊名...”。

    規(guī)范由來:

    由于Java面向?qū)ο蟮奶匦?#xff0c;每名Java開發(fā)人員都可以編寫屬于自己的Java Package,為了保障每個JavaPackage命名的唯一性,在最新的Java編程規(guī)范中,要求開發(fā)人員在自己定義的包名前加上唯一的前綴。由于互聯(lián)網(wǎng)上的域名稱是不會重復(fù)的,所以多數(shù)開發(fā)人員采用自己公司在互聯(lián)網(wǎng)上的域名稱作為自己程序包的唯一前綴。例如:com.java.xxx

    5.3 import關(guān)鍵字

    當(dāng)需要用到其他包中的類時,可以使用import導(dǎo)入,格式為:`import 包名.類名;`

    六、權(quán)限修飾符(記住訪問范圍)

    權(quán)限修飾符可以修飾java中所有可以訪問的資源,比如類中的屬性、方法、構(gòu)造方法;給資源添加了一個訪問權(quán)限,有如下四種權(quán)限修飾符:

    七、main方法詳解

    main()方法一直寫到了今天:public static void main(String args[])

    以上的各個參數(shù)的含義如下:

    • public:表示公共的內(nèi)容,可以被所有操作所調(diào)用

    • static:表示方法是靜態(tài)的,可以由類名稱直接調(diào)用。java StaticDemo09

    • void:表示沒有任何的返回值操作

    • main:系統(tǒng)規(guī)定好的方法名稱。如果main寫錯了或沒有,會報錯:NoSuchMethodError: main

    • String[] args:字符串?dāng)?shù)組,接收參數(shù)的

    public class StaticDemo10{ public static void main(String args[]){ for(int i=0;i<args.length;i++){ System.out.println(args[i]) ; } } };

    所有的參數(shù)在執(zhí)行類的時候以空格進(jìn)行分割。java StaticDemo10 1 2 3 4 5 6 7

    但是,如果現(xiàn)在我要輸入的是以下幾種參數(shù)“hello world”、“hello vince”、“hello mjw”。因為以空格分割,所以以上的三組參數(shù)會當(dāng)做六組參數(shù)輸入,那么此時如果要想完成有空格的內(nèi)容輸入,則參數(shù)需 要使用“"”括起來。java StaticDemo10 "hello world" "hello vince" "hello mjw"

    總結(jié)

    以上是生活随笔為你收集整理的JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。