注:本文轉載自coder-pig
Java面向對象
ps:因爲面向對象的內容比較重要,而且很多要通過代碼理解的;
如果全部寫在一篇文章中會顯得篇幅過長,過於累贅;讀者讀得累;
我也寫得累!
前言
在上一節中我們對Java的基礎知識進行了學習;
在這一節中我們將會進一步瞭解Java的核心
面向對象部分!這一節很重要,也是後面幾節的基礎,
希望大家可以認真學習下!
EveryThing is Object!
面向對象的理解:
對象的引入:
所有事物都具有兩個方面:有什麼?能幹什麼
對應的,我們可以理解爲
屬性:描述對象;
方法:對象有什麼功能
對象設計的要求:
高內聚,低耦合,從而提高對象的可複用性
注:這裏解釋下高內聚低耦合,這句話字面上不好理解。
耦合性也稱塊間聯繫:指軟件系統結構中各模塊間相互聯繫緊密程度的一種度量。模塊之間聯繫越緊密,其耦合性就越強,模塊的獨立性則越差。模塊間耦合高低取決於模塊間接口的複雜性、調用的方式及傳遞的信息。
內聚性又稱塊內聯繫:指模塊的功能強度的度量,即一個模塊內部各個元素彼此結合的緊密程度的度量。若一個模塊內各元素(語名之間、程序段之間)聯繫的越緊密,則它的內聚性就越高。
例子:一個程序有50個函數,這個程序執行得非常好;然而一旦你修改其中一個函數,其他49個函數都需要做修改,這就是高耦合的後果。
一旦你理解了它,你編寫概要設計的時候設計類或者模塊自然會考慮到“高內聚,低耦合”。
對象設計的思想:
以對象爲中心,先開發類,得到對象,再通過對象間的相互通信實現功能
對象
如何創建對象:
new關鍵字 + 指定類名創建
eg:Person p = new Person();
對象的產生:
現在堆內存中創建一個對象----->然後在棧內存中創建一個變量引用對象的地址
對象與對象的引用:
對象名作爲操作的標識符,僅僅只是對象的一個引用而已,而並非對象本身;
有引用,但不表示一定要有一個對象與引用相連;
所以在創建一個引用時,都需要進行初始化
對象的使用:
通過點語法訪問.eg:p.age = 18;
對象的生命週期:
從new創建開始,到沒有任何引用到達對象時結束(成爲垃圾)
匿名對象的使用:
不定義變量引用對象,用new創建後直接調用,沒名字,所以叫做匿名對象
通常我們需要使用一對象,且只用一次的話,就用匿名對象(沒有引用,使用一次後就變成垃圾了)
可以作爲實參進行傳遞
注:這裏給大家舉一個匿名類的例子。
有一個方法:mMethod(Person p),該方法的參數是一個對象,你用這個方法的時候有兩種方式傳參。
方法一:Person p=new Person();
mMethod(p);
方法二:mMethod(new Person()); 用一個沒有名字的對象作爲參數。
類:
類與對象的建模過程:
類的定義:
類的一般形式:
class 類名
{
成員變量
構造方法
成員方法
}
成員變量與局部變量的區別:
成員變量:定義在類中,在整個類中都可以訪問,存在於棧內存的對象中,隨着對象的消失而消失,有默認初始值
局部變量:定義在方法,語句,局部代碼塊中,只在所屬區域有效;存在棧內存的方法中,隨所屬區域的執行而執行;結束而
釋放,沒有默認初始值
成員變量的初始化:
當對象創建時,會對成員變量自動賦初值,基本數據位0,引用型爲null;
注:char爲"\u0000"表空 boolean:false
構造方法(Constructor)
介紹:
爲對象進行初始化的一個特殊方法,在生成對象時會被調用來初始化對象
構造方法名需與類名相同,new對象時隱式地進行調用,用戶無法顯式調用;
無返回值,不能加void返回值類型,總會有的,就算你不寫構造方法;
也會自動生成默認缺省的構造方法;當然如果我們寫了,就不會再生成了
構造方法的重載(overLoading):
又叫編譯時的多態,需要參數類型
方法名相同,參數不同(個數,類型)
this關鍵字:
1)用於區分局部變量與實例變量
2)顯式地調用重載的構造方法,貌似用的不怎麼多,就是構造方法的相互調用
調用語句需要寫在第一行哦!
eg:
- /*
- * 該程序演示的是構造方法的重載和this關鍵字的作用
- * */
- public class Test {
- private int i;
- private String str;
- //這個構造方法是完成變量初始化的方法,this在這裏區分局部變量與成員變量哦!
- public Test(int i,String str) {
- this.i = i;
- this.str = str;
- }
- //通過this調用上面的構造方法,要放在第一行
- public Test(String str)
- {
- this(1,"woqu");
- }
- //通過this調用上面的構造方法,要放在第一行
- public Test()
- {
- this("HeHe");
- }
- }
成員方法:
一個好的方法應該有好的移植性和可重用性
兩種傳參方式:
①按值傳遞:內存的空間變量 eg:int i
②按引用傳遞(傳對象引用):Integer類的一個對象引用: Integer i = new Integer(10);
public修飾類的規則:
一個Java文件,只允許有一個修飾爲public的類或者接口,且名字要與文件名相同,不然編譯器會報錯
包的概念:
打包:package eg: package com.jay.example;
導包:import eg:inport java.io.*;
注意:導包時用星號只表示該層次的所有類,但是不包含子層次下的類!!!!
作用域修飾符:
默認(default):同包可見 public共有:所有類可訪問
private私有:同一類可見 protected保護:子類或同包可見
ps:要注意private和protected都不能夠修飾類啊!!!!
數據成員與方法成員在內存中的組織:
數據成員佔據不同的內存區域;所有方法成員共享一段程序代碼
知識點使用實例:
步驟:
定義一個Person類,然後再建立一個測試類PersonTest,對相關方法進行調用
代碼如下:
Person.java
- //將該類打包到一個文件夾中
- package com.jay.example;
- public class Person {
- /*
- * 定義成員變量,和成員變量不同,當我們new對象時
- * 系統會給他們生成默認的初始值,這裏之所以將所有變量都
- * 設置成private私有,是爲了實現封裝,外界如果想訪問
- * 修改屬性的話,需要通過該類提供的get,set方法進行訪問
- */
- private String name;
- private int age;
- /*
- * 這裏我們定義的是構造方法,構造方法是用來進行變量初始化的
- * 因爲我們自定義了一個有參的構造方法,那麼系統就不會再自動生成
- * 無參的缺省構造方法了,但是一個好的編程習慣還是把這個卻省的構
- * 造方法寫上,this在這裏起的作用就是區分局部變量與成員變量
- * */
- public Person(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- public Person(){}
- /*
- * 接着到成員方法的定義了;
- * 我們先定義set和get的方法;
- * 可以理解爲通過這個方法爲外界提供一個接口
- * 別的類可以通過這個接口訪問相關屬性的值
- * */
- 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;
- }
- //定義打印信息的方法
- public void printMsg()
- {
- System.out.printf("姓名: "+name+"\n年齡: "+age);
- }
- }
PersonTest.java
- package com.jay.example;
- public class PersonTest {
- public static void main(String[] args) {
- String pname = null;
- int page = 0;
- //將Person類實例化爲對象
- Person p = new Person("小豬",20);
- p.printMsg();
- //通過get方法獲得參數,自己輸出
- pname = p.getName();
- page = p.getAge();
- System.out.println("\n姓名: "+pname+"\n年齡: "+page);
- //通過set方法設置參數,調用printMsg打印信息
- p.setName("大豬");
- p.setAge(25);
- p.printMsg();
- }
- }
執行效果圖:
總結:
在這一小節裏面,我們對類與對象進行了初步的解析;
對類與對象的定義,構造方法,作用域等進行了學習
通過案例可以進一步加深大家對類與對象的瞭解
好了,這一節就到這裏了,如果有什麼疑問,錯誤,紕漏,或者
好的建議,望讀者指出,不甚感激!(*^__^*) 嘻嘻……