JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)
第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)前對象
結(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)建,如下面的代碼所示:
四、4種代碼塊
普通代碼塊 :在執(zhí)行的流程中 出現(xiàn)的 代碼塊。
構(gòu)造代碼塊 :在類中的成員代碼塊,每次對象創(chuàng)建時執(zhí)行,執(zhí)行在構(gòu)造方法之前。
靜態(tài)代碼塊 :在類中使用static修飾的成員代碼塊,在類加載時執(zhí)行。每次程序啟動到關(guān)閉,只會執(zhí)行一次的代碼塊。
同步代碼塊 :后續(xù)多線程技術(shù)中學(xué)習(xí)。
結(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ù)的
所有的參數(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于相机标定的简单介绍
- 下一篇: JavaSE——Java基础语法(二进制