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關鍵字可以完成以下的操作:-
調用類中的屬性
-
調用類中的方法或構造方法
????- 在一個構造方法中,調用另一個構造方法時,調用的代碼必須編寫在構造方法的第一行。
- 表示當前對象
結果如下:
姓名:張三,年齡: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屬性或方法,被存儲在方法區中,類被加載的時候,就已經在方法區中開辟,且只會開辟一次,一般是通過類名來設置或修改,通過對象名也可以,但是它會把所有對象的這個屬性都改了。
重點:
靜態成員 在類加載時加載并初始化;
無論一個類存在多少個對象,靜態的屬性,永遠在內存中只有一份(可以理解為所有對象公用);
在訪問時:靜態不能訪問非靜態,非靜態可以訪問靜態 ,因為靜態比非靜態先創建,如下面的代碼所示:
四、4種代碼塊
普通代碼塊 :在執行的流程中 出現的 代碼塊。
構造代碼塊 :在類中的成員代碼塊,每次對象創建時執行,執行在構造方法之前。
靜態代碼塊 :在類中使用static修飾的成員代碼塊,在類加載時執行。每次程序啟動到關閉,只會執行一次的代碼塊。
同步代碼塊 :后續多線程技術中學習。
結果如下:
==普通代碼塊執行==靜態代碼塊執行構造代碼塊執行 構造方法執行 構造代碼塊執行 構造方法執行 ==普通代碼塊執行==從上面的代碼可以看出一個常考的知識點:
構造方法 與 構造代碼塊 與 靜態代碼塊的執行順序:
靜態代碼塊 —> 構造代碼塊 —> 構造方法
五、包
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:字符串數組,接收參數的
所有的參數在執行類的時候以空格進行分割。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方法详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于相机标定的简单介绍
- 下一篇: batch批处理程序easyadd——追