Java面向物件程式設計:類的定義,靜態變數,成員變數,建構函式,封裝與私有,this概念與用法詳解
阿新 • • 發佈:2020-04-16
本文例項講述了Java面向物件程式設計:類的定義,靜態變數,成員變數,建構函式,封裝與私有,this概念與用法。分享給大家供大家參考,具體如下:
本文內容:
- 什麼是面對物件
- 類的定義與物件例項化
- 成員變數
- 成員變數的有效範圍
- 成員變數的賦值
- 靜態變數、方法與例項變數、方法
- 建構函式
- 封裝與私有
- this關鍵字
注:函式和方法是一樣東西。【由於我之前學習的時候有些書籍不是同樣的說法,書看多了,我就習慣了不同情況下用不同的說法】
首發時間:2018-03-22
什麼是面對物件:
- 面向物件強調行為處於物件之中,並不直接執行行為,而是通過物件執行行為
- 類是物件的抽象,物件是類的具體例項。 【可以說,人是一個類,而不同身份的你我他是一個具體例項。人這個類抽象出了我們人類共有的屬性,而我們人是人類的各種屬性的具體例項結果。】
- 面向物件的基本特徵:封裝,繼承,多型
- 封裝:比如一個物件把它的屬性和方法都封裝起來的話,它執行的屬性和方法都是這個物件的,而不是其他物件的。
- 繼承:子類可以繼承父類的屬性和方法。比如“人類”繼承了“哺乳類”的屬性和方法,又增添人類獨有的屬性和方法。
- 多型:一種多型是指同一個操作被不同物件執行時有不同的結果(比如:狗的say是“汪汪汪”,而貓的是"喵喵喵");另一種多型是根據物件的傳入而決定執行不同的方法。【本質上這兩個是一樣的】
類的定義與物件例項化:
類的定義:
- 類的定義包括兩部分:類宣告和類體
- 類是java程式的基本要素
- 定義類的格式:
- 修飾符可以是public 或空: public代表即使不同包也能訪問該類;而空代表只能該類只能在同一個包內訪問。
- 類體的內容包括變數的生命和方法的定義。【所以單獨的定義是錯誤的,只能宣告並同時定義】
物件例項化
- 類的例項化就是建立一個物件:
- 建立物件:類名 變數名 =new 類名()【類名()可以傳入一些引數來初始化物件,由類的同名方法(構造方法,下面講)定義能傳入什麼引數】
- 匿名物件:簡單來說就是沒有變數名的例項化,直接使用new 類名()來執行操作,由於沒有變數名來特異的標記一片記憶體空間,所以匿名物件一般只使用一次,比如new Dog().hello();
- 呼叫方法或變數:對於例項方法或變數的可以直接使用物件來呼叫;而對於靜態方法或變數,既可以使用物件,也可以使用類來呼叫。
- 建立物件:類名 變數名 =new 類名()【類名()可以傳入一些引數來初始化物件,由類的同名方法(構造方法,下面講)定義能傳入什麼引數】
class Dog{ String name; int foot=4; Dog(){//這是一個建構函式 this.name="旺財"; } void hello() { System.out.println("hello,this is a dog"); } static void static_hello() { System.out.println("hello,this is a dog too"); } } public class Demo { public static void main(String args[]) { Dog d=new Dog(); System.out.println(d.foot);//4 d.hello();//hello,this is a dog d.static_hello();//hello,this is a dog too Dog.static_hello();//hello,this is a dog too } }
成員變數:
成員變數的有效範圍
- 成員變數在整個類範圍內有效,與變數宣告的位置無關。方法中的區域性變數從宣告它的位置開始生效,並且只在方法體內有效。
- 當局部變數跟成員變數同名時,如果想特別的使用成員變數,可以使用“this.變數名”
- 成員變數有預設值,而區域性變數沒有預設值。
成員變數的賦值:
- 可以使用建構函式來對一些成員變數初始化
- 如果成員變數不是私有的,也可以直接取得變數名來賦值,比如dog.age=18
靜態變數、方法與例項變數、方法:
根據變數、方法是否有static修飾可以分為例項變數,例項方法和靜態變數(類變數),靜態方法(類方法)
-
靜態變數,靜態方法:
-
被static修飾的成員的特點:
-
隨著類的載入而載入,優先於物件存在,靜態成員記憶體位於方法區
-
被所有物件所用享【所以可稱為類變數或類方法】
-
可以直接類名呼叫
-
靜態方法只能訪問靜態成員
-
靜態方法中不可以寫this,super關鍵字
-
-
-
例項變數、例項方法:
- 例項變數、例項方法是物件的變數和方法,物件操作變數或方法也只是操作自己的變數或方法,不會影響其他物件。
例項變數\方法跟靜態變數\方法的區別好比:“泰迪狗類”比如有一個共有屬性“狗種類名”,那麼這個屬性應該是所有泰迪狗都有的,並且是泰迪狗共享的,如果某一天人類想改泰迪狗的種類名稱,那麼應該是所有泰迪狗都改的(靜態的);而每一隻泰迪狗都有自己的主人,這是由每一隻狗自身決定的,所以這是特有屬性,即使這隻狗換了主人,也不會影響別的狗。(例項的)
建構函式:
- 建構函式是類中的一種特殊函式,建構函式的名字與類的名字相同,而且沒有型別。
- 建構函式負責對類物件的特定屬性初始化。【比如每一隻狗物件都有不同的名字,而狗類是一個模板,是沒有名字的,而建構函式可以做到給狗定義名字。】
- 類中可以有多個建構函式,它們以函式過載的方式存在。
- 建構函式是沒有型別的,是直接以“ 類名(){}” 作為函式。
- 類中會預設有一個無引數的建構函式,如果定義了其他建構函式,那麼這個預設的無參建構函式就會不預設存在了。
class Dog{ String name; Dog(){ this.name="旺財"; } Dog(String name){ this.name=name; } } public class Init_usage { public static void main(String args[]) { Dog d3=new Dog(); Dog d4=new Dog("小菜"); System.out.println(d3.name); System.out.println(d4.name); } }
補充:
- 建構函式之間可以相互呼叫,但要防止遞迴呼叫。
- 呼叫其他建構函式來實現初始化在有多個變數需要初始化的時候有明顯的程式碼節省。
封裝與私有:
- 類的封裝的一個體現是變數和函式的私有化
- 封裝的準則:
- 將不需要對外提供的內容都隱藏起來。
- 將屬性都隱藏,提供公共方法對其訪問。
- 私有化使類的非公共屬性隱藏了起來,比如一個“人類”物件有自己的資產,一般只有自己才能知道自己有多少資產,並且不想直接給別人看到,但如果別人問題,還是會告訴別人的(隱藏了自己的資產情況,但是自己能夠使用方法獲得結果,這個方法是開放的,呼叫就是相當於別人問)。
- 可以使用private來使變數和函式私有化,這樣之後不能直接使用 物件.變數 或 物件.函式 來呼叫,只有物件內部的方法才能呼叫
- 將變數或方法私有化之後,一般對外提供getXXX,setXXX方法進行訪問,提高資料訪問的安全性。
class Man{ private int money; String name; Man(String name,int money){ this.name=name; this.money=money; } int getmoney(){ return money; } void setMoney(int money){ this.money=money; } } public class Private_usage { public static void main(String[] args) { Man m=new Man("lilei",2000); System.out.println(m.name);//lilei // System.out.println(m.money);//報錯的,因為私有了,不能訪問 // System.out.println(m.wife);//報錯的,因為私有了,不能訪問 System.out.println(m.getmoney()); //2000 m.setMoney(6000); System.out.println(m.getmoney());//6000 } }
this關鍵字:
- this代表當前物件(呼叫函式時代表當前呼叫該函式的物件),比如在類中可以使用this.XXX來呼叫物件自己的變數或方法。
- 當局部變數和成員變數同名時,可以用this關鍵字區分,this.XXX代表使用物件自身的變數
-
類中的成員變數預設是帶有this字首的,但遇到同名時必須加以區分。
-
this加上引數列表(this(引數))的方式就是訪問本類中符合該引數的建構函式
-
用於呼叫建構函式的this語句必須放在第一行,因為初始化動作要優先執行
class Person{ String name; int age; Person(String name,int age){ this.name=name; this.age=age; } void hello() { this.sysprint(); // sysprint(); } void sysprint() { System.out.println("hello world!"); } } public class This_usage { public static void main(String args[]) { Person p1=new Person("lilei",18); p1.hello();//hello world! } }
更多關於java相關內容感興趣的讀者可檢視本站專題:《Java面向物件程式設計入門與進階教程》、《Java資料結構與演算法教程》、《Java操作DOM節點技巧總結》、《Java檔案與目錄操作技巧彙總》和《Java快取操作技巧彙總》
希望本文所述對大家java程式設計有所幫助。