天天看點

黑馬程式員_日記3_Java面向對象面向對象

 ——- android教育訓練、java教育訓練、期待與您交流! ———-

面向對象

一、面向對象概念

1.了解面向對象

  • 面向對象是相對面向過程而言
  • 面向對象和面向過程都是一種思想
  • 面向過程:強調的是功能行為
  • 面向對象:将功能封裝進對象,強調具備了功能的對象。
  • 面向對象是基于面向過程的。

2.面向對象的特點

  • 是一種符合人們思考習慣的思想
  • 可以将複雜的事情簡單化
  • 将程式員從執行者轉換成了指揮者
  • 完成需求任務時,要先去找具有所需功能的對象來用。如果該對象不存在,那麼建立一個具有所需功能的對象,這樣就可以簡化開發并且提高程式的複用性。

3.面向對象開發,設計,特征

  • 開發的過程其實就是不斷的建立對象,使用對象和指揮對象做事情。
  • 設計的過程其實就是在管理和維護對象之間的關系。
  • 面向對象有三大特征,分别是:封裝,內建和多态。

二、類與對象的關系

1.類與對象

  1. 使用計算機語言就是不斷的在描述現實生活中的事物。
  2. java中描述食物通過類的形式展現,類是具體事務的抽象,概念上的定義。
  3. 對象即是該類事物實實在在存在的個體。

例如,如果把汽車圖紙比作類,那麼汽車就是堆記憶體中的對象,可以有各種各樣顔色的汽車。

2.類的定義

  • 生活中描述事務無非就是描述事務的屬性和行為。在Java中用類(class)來描述事物也是如此。是以類可以定義為屬性和行為的集合。
  • 屬性就是對應類中的成員變量。
  • 行為就是對應類中的成員函數或方法。
  • 定義類其實就是在定義類中的成員變量和成員函數。

3.成員變量和局部變量的差別

  • 成員變量是定義在類中,在整個類中都可以被通路。它随着對象的建立而建立,存在于對象所在的堆記憶體中。成員變量有預設初始化值。
  • 局部變量值定義在局部範圍内。例如函數内,語句内,for循環内等等。局部變量存在于棧記憶體中。作業的範圍結束,變量空間會自動釋放。局部變量沒有預設初始化值。

4.建立對象,使用對象

class Car
{
    String color = "red";
    int num = ;
    void show()
    {
        System.out.println("Color="+ color+"  num"+ num);
    }
}

class CarDemo
{
    public static void main(String[] args)
    {
        Car c = new Car();
        c.color = "black";
        c.show();
    }
}
           

5.對象記憶體結構

黑馬程式員_日記3_Java面向對象面向對象

6.匿名對象

  • 匿名對象是對象的簡化形式。它的使用情況有兩種:第一,當對象方法進進行一次調用的時候,可以用匿名對象來完成,這樣寫比較簡化。如果對一個對象進行多個成員調用,必須給這個對象起個名字。第二,匿名對象可以作為實際參數進行傳遞。

三、封裝

1.封裝的概念

封裝是指隐藏對象是屬性和實作細節,僅僅對外提供公共通路方式。舉例如下:

class Person
{
    private String name;
    private int age;
    private static  String country = "cn";
    Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public void speak()
    {
        System.out.println(this.name+"..."+this.age);
    }

    public static void  showCountry()
    {
        System.out.println("country="+country);
    }
}
           

2.封裝的好處

  • 将變化隔離
  • 便于使用
  • 提高重用性
  • 提高安全性

3.封裝的原則

  • 将不需要對外提供的内容都隐藏起來,例如

    private String name; private int age; private static String country = "cn";

  • 把屬性都隐藏,僅僅提供公共方法對其通路。正如上例所示,setName(),speak()。

四、構造函數

1.特點

  • 函數名與類名相同
  • 不用定義傳回值類型
  • 不可以寫return語句

2.作用

給對象進行初始化。對于上例,初始化動作為。

Person p = new Person("Mike","22");

3.注意事項

  • 當一個類中沒有定義構造函數時,那麼系統會預設給該類加入一個空參數的構造函數。當在類中自定義了構造函數後,預設的構造函數就沒有了。
  • 構造函數和一般函數在寫法上有不同。在運作上也有不同。構造函數是在對象一建立就運作。給對象初始化。而一般方法是對象調用才執行,給是對象添加對象具備的功能。一個對象建立,構造函數隻運作一次。而一般方法可以被該對象調用多次。
  • 什麼時候定義構造函數呢?當分析事物時,該事物存在具備一些特性或者行為,那麼将這些内容定義在構造函數中。

4.構造代碼塊

  • 作用:給對象進行初始化。對象一建立就運作,而且優先于構造函數執行。
  • 和構造函數的差別:

    構造代碼塊是給所有對象進行統一初始化,而構造函數是給對應的對象初始化。構造代碼快中定義的是不同對象共性的初始化内容。舉例如下

class Person
{
    private String name;
    private int age;

    {
        //System.out.println("person code run");
        cry();
    }

    Person()
    {
        System.out.println("A: name="+name+",,age="+age);

    }
    /**/
    Person(String n)
    {
        name = n;
        System.out.println("B: name="+name+",,age="+age);

        //cry();

    }
    /*
    public void setName(String n)
    {
        name  = n;
    }
    public String getName()
    {
        return name;
    }
    */
    Person(String n,int a)
    {
        name = n;
        age = a;
        System.out.println("C: name="+name+",,age="+age);
        //cry();
    }

    public void cry()
    {

        System.out.println("cry......");
    }
}

class  PersonDemo2
{
    public static void main(String[] args) 
    {
        Person p1 = new Person();



        Person p2 = new Person("lisi");

        //System.out.println(p2.getName());

        //Person p3 = new Person("wnagu",10);


    }
}
           

五、this關鍵字

this:看上去,是用于區分局部變量和成員變量同名情況。

this為什麼可以解決這個問題?

this到底代表的是什麼呢?

this:就代表本類的對象,到底代表哪一個呢?

this代表它所在函數所屬對象的引用。

簡單說:哪個對象在調用this所在的函數,this就代表哪個對象。

this的應用:當定義類中功能時,該函數内部要用到調用該函數的對象時,這時用this來表示這個對象。但凡本類功能内部使用了了本類對象,都用this表示。

this的具體運用舉例如下:

class Person
{
    private String name;
    private int age;
    Person(int age)
    {
        this.age = age;
    }
    Person(String name)
    {
        this.name = name;
    }
    Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public void speak()
    {
        System.out.println("name="+this.name+"...age="+this.age);
        this.show();
    }
    public void show()
    {
        System.out.println(this.name);
    }

    /*
    需求:給人定義一個用于比較年齡是否相同的功能。也就是是否是同齡人。
    */
    public boolean compare(Person p)
    {
        return this.age==p.age;

    }
}
           

除此之外,還要注意this語句,即this();

this語句 :用于構造函數之間進行互相調用。

this語句隻能定義在構造函數的第一行。因為初始化要先執行。

六、static關鍵字

靜态:static。

用法:是一個修飾符,用于修飾成員(成員變量,成員函數).

當成員被靜态修飾後,就多了一個調用方式,除了可以被對象調用外,還可以直接被類名調用。類名.靜态成員。

static特點:

1,随着類的加載而加載。也就說:靜态會随着類的消失而消失。說明它的生命周期最長。

2,優先于的對象存在明确一點:靜态是先存在。對象是後存在的。

3,被所有對象所共享

4,可以直接被類名所調用。

執行個體變量和類變量的差別:

1,存放位置。

類變量随着類的加載而存在于方法區中。

執行個體變量随着對象的建立而存在于堆記憶體中。

2,生命周期:

類變量生命周期最長,随着類的消失而消失。

執行個體變量生命周期随着對象的消失而消失。

靜态使用注意事項:

1,靜态方法隻能通路靜态成員。

非靜态方法既可以通路靜态也可以通路非靜态。

2,靜态方法中不可以定義this,super關鍵字。

因為靜态優先于對象存在。是以靜态方法中不可以出現this。

3,主函數是靜态的。

靜态有利有弊

利處:對對象的共享資料進行單獨空間的存儲,節省空間。沒有必要每一個對象中都存儲一份。可以直接被類名調用。

弊端:生命周期過長。通路出現局限性。(靜态雖好,隻能通路靜态。)

執行個體如下:

class Person
{
    String name;//成員變量,執行個體變量。
    static String country = "CN";//靜态的成員變量,類變量。
    public static void show()
    {
        System.out.println("::::");
        this.haha();
    }
    public void haha()
    {}
}

class  StaticDemo
{
    public static void main(String[] args) 
    {
        Person p = new Person();
        //p.name = "zhangsan";
        //p.show();

        //System.out.println(p.country);

        //System.out.println(Person.country);

        Person.show();
    }
}
           

七、單例設計模式

設計模式:解決某一類問題最行之有效的方法。

java中23種設計模式:

單例設計模式:解決一個類在記憶體隻存在一個對象。

想要保證對象唯一。

1,為了避免其他程式過多建立該類對象。先禁止其他程式建立該類對象

2,還為了讓其他程式可以通路到該類對象,隻好在本類中,自定義一個對象。

3,為了友善其他程式對自定義對象的通路,可以對外提供一些通路方式。

這三步怎麼用代碼展現呢?

1,将構造函數私有化。

2,在類中建立一個本類對象。

3,提供一個方法可以擷取到該對象。

對于事物該怎麼描述,還怎麼描述。

當需要将該事物的對象保證在記憶體中唯一時,就将以上的三步加上即可。

示例如下:

class Single
{


    private  Single(){}

    private static Single s = new Single();

    public static  Single getInstance()
    {
        return s;
    }
}


class SingleDemo 
{
    public static void main(String[] args) 
    {
        Single s1 = Single.getInstance();
        Single s2 = Single.getInstance();

        s1.setNum();

        System.out.println(s2.getNum());



//      Single s1 = new Single();
//      Single s2= new Single();
//      s1.setNum(30);
//      System.out.println(s2.getNum());

//      Student s1 = new Student();
//      s1.setAge(30);
//
//      Student s2 = new Student();
//      s2.setAge(12);

        Student s1 = Student.getStudent();
        Student s2 = Student.getStudent();




    }
}



class Student
{
    private int age;


    private static Student s = new Student();
    private Student(){}
    public static Student getStudent()
    {
        return s;
    }



    public void setAge(int age)
    {
        this.age = age;
    }
    public int getAge()
    {
        return age;
    }
}