——- android教育訓練、java教育訓練、期待與您交流! ———-
面向對象
一、面向對象概念
1.了解面向對象
- 面向對象是相對面向過程而言
- 面向對象和面向過程都是一種思想
- 面向過程:強調的是功能行為
- 面向對象:将功能封裝進對象,強調具備了功能的對象。
- 面向對象是基于面向過程的。
2.面向對象的特點
- 是一種符合人們思考習慣的思想
- 可以将複雜的事情簡單化
- 将程式員從執行者轉換成了指揮者
- 完成需求任務時,要先去找具有所需功能的對象來用。如果該對象不存在,那麼建立一個具有所需功能的對象,這樣就可以簡化開發并且提高程式的複用性。
3.面向對象開發,設計,特征
- 開發的過程其實就是不斷的建立對象,使用對象和指揮對象做事情。
- 設計的過程其實就是在管理和維護對象之間的關系。
- 面向對象有三大特征,分别是:封裝,內建和多态。
二、類與對象的關系
1.類與對象
- 使用計算機語言就是不斷的在描述現實生活中的事物。
- java中描述食物通過類的形式展現,類是具體事務的抽象,概念上的定義。
- 對象即是該類事物實實在在存在的個體。
例如,如果把汽車圖紙比作類,那麼汽車就是堆記憶體中的對象,可以有各種各樣顔色的汽車。
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.對象記憶體結構
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;
}
}