面向過(guò)程編程思想
傳統(tǒng)的C語(yǔ)言屬于面向過(guò)程編程語(yǔ)言喇喉。
面向過(guò)程解決問(wèn)題的思路:
??????面向過(guò)程的抽象是將實(shí)現(xiàn)一個(gè)功能的一組命令組合成為一個(gè)函數(shù)剪芍,這個(gè)函數(shù)就能實(shí)現(xiàn)這一個(gè)功能撩穿,是對(duì)功能實(shí)現(xiàn)的一種抽象界阁,有了函數(shù)令漂,我們就沒(méi)有必要重復(fù)寫很多的代碼(特殊地譬如遞歸,可通過(guò)循環(huán)替代)组贺,僅僅一個(gè)代碼集合名稱以及參數(shù)就能調(diào)用抽象的命令集合凸舵。
問(wèn)題
??????命名沖突:對(duì)功能擴(kuò)充,或者是對(duì)同一功能的不同實(shí)現(xiàn)失尖,需要重新寫一個(gè)函數(shù)啊奄,這就導(dǎo)致在功能層面是同類函數(shù),卻在語(yǔ)言層面是完全不同的兩個(gè)函數(shù)雹仿,英文單詞也就那么幾個(gè)增热,沒(méi)合適的短詞為函數(shù)命名,為了避免沖突胧辽,只能把函數(shù)名取得越來(lái)越長(zhǎng)
Java語(yǔ)言屬于面向?qū)ο缶幊陶Z(yǔ)言
面向?qū)ο蠼鉀Q問(wèn)題的思路:
??????從現(xiàn)實(shí)世界中客觀存在的事物出發(fā)來(lái)構(gòu)造軟件系統(tǒng)峻仇,并在系統(tǒng)構(gòu)造中盡可能運(yùn)用人類的自然思維方式,強(qiáng)調(diào)直接以問(wèn)題域中的事物為中心來(lái)思考問(wèn)題邑商,認(rèn)識(shí)問(wèn)題摄咆,并根據(jù)這些事物的本質(zhì)特點(diǎn),把它們抽象地表示為系統(tǒng)中的對(duì)象人断,作為系統(tǒng)的基本構(gòu)成單位吭从。
面向?qū)ο缶幊贪?/h6>
面向?qū)ο蟮姆治觯∣OA,Object Oriented Analysis)
面向?qū)ο蟮脑O(shè)計(jì)(OOD恶迈,Object Oriented Design)
面向?qū)ο蟮木幊虒?shí)現(xiàn)(OOP涩金,Object Oriented Programming)
面向?qū)ο笏枷胝f(shuō)明
OOA:通常是把構(gòu)成問(wèn)題域的事務(wù)分解成各個(gè)對(duì)象,給對(duì)象賦予相應(yīng)的屬性和行為暇仲,通過(guò)多個(gè)對(duì)象的相互協(xié)調(diào)來(lái)解決問(wèn)題步做。
??????建立對(duì)象的目的不是為了完成一個(gè)步驟,而是為了描敘某個(gè)事物在整個(gè)解決問(wèn)題的步驟中的行為 奈附。支持面向?qū)ο缶幊淌荍ava 語(yǔ)言的重要特點(diǎn)全度。
OOD:這些對(duì)象沒(méi)有先后順序,共同作用才構(gòu)成了整個(gè)系統(tǒng)斥滤。我們只要用代碼設(shè)計(jì)出這幾個(gè)類型的對(duì)象将鸵,然后讓他們互相通信、傳遞消息就可以完成系統(tǒng)功能佑颇。
面向?qū)ο缶幊趟枷雽?shí)際上就是一種運(yùn)用對(duì)象顶掉、類、繼承挑胸、封裝一喘、聚合、關(guān)聯(lián)嗜暴、消息凸克、多態(tài)性等概念來(lái)構(gòu)造系統(tǒng)的軟件開發(fā)方法。
OOP:編寫代碼
分析系統(tǒng)中涉及的事務(wù)闷沥,根據(jù)“對(duì)象”抽象出“類”萎战;
找出對(duì)象共有的特點(diǎn),并且在類中定義為屬性舆逃;
找出對(duì)象共有的行為蚂维,并且定義為類的方法。
抽象(abstract):
從事物中舍棄個(gè)別的非本質(zhì)特征路狮,抽取共同的本質(zhì)特征
只考慮與問(wèn)題域相關(guān)的信息虫啥,而忽略與問(wèn)題域不相關(guān)的部分
對(duì)象(object):是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體。
可以是有形的奄妨,也可以是無(wú)形的(如一個(gè)客戶涂籽,一張銀行卡,窗體中的一個(gè)按鈕等等)
對(duì)象是構(gòu)成世界的一個(gè)獨(dú)立單位
具有自己的靜態(tài)結(jié)構(gòu)(屬性)和動(dòng)態(tài)行為(方法)
每個(gè)對(duì)象有自己的唯一標(biāo)識(shí)
類(class):
類是一組具有相同屬性和行為的對(duì)象的抽象砸抛,類的作用是用來(lái)創(chuàng)建對(duì)象评雌,對(duì)象是類的一個(gè)實(shí)例
類和對(duì)象的關(guān)系
抽象和具體的關(guān)系。
每一個(gè)類在某一時(shí)刻都有零個(gè)或更多的實(shí)例直焙, 類是生成對(duì)象的模板
一個(gè)類定義了使用哪些數(shù)據(jù)來(lái)描述屬性景东,每一個(gè)對(duì)象都有相應(yīng)的屬性值數(shù)據(jù),一個(gè)類通過(guò)一系列方法來(lái)定義行為奔誓,這些方法能在每個(gè)對(duì)象中被激活
類的定義
什么是類
把相似的對(duì)象規(guī)劃成一個(gè)類斤吐。
在軟件設(shè)計(jì)中,類就是一個(gè)模板厨喂,他定義了 通用于一個(gè)特定種類的所和措。有對(duì)象的屬性(變量)和行為(方法)。
類的格式
[類的修飾]class 列名{
類的成員
...
}
public class Demo{
public int a ;
public void show(){
}
class Inner{
}
{
System.out.println();
}
}
//編碼規(guī)范:
//類名單詞首字母大寫
//屬性和方法第一個(gè)單詞小寫杯聚,其他單詞首字母大寫
屬性何方法
屬性有默認(rèn)值如下:
屬性有默認(rèn)值臼婆,因此可以不用賦值就可以使用。
方法中可以直接使用屬性名幌绍,對(duì)該屬性進(jìn)行操作
例如:
public class Employee{
public int age;
public void show(){
System.out.println(age);//輸出0
age = 20;
System.out.print(age);//輸出20
}
}
局部變量
方法體中聲明的變量颁褂、方法中的參數(shù)或者代碼塊中聲明的變量,都是局部變量
public class Employee{
public void show(String name){
int age = 20;
System.out.println(name+age);
}
}
屬性可以和局部變量同名傀广,使用關(guān)鍵字this進(jìn)行區(qū)分
(局部變量只在對(duì)應(yīng)的大括號(hào)內(nèi)起作用)
public class Employee{
public void show(){
int age = 20;//局部變量
System.out.println(this.age);//this.age輸出0
System.out.println(age);//輸出20
}
public int age;//屬性
}
屬性在整個(gè)類中生效颁独,無(wú)論在什么地方聲明
例如:
public class Employee{
public void show(){
System.out.println(age);
}
public int age;
}
局部變量必須先聲明才能使用
例如:
public class Employee{
public void show(){
System.out.println(age);
int age = 20
}
}
//程序會(huì)報(bào)錯(cuò)無(wú)法運(yùn)行;
演示:
class Employee {
String name;
int age;
double salary;
public String showName(){
System.out.println(name);
return name;
}
public int showAge(){
System.out.println(age);
return age;
}
public void updateName(String name2){
name = name2;
}
public void getSalary(){
System.out.println("The salary of this month is 2000");
}
}
類和對(duì)象的關(guān)系
類是創(chuàng)建對(duì)象的模板伪冰,對(duì)象是類的實(shí)例誓酒。
例如:
對(duì)象的創(chuàng)建
什么是對(duì)象
類(class)---是對(duì)某一類事物的的描述
對(duì)象(object)---是實(shí)際存在的某類事物的個(gè)體
?????也稱為實(shí)例(instance)
[圖片上傳中...(image.png-333195-1544857807797-0)]
創(chuàng)建語(yǔ)法語(yǔ)句
類名 對(duì)象名 = new 類名();
Employee zhang = new Employee();
對(duì)象的使用
在其他類中,適用對(duì)象名點(diǎn)運(yùn)算符調(diào)用屬性和方法
引用類的屬性:對(duì)象名.屬性
引用類的方法:對(duì)象名.方法名(實(shí)參)
在類內(nèi)的方法中,訪問(wèn)本類的屬性和方法可以直接訪問(wèn)靠柑。
創(chuàng)建對(duì)象原理
Java程序是交由JVM執(zhí)行的,根據(jù)《Java虛擬機(jī)規(guī)范》的規(guī)定寨辩,運(yùn)行時(shí)數(shù)據(jù)區(qū)通常包括這幾個(gè)部分:程序計(jì)數(shù)器(Program Counter Register)、Java棧(VM Stack)歼冰、本地方法棧(Native Method Stack)靡狞、方法區(qū)(Method Area)、堆(Heap)隔嫡。
我們?cè)趯?shí)例化一個(gè)對(duì)象時(shí)甸怕,同時(shí)操作了棧內(nèi)存和堆內(nèi)存。
在棧內(nèi)保存對(duì)象的首地址腮恩,即引用梢杭;
在堆內(nèi)存中保存了對(duì)象的屬性。
對(duì)對(duì)象的所有操作只能通過(guò)引用完成秸滴,一旦引用出棧釋放沒(méi)有任何引用指向該對(duì)象武契,對(duì)象就變成垃圾失效。
對(duì)象的創(chuàng)建
編寫一個(gè)類
編寫一個(gè)類不會(huì)占用內(nèi)存
在主函數(shù)中創(chuàng)建對(duì)象
運(yùn)行有主函數(shù)的類
只有主函數(shù)的類才能運(yùn)行缸榛。
無(wú)論有多少個(gè)類吝羞,只有主函數(shù)中創(chuàng)建的對(duì)象,才會(huì)占用內(nèi)存内颗。
對(duì)象的創(chuàng)建和使用
對(duì)象的屬性分配在堆內(nèi)存中钧排,但是對(duì)象分配在棧內(nèi)存中。
對(duì)象名(變量名)也稱為對(duì)象的引用(reference)均澳,引用在java中是地址的同義詞恨溜。
除了8種基本數(shù)據(jù)類型的變量,其他變量都是引用類型變量
類(class)
Employee emp找前;
數(shù)組
int[] c糟袁;
匿名對(duì)象的創(chuàng)建
創(chuàng)建完對(duì)象,在調(diào)用該對(duì)象的屬性或方法時(shí)躺盛,也可以不定義對(duì)象的句柄项戴,而直接調(diào)用這個(gè)對(duì)象的方法。這樣的對(duì)象叫匿名對(duì)象槽惫。
如果只使用該對(duì)象進(jìn)行一次方法或?qū)傩哉{(diào)用周叮,可以創(chuàng)建匿名對(duì)象。
垃圾回收機(jī)制
垃圾回收(Garbage Collection界斜,GC)仿耽,JDK7以后使用G1(Garbage First)機(jī)制:
當(dāng)沒(méi)有對(duì)象引用指向原先分配給某個(gè)對(duì)象的內(nèi)存時(shí),該內(nèi)存便成為垃圾各薇。JVM的一個(gè)系統(tǒng)級(jí)線程會(huì)自動(dòng)釋放該內(nèi)存塊项贺。
垃圾回收機(jī)制作用于堆內(nèi)存,與棧內(nèi)存無(wú)關(guān)。
垃圾回收機(jī)制是JVM內(nèi)部運(yùn)行的一個(gè)優(yōu)先級(jí)比較低的后臺(tái)線程开缎,自動(dòng)進(jìn)行垃圾回收棕叫。它是保證程序健壯的主要手段,不用程序員參與啥箭,避免了由于程序員忘記回收內(nèi)存而引起的內(nèi)存泄漏谍珊,同時(shí)也避免了回收內(nèi)存帶來(lái)的代碼繁瑣。
對(duì)象會(huì)被回收情況:
1急侥、對(duì)象的引用被賦值為null
Person p = new Person( ); p = null;
2、使用的匿名對(duì)象:
new Person( ).sayHello( );
3侮邀、超出生命周期的坏怪,如:
for( int i = 0; i< 100; i++){
Person p = new Person( );
}
這里,創(chuàng)建了100個(gè)對(duì)象绊茧,循環(huán)賦值給變量p铝宵,每結(jié)束一次循環(huán),變量p就超出生命周期华畏,對(duì)象變?yōu)槔?/p>
在Java中創(chuàng)建對(duì)象占用的空間不需要編寫代碼進(jìn)行空間釋放鹏秋。
構(gòu)造器
構(gòu)造方法(構(gòu)造器,Constructor)
構(gòu)造方法也是方法亡笑,但是它是特殊的方法而已
所有的對(duì)象都是通過(guò)構(gòu)造器來(lái)創(chuàng)建的
創(chuàng)建對(duì)象:
類名 對(duì)象名 = new 構(gòu)造方法();
構(gòu)造器(構(gòu)造方法/構(gòu)造器侣夷,Constructor)特點(diǎn):
構(gòu)造方法名必須與類同名
不含返回值類型,也沒(méi)有void
不能在方法中用return語(yǔ)句返回一個(gè)值
構(gòu)造方法作用
構(gòu)造方法用來(lái)完成對(duì)象的創(chuàng)建仑乌,即完成對(duì)象的實(shí)例化
在Java中百拓,每個(gè)類都至少要有一個(gè)構(gòu)造器
一個(gè)類可以不寫出構(gòu)造方法,編譯器會(huì)自動(dòng)的給這個(gè)類增加一個(gè)構(gòu)造器晰甚,該構(gòu)造器沒(méi)有任何參數(shù)衙传,我們稱之為“默認(rèn)的空構(gòu)造器”。
編程者為該類定義了構(gòu)造器厕九,系統(tǒng)就不再提供默認(rèn)的構(gòu)造器
構(gòu)造方法的重載
構(gòu)造方法可以像普通方法一樣發(fā)生重載蓖捶,通常一個(gè)類中不止一個(gè)構(gòu)造方法,而是有多個(gè)不同參數(shù)的構(gòu)造器扁远,用戶可以根據(jù)需要選擇不同的構(gòu)造器創(chuàng)建對(duì)象俊鱼。
一般可以使用構(gòu)造器來(lái)完成對(duì)成員變量的初始化。例如:
有帶參的構(gòu)造器穿香,那么不帶參的空構(gòu)造器不會(huì)自動(dòng)產(chǎn)生亭引。為了防止在某些情況下還想使用這樣的無(wú)參數(shù)默認(rèn)構(gòu)造器,因此最好還是養(yǎng)成寫出這個(gè)無(wú)參數(shù)的構(gòu)造器來(lái)皮获,以備后用焙蚓。 例如:
構(gòu)造方法的調(diào)用
在其他類只能在創(chuàng)建對(duì)象時(shí)調(diào)用一次構(gòu)造方法。
普通方法可以在創(chuàng)建對(duì)象后,使用點(diǎn)運(yùn)算符調(diào)用多次
本類中調(diào)用
只能在本類的構(gòu)造方法中购公,調(diào)用其它重載的構(gòu)造方法
使用this關(guān)鍵字萌京,并且代碼只能在構(gòu)造方法的第一行
根據(jù)實(shí)參確定調(diào)用的構(gòu)造方法
多次調(diào)用構(gòu)造器,一個(gè)類可以實(shí)例化出多個(gè)對(duì)象宏浩。
java包的概念
在Java中知残,包主要有以下用途:
包允許將類組合成較小的單元
有助于避免命名沖突
包允許在更廣的范圍內(nèi)保護(hù)類,數(shù)據(jù)和方法
將類放入包中比庄,語(yǔ)法為:
package 包名;
使用包注意問(wèn)題:
在Java中位于包中的類求妹,在文件系統(tǒng)中的存放位置,必須有與包名層次相對(duì)應(yīng)的目錄結(jié)構(gòu)
package語(yǔ)句作為Java源文件的第一條語(yǔ)句
每個(gè)源文件只能聲明一個(gè)包
如果沒(méi)有package語(yǔ)句佳窑,則默認(rèn)為無(wú)名包
類庫(kù)中的常用的包
Java.lang
java默認(rèn)包制恍,任何程序中,該包都會(huì)被自動(dòng)導(dǎo)入神凑。
java.io
輸入/輸出操作有用的類組成净神。
訪問(wèn)同包中的類
位于同一包中的類可以直接訪問(wèn)并使用
訪問(wèn)同包中的類
唯一同包中的類可以直接訪問(wèn)并使用
訪問(wèn)不同包中的類
訪問(wèn)不同的包中的類
使用import關(guān)鍵字引入其他包中的類
必須在package聲明后面,類聲明前面
import語(yǔ)句可以出現(xiàn)多次
package和import說(shuō)明
package說(shuō)明:
package像是我們的姓溉委,而class名稱就像我們的名字鹃唯。
package和package的附屬關(guān)系用”.”來(lái)連接,這就像是復(fù)姓瓣喊。
比如說(shuō) java.lang.String就是復(fù)姓 java.lang坡慌,名字為 String 的類;
com.neuedu.ch06.Employee 則是復(fù)姓 com.neuedu.ch06型宝,名字為 Employee 的類
import說(shuō)明:
import就是在java文件開頭的地方八匠,先說(shuō)明會(huì)用到那些類
接著就能在代碼中只用類名指定某個(gè)類,也就是只稱呼名字趴酣,不稱呼他 的姓