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

歡迎訪問 生活随笔!

生活随笔

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

java

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

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

第2節 面向對象進階

一、封裝與private

概述:

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

封裝原則:

隱藏對象的屬性和實現細節,僅對外公開訪問方法,并且控制訪問級別。 我們觀察如下代碼: 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();} }以上的操作代碼并沒有出現語法錯誤,但是出現了邏輯錯誤(年齡)。在開發中,為了避免出現邏輯錯誤,建議對所有屬性進行封裝, 并為其提供setter和getter方法進行設置和取得操作。修改代碼如下: 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();} }這樣,當輸入一個不符合邏輯的年齡時,不會對其賦值,所以保護了成員屬性。

二、this關鍵字

在Java基礎中,this關鍵字是一個最重要的概念,使用this關鍵字可以完成以下的操作:
  • 調用類中的屬性

  • 調用類中的方法或構造方法

????- 在一個構造方法中,調用另一個構造方法時,調用的代碼必須編寫在構造方法的第一行。

  • 表示當前對象
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指的是當前對象*/ class Person3 {private String name;private int age;Person3() {//無參構造方法內調用了全參構造方法this("默認姓名", 1);}Person3(String name, int age) {//this表示當前對象this.name = name;this.age = age;}void say() {System.out.println("姓名:" + this.name + ",年齡:" + this.age);} }

結果如下:

姓名:張三,年齡:18 姓名:李四,年齡:18 姓名:默認姓名,年齡:1

三、static關鍵字

概述:

static表示“靜態”的意思,可以用來修飾成員變量和成員方法 (后續還會學習 靜態代碼塊靜態內部類 )。

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

簡單理解:

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

觀察如下代碼:

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(); // //假設:公司遷址到 天津 // 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修飾的屬性存在方法區中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+",員工所在地區:"+region);}}

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

重點:

  • 靜態成員 在類加載時加載并初始化;

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

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

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

    四、4種代碼塊

  • 普通代碼塊 :在執行的流程中 出現的 代碼塊。

  • 構造代碼塊 :在類中的成員代碼塊,每次對象創建時執行,執行在構造方法之前。

  • 靜態代碼塊 :在類中使用static修飾的成員代碼塊,在類加載時執行。每次程序啟動到關閉,只會執行一次的代碼塊。

  • 同步代碼塊 :后續多線程技術中學習。

  • package com.kaikeba.objectoriented.advanced;public class codeblock {public static void main(String[] args) {/*** 普通代碼塊:編寫在順序執行的代碼流程中的代碼塊*/{System.out.println("==普通代碼塊執行==");}Person4 p1 = new Person4();Person4 p2 = new Person4();{System.out.println("==普通代碼塊執行==");}} }class Person4 {private String name;private int age;/*** 構造代碼塊:隨著對象的每次創建,執行一次,且執行在構造方法之前* 區別于構造方法的是:* 無論用戶調用哪一個構造方法來創建對象,構造代碼塊都必然執行**/{System.out.println("構造代碼塊執行");}/*** 靜態代碼塊,隨著類的加載(第一次使用),靜態代碼塊執行。* 因為類只加載一次,所以靜態代碼塊只執行一次。*/static {System.out.println("\n靜態代碼塊執行\n");}public Person4() {System.out.println("構造方法執行");}public Person4(String name) {System.out.println("構造方法執行");}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);} }

    結果如下:

    ==普通代碼塊執行==靜態代碼塊執行構造代碼塊執行 構造方法執行 構造代碼塊執行 構造方法執行 ==普通代碼塊執行==

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

    構造方法 與 構造代碼塊 與 靜態代碼塊的執行順序:
    靜態代碼塊 —> 構造代碼塊 —> 構造方法

    五、包

    5.1 包介紹

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

  • 包如同文件夾一樣,不同的包中類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。因此,也可以避免名字沖突。

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

  • 5.2 包的使用規則

    包中java文件的定義:

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

    包的定義:

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

    規范由來:

    由于Java面向對象的特性,每名Java開發人員都可以編寫屬于自己的Java Package,為了保障每個JavaPackage命名的唯一性,在最新的Java編程規范中,要求開發人員在自己定義的包名前加上唯一的前綴。由于互聯網上的域名稱是不會重復的,所以多數開發人員采用自己公司在互聯網上的域名稱作為自己程序包的唯一前綴。例如:com.java.xxx

    5.3 import關鍵字

    當需要用到其他包中的類時,可以使用import導入,格式為:`import 包名.類名;`

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

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

    七、main方法詳解

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

    以上的各個參數的含義如下:

    • public:表示公共的內容,可以被所有操作所調用

    • static:表示方法是靜態的,可以由類名稱直接調用。java StaticDemo09

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

    • main:系統規定好的方法名稱。如果main寫錯了或沒有,會報錯:NoSuchMethodError: main

    • String[] args:字符串數組,接收參數的

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

    所有的參數在執行類的時候以空格進行分割。java StaticDemo10 1 2 3 4 5 6 7

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

    總結

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

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