第三章:面向?qū)ο蟆緅ava語言的核心機(jī)制梁钾,最重要的內(nèi)容建瘫,java語言的特色】
1、面向過程與面向?qū)ο蟮膮^(qū)別
2、面向?qū)ο蟮娜筇卣?/p>
3但惶、類和對(duì)象的概念
4、類得定義【從這里開始編寫代碼】
1数冬、面向過程與面向?qū)ο蟮膮^(qū)別姓惑;
什么叫做面向過程;核心是因果關(guān)系關(guān)注的整個(gè)過程是如何走的配乱,在過程中沒有任何獨(dú)立體溉卓,沒有獨(dú)立體。各個(gè)子系統(tǒng)之間是通過因果關(guān)系連接起來的
如果一個(gè)因果關(guān)系出現(xiàn)問題搬泥,程序全體出問題桑寨。相當(dāng)于串聯(lián)。
優(yōu)點(diǎn)是:對(duì)于業(yè)務(wù)邏輯比較簡(jiǎn)單的程序忿檩,可以快速開發(fā)尉尾,前期投入投入成本很低
缺點(diǎn)是:軟件元素耦合度低,只要一個(gè)環(huán)出現(xiàn)問題燥透,整個(gè)一個(gè)系統(tǒng)收到影響沙咏。沒有獨(dú)立體概念辨图,所以組件無法進(jìn)行復(fù)用。
什么叫做面向?qū)ο笾辏粚讉€(gè)獨(dú)立功能的個(gè)體湊起來故河,實(shí)現(xiàn)一個(gè)場(chǎng)景下的功能。各個(gè)體之間的關(guān)聯(lián)程度極低吆豹。
相當(dāng)于搭積木忧勿,關(guān)注點(diǎn)是功能而不是因果關(guān)系。
優(yōu)點(diǎn):模塊間耦合度低瞻讽,擴(kuò)展力強(qiáng)鸳吸,可復(fù)用,更容易解決現(xiàn)實(shí)世界中更復(fù)雜的邏輯
缺點(diǎn):前期投入成本高速勇,需要進(jìn)行抽取獨(dú)立體抽取晌砾,大量的系統(tǒng)分析與設(shè)計(jì)。
c語言面向過程烦磁,c++半面向?qū)ο笱伲琷ava純面向?qū)ο?/p>
2、面向?qū)ο蟮娜筇卣鳎?/p>
封裝:
繼承:
多態(tài):
所有的面向?qū)ο蟮木幊陶Z言中都有這三大特征
面向?qū)ο蟮恼麄€(gè)生命周期中都伪;
面向?qū)ο蠓治觯篛OA
面向?qū)ο蟮脑O(shè)計(jì):OOD
面向?qū)ο蟮木幊蹋篛OP
3呕乎、類和對(duì)象的概念;
什么是類:現(xiàn)實(shí)中不存在陨晶,是人類大腦抽象思維總結(jié)的結(jié)果猬仁。是一個(gè)模板,是一個(gè)概念先誉。
類代表了一類事物
對(duì)象A和對(duì)像B中具有共同特征湿刽,進(jìn)行抽象總結(jié)出一個(gè)模板,這個(gè)模板被稱為類
什么是對(duì)象:對(duì)象是實(shí)際存在的個(gè)體『侄現(xiàn)實(shí)世界當(dāng)中實(shí)際存在诈闺。
先有對(duì)象之后人類思考對(duì)象后,發(fā)現(xiàn)對(duì)象與對(duì)象之間有相同的特征铃芦。在大腦中形成了模板就是類雅镊。
java程序員可以通過java代碼來表述一個(gè)類
java程序中有了類的定義
然后通過類可以創(chuàng)建對(duì)象
有了對(duì)象之后,可以讓對(duì)象直接協(xié)作起來形成一個(gè)系統(tǒng)刃滓。
類到對(duì)象的過程叫做實(shí)例化
對(duì)象又叫實(shí)例/instance
對(duì)象到類的過程叫做抽象
類描述的是對(duì)象的共同特征仁烹。
共同特征例如:身高特征
這個(gè)身高特征在訪問的時(shí)候,必須先創(chuàng)建對(duì)象注盈,通過對(duì)象去訪問這個(gè)特征晃危。
因?yàn)檫@個(gè)特征具體到某個(gè)對(duì)象上之后叙赚,志不同老客。有的對(duì)象身高1.80僚饭,有的對(duì)象身高2.80。
一個(gè)類主要描繪什么信息呢胧砰?
一個(gè)類主要描述的是狀態(tài)+動(dòng)作鳍鸵。
狀態(tài):名字,身高尉间,性別偿乖,年齡。
動(dòng)作:吃哲嘲,唱歌贪薪,跳舞,學(xué)習(xí)眠副。
類
{
屬性;//描述對(duì)象的狀態(tài)信息
方法;//描述對(duì)象的動(dòng)作信息
}
注意:狀態(tài)和動(dòng)作當(dāng)具體到某個(gè)具體的動(dòng)作之后画切,發(fā)現(xiàn)可能結(jié)果不太一樣。
對(duì)象和對(duì)象之間有共同特征囱怕,具體到對(duì)象之后由數(shù)據(jù)的差異霍弹。
類的定義://屬于引用數(shù)據(jù)類型。
語法結(jié)構(gòu):
[修飾符列表]class 類名
{
}
學(xué)生類娃弓,描述所有學(xué)生對(duì)象的共同特征典格;
public? class student
{
//學(xué)生對(duì)象有哪些狀態(tài)信息;
//屬性通常采用變量的方式來定義
//在類體當(dāng)中方法體外的變量屬于成員變量台丛,可以不賦初值耍缴,默認(rèn)賦值為0;
int 學(xué)號(hào)
string 姓名
boolean 性別
int 年齡
string 住址
}
//基本數(shù)據(jù)類型
/*
byte
short
int
long
float
double
boolean
char?
*/
//引用數(shù)據(jù)類型
/*
String
Student
User
Product
Customer
*/
寫一個(gè)類:
//學(xué)生類:
//學(xué)生類是一個(gè)模板挽霉,描述所有學(xué)生的共同特征【狀態(tài)+行為】
//當(dāng)前類只描述學(xué)生的狀態(tài)信息【屬性】
public class Student//類型名就是student
{
//類體=屬性+方法
//屬性【存儲(chǔ)數(shù)據(jù)采用變量的形式】
//每個(gè)學(xué)生的學(xué)號(hào)不同私恬,要訪問這個(gè)學(xué)號(hào)必須先創(chuàng)建對(duì)象,通過對(duì)象去訪問學(xué)號(hào)信息
//學(xué)號(hào)信息不能直接通過類去訪問炼吴,只有通過實(shí)例才能訪問具體的學(xué)號(hào)本鸣。
//對(duì)象又被稱為實(shí)例,實(shí)例變量又被稱為對(duì)象變量
//不創(chuàng)建對(duì)象硅蹦,這個(gè)no變量的內(nèi)存空間不存在的荣德,只有創(chuàng)建了對(duì)象,這個(gè)no變量?jī)?nèi)存空間才會(huì)創(chuàng)建童芹。
int no;
//姓名
string name;
? ? //姓名
int age;
//年齡
boolean sex
}
public class ootest01
{
public static void main (string[] args)
{
//通過一個(gè)類實(shí)例N個(gè)對(duì)象
//實(shí)例化對(duì)象的語法:new類名();
//new預(yù)算符的作用是創(chuàng)建對(duì)象涮瞻,在jvm堆內(nèi)存當(dāng)中開辟新的內(nèi)存空間。
//方法區(qū)內(nèi)存假褪;在類加載的時(shí)候署咽,進(jìn)行壓棧操作,class字節(jié)碼代碼片段被加載到該內(nèi)存空間當(dāng)中。(只有一個(gè)方法區(qū)內(nèi)存)
//棧內(nèi)存(存儲(chǔ)局部變量):方法代碼片段執(zhí)行的時(shí)候宁否,會(huì)給該方法分配內(nèi)存空間窒升,在棧內(nèi)存中壓棧。(每個(gè)線程就會(huì)有一個(gè)方法區(qū)內(nèi)存)
//堆內(nèi)存:new的對(duì)象在堆內(nèi)存中儲(chǔ)存慕匠。(堆內(nèi)存只有一個(gè))
//student就是一個(gè)數(shù)據(jù)類型
//s是一個(gè)變量名
//s是一個(gè)局部變量饱须,在棧內(nèi)存中存儲(chǔ)。存儲(chǔ)了一個(gè)地址台谊,指向堆內(nèi)存中的對(duì)象蓉媳,類似于指針。(這種將對(duì)象地址賦值給變量的方式稱為引用)
//new student()是一個(gè)學(xué)生對(duì)象锅铅,被保存在s中存儲(chǔ)的內(nèi)存里酪呻。在堆內(nèi)存中。
//在student對(duì)象中盐须,其所有實(shí)例變量根據(jù)數(shù)據(jù)的類型賦初始默認(rèn)值号杠。
//什么是對(duì)象?new運(yùn)算符在堆內(nèi)存中開辟出的內(nèi)存空間成為對(duì)象丰歌。
//什么是引用姨蟋?引用是一個(gè)變量,只不過這個(gè)變量保存了另一個(gè)java對(duì)象的內(nèi)存地址立帖。
//堆內(nèi)存中的數(shù)據(jù)必須通過引用進(jìn)行數(shù)據(jù)操作眼溶。不能直接操作堆內(nèi)存,因?yàn)閖ava中沒有指針晓勇。
//程序員只能通過引用去訪問崔內(nèi)存當(dāng)中對(duì)象內(nèi)部的實(shí)例變量
student s=new Student()
//訪問實(shí)例變量的語法格式堂飞;
//讀取數(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;
//修改對(duì)象的數(shù)據(jù)
//總結(jié):s是一個(gè)引用绑咱,s同時(shí)是一個(gè)局部變量绰筛,student變量的數(shù)據(jù)類型。
//局部變量在棧內(nèi)存中存儲(chǔ)描融,成員變量中的實(shí)例變量在堆內(nèi)存的java對(duì)象內(nèi)存儲(chǔ)
//實(shí)例變量是一個(gè)對(duì)象一份铝噩,100個(gè)對(duì)象有100份
//類似于system.out.println(student.age);的寫法是錯(cuò)誤的因?yàn)橹荒芡ㄟ^對(duì)象才能訪問堆內(nèi)存中的實(shí)例變量數(shù)據(jù)值。
}
}
public class Address
{
//城市
string city;
//用戶名
string jiedao;
//家庭住址
}
public class user
{
//用戶編號(hào)
int no;
//用戶名
string name;
//家庭住址
Address addr;//引用另一個(gè)類作為數(shù)據(jù)類型定義對(duì)象變量窿克。
}
public class OOTest02
{
public class static void main(string[] args)
{
//創(chuàng)建uesr對(duì)象
//u是局部變量
//u是一個(gè)引用骏庸,引用是指保存指向堆內(nèi)存對(duì)象變量地址的一個(gè)變量
uesr u=new uesr();
addr=u.Address.city;//訪問一個(gè)類中另一個(gè)類屬性的,將主方法中的類中的屬性定義為另一個(gè)類的數(shù)據(jù)類型年叮。
}
}
public class OOTest02
{
public class static void main(string[] args)
{
//創(chuàng)建uesr對(duì)象
//u是局部變量
//u是一個(gè)引用具被,引用是指保存指向堆內(nèi)存對(duì)象變量地址的一個(gè)變量
uesr u=new uesr();//創(chuàng)建一個(gè)新的對(duì)象數(shù)據(jù)類型為uesr,使用類user()類只损;
Address a=new Address();//創(chuàng)建一個(gè)新的對(duì)象數(shù)據(jù)類型為Address一姿,使用類address()類;
u.addr=a;//將a對(duì)象作為u的一個(gè)屬性值賦值給addr
//也就是說a的地址可以作為給u.addr,讓其指向Address()
system.out.println(u.addr.city);
a.city="天津";
system.out.println(u.addr.city);
//輸出結(jié)果是null和天津叮叹;
//因?yàn)閡.addr.city是將city的地址存儲(chǔ)在addr中艾栋,u.addr的地址有存儲(chǔ)在a中,此時(shí)addr和a都指向city衬横,因此當(dāng)a.city的值變動(dòng)時(shí)
}
}
//結(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)建一個(gè)丈夫?qū)ο?/p>
Husband huangxiaoming=new husband();
huangxiaoming.name="黃曉明";
//創(chuàng)建一個(gè)妻子對(duì)象
Wife baby=new Wife();
baby.name="baby"
//結(jié)婚【能通過丈夫找到妻子裹粤,通過妻子也可以找到丈夫】
huangxiaoming.w=baby;//黃曉明的妻子是baby這個(gè)對(duì)象
baby.h=huangXiaoMing;
//的道義上“黃曉明”的妻子的名字
system.out.println(huangxiaoming.name+"的妻子名字叫"+baby.name);//沒有說明baby這個(gè)名字是黃曉明的妻子的名字
system.out.println(huangxiaoming.name+"的妻子名字叫"+huangxiaoming.w.name);//可以說明baby這個(gè)名字是黃曉明的妻子的名字
}
}
總結(jié):1终蒂、jvm主要包括三塊內(nèi)存空間蜂林;棧內(nèi)存,堆內(nèi)存拇泣,方法區(qū)內(nèi)存
2噪叙、堆內(nèi)存和方法區(qū)內(nèi)存各一個(gè),一個(gè)線程一個(gè)棧內(nèi)存
3霉翔、方法調(diào)用時(shí)睁蕾,該方法所需要的內(nèi)存空間中分配,成為壓棧债朵,方法執(zhí)行結(jié)束之后子眶,該方法所屬的內(nèi)存空間釋放,成為彈棧序芦。
4臭杰、棧中主要存儲(chǔ)的是方法體當(dāng)中的局部變量
5、方法的代碼片段以及整個(gè)類的代碼片段都被存儲(chǔ)到方法區(qū)內(nèi)存當(dāng)中谚中,在類加載的時(shí)候這些代碼片段會(huì)被載入
6渴杆、在程序執(zhí)行過程中使用new運(yùn)算符創(chuàng)建的java對(duì)象,存儲(chǔ)在堆內(nèi)存當(dāng)中宪塔,對(duì)象內(nèi)部有實(shí)例變量磁奖,所以實(shí)例變量存儲(chǔ)在堆內(nèi)存當(dāng)中。
7某筐、變量分類:
局部變量【方法體中聲明】
成員變量【方法體外聲明】
實(shí)例變量【前邊修飾符沒有static】
靜態(tài)變量【前邊修飾符中有static】
8比搭、靜態(tài)變量存儲(chǔ)在方法區(qū)內(nèi)存當(dāng)中【先背會(huì)】
9、三個(gè)內(nèi)存當(dāng)中變化最頻繁的是棧內(nèi)存南誊,最先有數(shù)據(jù)的是方法區(qū)內(nèi)存敢辩,垃圾回收器主要針對(duì)的是堆內(nèi)存
10、垃圾回收器【自動(dòng)垃圾回收機(jī)制弟疆,GC機(jī)制】戚长,什么時(shí)候會(huì)考慮將某個(gè)java對(duì)象的內(nèi)存回收呢?
當(dāng)堆內(nèi)存當(dāng)中的java對(duì)象成為垃圾數(shù)據(jù)的時(shí)候怠苔,會(huì)被垃圾回收器回收同廉。
什么時(shí)候堆內(nèi)存中的java對(duì)象會(huì)變成垃圾呢?
沒有更多的引用指向它的時(shí)候
這個(gè)對(duì)象無法被訪問,因?yàn)樵L問對(duì)象只能通過引用的方式訪問迫肖。
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;
//以下程序編譯可以通過锅劝,因?yàn)榉险Z法
//運(yùn)行出現(xiàn)空指針異常。
//空引用訪問“實(shí)例”相關(guān)數(shù)據(jù)一定會(huì)出現(xiàn)空指針異常蟆湖,因?yàn)榇藭r(shí)引用中的實(shí)例的地址被清空故爵。
//控制異常的名字是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)鍵字必須首字母大寫隅津,一個(gè)類就是一個(gè)可用數(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,