第三章、面向?qū)ο?/h2>

第三章:面向?qū)ο蟆緅ava語言的核心機制,最重要的內(nèi)容,java語言的特色】

1、面向過程與面向?qū)ο蟮膮^(qū)別

2、面向?qū)ο蟮娜筇卣?/p>

3、類和對象的概念

4、類得定義【從這里開始編寫代碼】

1、面向過程與面向?qū)ο蟮膮^(qū)別;

什么叫做面向過程;核心是因果關(guān)系關(guān)注的整個過程是如何走的,在過程中沒有任何獨立體,沒有獨立體。各個子系統(tǒng)之間是通過因果關(guān)系連接起來的

如果一個因果關(guān)系出現(xiàn)問題,程序全體出問題。相當(dāng)于串聯(lián)。

優(yōu)點是:對于業(yè)務(wù)邏輯比較簡單的程序,可以快速開發(fā),前期投入投入成本很低

缺點是:軟件元素耦合度低,只要一個環(huán)出現(xiàn)問題,整個一個系統(tǒng)收到影響。沒有獨立體概念,所以組件無法進(jìn)行復(fù)用。

什么叫做面向?qū)ο?;將幾個獨立功能的個體湊起來,實現(xiàn)一個場景下的功能。各個體之間的關(guān)聯(lián)程度極低。

相當(dāng)于搭積木,關(guān)注點是功能而不是因果關(guān)系。

優(yōu)點:模塊間耦合度低,擴展力強,可復(fù)用,更容易解決現(xiàn)實世界中更復(fù)雜的邏輯

缺點:前期投入成本高,需要進(jìn)行抽取獨立體抽取,大量的系統(tǒng)分析與設(shè)計。

c語言面向過程,c++半面向?qū)ο?,java純面向?qū)ο?/p>

2、面向?qū)ο蟮娜筇卣鳎?/p>

封裝:

繼承:

多態(tài):

所有的面向?qū)ο蟮木幊陶Z言中都有這三大特征

面向?qū)ο蟮恼麄€生命周期中;

面向?qū)ο蠓治觯篛OA

面向?qū)ο蟮脑O(shè)計:OOD

面向?qū)ο蟮木幊蹋篛OP

3、類和對象的概念;

什么是類:現(xiàn)實中不存在,是人類大腦抽象思維總結(jié)的結(jié)果。是一個模板,是一個概念。

類代表了一類事物

對象A和對像B中具有共同特征,進(jìn)行抽象總結(jié)出一個模板,這個模板被稱為類

什么是對象:對象是實際存在的個體?,F(xiàn)實世界當(dāng)中實際存在。

先有對象之后人類思考對象后,發(fā)現(xiàn)對象與對象之間有相同的特征。在大腦中形成了模板就是類。

java程序員可以通過java代碼來表述一個類

java程序中有了類的定義

然后通過類可以創(chuàng)建對象

有了對象之后,可以讓對象直接協(xié)作起來形成一個系統(tǒng)。

類到對象的過程叫做實例化

對象又叫實例/instance

對象到類的過程叫做抽象

類描述的是對象的共同特征。

共同特征例如:身高特征

這個身高特征在訪問的時候,必須先創(chuàng)建對象,通過對象去訪問這個特征。

因為這個特征具體到某個對象上之后,志不同。有的對象身高1.80,有的對象身高2.80。

一個類主要描繪什么信息呢?

一個類主要描述的是狀態(tài)+動作。

狀態(tài):名字,身高,性別,年齡。

動作:吃,唱歌,跳舞,學(xué)習(xí)。

{

屬性;//描述對象的狀態(tài)信息

方法;//描述對象的動作信息

}

注意:狀態(tài)和動作當(dāng)具體到某個具體的動作之后,發(fā)現(xiàn)可能結(jié)果不太一樣。

對象和對象之間有共同特征,具體到對象之后由數(shù)據(jù)的差異。

類的定義://屬于引用數(shù)據(jù)類型。

語法結(jié)構(gòu):

[修飾符列表]class 類名

{

}

學(xué)生類,描述所有學(xué)生對象的共同特征;

public? class student

{

//學(xué)生對象有哪些狀態(tài)信息;

//屬性通常采用變量的方式來定義

//在類體當(dāng)中方法體外的變量屬于成員變量,可以不賦初值,默認(rèn)賦值為0;

int 學(xué)號

string 姓名

boolean 性別

int 年齡

string 住址

}

//基本數(shù)據(jù)類型

/*

byte

short

int

long

float

double

boolean

char?

*/

//引用數(shù)據(jù)類型

/*

String

Student

User

Product

Customer

*/

寫一個類:

//學(xué)生類:

//學(xué)生類是一個模板,描述所有學(xué)生的共同特征【狀態(tài)+行為】

//當(dāng)前類只描述學(xué)生的狀態(tài)信息【屬性】

public class Student//類型名就是student

{

//類體=屬性+方法

//屬性【存儲數(shù)據(jù)采用變量的形式】

//每個學(xué)生的學(xué)號不同,要訪問這個學(xué)號必須先創(chuàng)建對象,通過對象去訪問學(xué)號信息

//學(xué)號信息不能直接通過類去訪問,只有通過實例才能訪問具體的學(xué)號。

//對象又被稱為實例,實例變量又被稱為對象變量

//不創(chuàng)建對象,這個no變量的內(nèi)存空間不存在的,只有創(chuàng)建了對象,這個no變量內(nèi)存空間才會創(chuàng)建。

int no;

//姓名

string name;

? ? //姓名

int age;

//年齡

boolean sex

}

public class ootest01

{

public static void main (string[] args)

{

//通過一個類實例N個對象

//實例化對象的語法:new類名();

//new預(yù)算符的作用是創(chuàng)建對象,在jvm堆內(nèi)存當(dāng)中開辟新的內(nèi)存空間。

//方法區(qū)內(nèi)存;在類加載的時候,進(jìn)行壓棧操作,class字節(jié)碼代碼片段被加載到該內(nèi)存空間當(dāng)中。(只有一個方法區(qū)內(nèi)存)

//棧內(nèi)存(存儲局部變量):方法代碼片段執(zhí)行的時候,會給該方法分配內(nèi)存空間,在棧內(nèi)存中壓棧。(每個線程就會有一個方法區(qū)內(nèi)存)

//堆內(nèi)存:new的對象在堆內(nèi)存中儲存。(堆內(nèi)存只有一個)

//student就是一個數(shù)據(jù)類型

//s是一個變量名

//s是一個局部變量,在棧內(nèi)存中存儲。存儲了一個地址,指向堆內(nèi)存中的對象,類似于指針。(這種將對象地址賦值給變量的方式稱為引用)

//new student()是一個學(xué)生對象,被保存在s中存儲的內(nèi)存里。在堆內(nèi)存中。

//在student對象中,其所有實例變量根據(jù)數(shù)據(jù)的類型賦初始默認(rèn)值。

//什么是對象?new運算符在堆內(nèi)存中開辟出的內(nèi)存空間成為對象。

//什么是引用?引用是一個變量,只不過這個變量保存了另一個java對象的內(nèi)存地址。

//堆內(nèi)存中的數(shù)據(jù)必須通過引用進(jìn)行數(shù)據(jù)操作。不能直接操作堆內(nèi)存,因為java中沒有指針。

//程序員只能通過引用去訪問崔內(nèi)存當(dāng)中對象內(nèi)部的實例變量

student s=new Student()

//訪問實例變量的語法格式;

//讀取數(shù)據(jù):引用.變量名

//修改數(shù)據(jù):引用.變量名=值

int stuNo=s.no;

string stuName=s.name;

boolean stusex=s.sex;

int stuAge=s.sex;

string stuAddr=s.addr;

//通過變量賦值

system.println("stuName"+s.name);

//直接讀取數(shù)據(jù)

s.no=1;

s.age=20;

s.name=jake;

//修改對象的數(shù)據(jù)

//總結(jié):s是一個引用,s同時是一個局部變量,student變量的數(shù)據(jù)類型。

//局部變量在棧內(nèi)存中存儲,成員變量中的實例變量在堆內(nèi)存的java對象內(nèi)存儲

//實例變量是一個對象一份,100個對象有100份

//類似于system.out.println(student.age);的寫法是錯誤的因為只能通過對象才能訪問堆內(nèi)存中的實例變量數(shù)據(jù)值。

}

}

public class Address

{

//城市

string city;

//用戶名

string jiedao;

//家庭住址

}

public class user

{

//用戶編號

int no;

//用戶名

string name;

//家庭住址

Address addr;//引用另一個類作為數(shù)據(jù)類型定義對象變量。

}

public class OOTest02

{

public class static void main(string[] args)

{

//創(chuàng)建uesr對象

//u是局部變量

//u是一個引用,引用是指保存指向堆內(nèi)存對象變量地址的一個變量

uesr u=new uesr();

addr=u.Address.city;//訪問一個類中另一個類屬性的,將主方法中的類中的屬性定義為另一個類的數(shù)據(jù)類型。

}

}

public class OOTest02

{

public class static void main(string[] args)

{

//創(chuàng)建uesr對象

//u是局部變量

//u是一個引用,引用是指保存指向堆內(nèi)存對象變量地址的一個變量

uesr u=new uesr();//創(chuàng)建一個新的對象數(shù)據(jù)類型為uesr,使用類user()類;

Address a=new Address();//創(chuàng)建一個新的對象數(shù)據(jù)類型為Address,使用類address()類;

u.addr=a;//將a對象作為u的一個屬性值賦值給addr

//也就是說a的地址可以作為給u.addr,讓其指向Address()

system.out.println(u.addr.city);

a.city="天津";

system.out.println(u.addr.city);

//輸出結(jié)果是null和天津;

//因為u.addr.city是將city的地址存儲在addr中,u.addr的地址有存儲在a中,此時addr和a都指向city,因此當(dāng)a.city的值變動時

}

}

//結(jié)婚

public class husband

{

int name;

int w

}

public class husband

{

int name;

int h

}

public class OOTest

{

public static void main(string[]args)

{

//創(chuàng)建一個丈夫?qū)ο?/p>

Husband huangxiaoming=new husband();

huangxiaoming.name="黃曉明";

//創(chuàng)建一個妻子對象

Wife baby=new Wife();

baby.name="baby"

//結(jié)婚【能通過丈夫找到妻子,通過妻子也可以找到丈夫】

huangxiaoming.w=baby;//黃曉明的妻子是baby這個對象

baby.h=huangXiaoMing;

//的道義上“黃曉明”的妻子的名字

system.out.println(huangxiaoming.name+"的妻子名字叫"+baby.name);//沒有說明baby這個名字是黃曉明的妻子的名字

system.out.println(huangxiaoming.name+"的妻子名字叫"+huangxiaoming.w.name);//可以說明baby這個名字是黃曉明的妻子的名字

}

}

總結(jié):1、jvm主要包括三塊內(nèi)存空間;棧內(nèi)存,堆內(nèi)存,方法區(qū)內(nèi)存

2、堆內(nèi)存和方法區(qū)內(nèi)存各一個,一個線程一個棧內(nèi)存

3、方法調(diào)用時,該方法所需要的內(nèi)存空間中分配,成為壓棧,方法執(zhí)行結(jié)束之后,該方法所屬的內(nèi)存空間釋放,成為彈棧。

4、棧中主要存儲的是方法體當(dāng)中的局部變量

5、方法的代碼片段以及整個類的代碼片段都被存儲到方法區(qū)內(nèi)存當(dāng)中,在類加載的時候這些代碼片段會被載入

6、在程序執(zhí)行過程中使用new運算符創(chuàng)建的java對象,存儲在堆內(nèi)存當(dāng)中,對象內(nèi)部有實例變量,所以實例變量存儲在堆內(nèi)存當(dāng)中。

7、變量分類:

局部變量【方法體中聲明】

成員變量【方法體外聲明】

實例變量【前邊修飾符沒有static】

靜態(tài)變量【前邊修飾符中有static】

8、靜態(tài)變量存儲在方法區(qū)內(nèi)存當(dāng)中【先背會】

9、三個內(nèi)存當(dāng)中變化最頻繁的是棧內(nèi)存,最先有數(shù)據(jù)的是方法區(qū)內(nèi)存,垃圾回收器主要針對的是堆內(nèi)存

10、垃圾回收器【自動垃圾回收機制,GC機制】,什么時候會考慮將某個java對象的內(nèi)存回收呢?

當(dāng)堆內(nèi)存當(dāng)中的java對象成為垃圾數(shù)據(jù)的時候,會被垃圾回收器回收。

什么時候堆內(nèi)存中的java對象會變成垃圾呢?

沒有更多的引用指向它的時候

這個對象無法被訪問,因為訪問對象只能通過引用的方式訪問。

public class Customer

{

int id;

}

public class OOTest

{

public static void main(string[]args)

{

Customer c=new customer();

System.out.println(c.id)

c=null;

//以下程序編譯可以通過,因為符合語法

//運行出現(xiàn)空指針異常。

//空引用訪問“實例”相關(guān)數(shù)據(jù)一定會出現(xiàn)空指針異常,因為此時引用中的實例的地址被清空。

//控制異常的名字是java.lang.NullPointException

}

}

public class Student

{

int number;

String name;

Computer diannao;

}

public class Computer

{

String PinPai;

String xinghao;

String color;

}

public class OOTest//類名必須大寫的,所以使用類名關(guān)鍵字必須首字母大寫,一個類就是一個可用數(shù)據(jù)類型。

{

public static void main(string[] args)

{

Student S1=new Student();

S1.name="小明";

Student S2=new Student();

Student S3=new Student();

Computer c1=new Computer();

Computer c2=new Computer();

c2.PinPai="聯(lián)想";

Computer c3=new Computer();

S1.diannao=c2

System.out.println(S1.name"的電腦"S1.diannao)

}

}

關(guān)聯(lián)關(guān)系:a含有b,a的類中含有b

public class OOTEST

{

Student b=new Student();

}

繼承關(guān)系:a是b,

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容