尚硅谷Java中類對象的創(chuàng)建及內(nèi)存解析ppt課件_第1頁
尚硅谷Java中類對象的創(chuàng)建及內(nèi)存解析ppt課件_第2頁
尚硅谷Java中類對象的創(chuàng)建及內(nèi)存解析ppt課件_第3頁
尚硅谷Java中類對象的創(chuàng)建及內(nèi)存解析ppt課件_第4頁
尚硅谷Java中類對象的創(chuàng)建及內(nèi)存解析ppt課件_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、JavaJava中類對象的創(chuàng)中類對象的創(chuàng)建及內(nèi)存解析建及內(nèi)存解析講師:宋紅康講師:宋紅康 新浪微博:尚硅谷新浪微博:尚硅谷- -宋紅康宋紅康程序的執(zhí)行過程程序的執(zhí)行過程程 序代碼操作系統(tǒng)代碼內(nèi)內(nèi)存存硬硬 盤盤棧stack堆heap靜態(tài)域方法區(qū)(常量池)new出來的類或數(shù)組的實(shí)例(含成員變量)部分變量、對象聲明的援用靜態(tài)變量2.找到main方法開場執(zhí)行3.執(zhí)行過程中的內(nèi)存管理1.load到內(nèi)存區(qū)字符串常量眾所周知,Java是由一個一個的“類構(gòu)成的,那么Java類可以由哪些部分組成?屬性Field方法Method構(gòu)造器Constructor:創(chuàng)建對象初始化對象代碼塊內(nèi)部類一、一、Java類的最根本

2、元素:類的最根本元素:Field & Methodl 生活中描畫事物無非就是描畫事物的屬性和行為。l 如:人有身高,體重等屬性,有說話,打球等行為。l Java中用類class來描畫事物也是如此l 屬性:對應(yīng)類中的成員變量。l 行為:對應(yīng)類中的成員方法。l 定義類其實(shí)是定義類中的成員(成員變量和成員方法)。Field = 屬性屬性 = 成員變量,成員變量,Method = (成員成員)方法方法 = 函數(shù)函數(shù)Java類的定義類的定義public class Animal public int legs; public void eat() System.out.println(“Eati

3、ng.); public void move() System.out.println(“Moving.); legs是類的屬性是類的屬性 ,也叫類成員變量,也叫類成員變量 。eat(),move()是函數(shù),也叫類的成員方法。是函數(shù),也叫類的成員方法。Java 類類數(shù)據(jù)1數(shù)據(jù)n方法1方法n屬性屬性方法方法Animallegseat()move()數(shù)據(jù)數(shù)據(jù)(屬性屬性)方法方法類名類名x2:Animallegs=0eat()move()x1:Animallegs=4eat()move()new Animal()new Animal()舉例舉例二、二、Java 中類與對象中類與對象 棧堆p1:0 x

4、1234new Person()0 x1234age:12name:0 x2345常量池Lileip2:age:23name:HanMeimei24假設(shè)創(chuàng)建了一個假設(shè)創(chuàng)建了一個類的多個對象,對類的多個對象,對于類中定義的屬性,于類中定義的屬性,每個對象都擁有各每個對象都擁有各自的一套副本,且自的一套副本,且互不干擾?;ゲ桓蓴_。曰:“白馬非馬,可乎?曰:“可。曰:“何哉?曰:“馬者,所以命形也。白者,所以命色也。命色者,非命形也,故曰白馬非馬。對象的創(chuàng)建和運(yùn)用對象的創(chuàng)建和運(yùn)用 假設(shè)創(chuàng)建了一個類假設(shè)創(chuàng)建了一個類的多個對象,對于的多個對象,對于類中定義的屬性,類中定義的屬性,每個對象都擁有各每個對象

5、都擁有各自的一套副本,且自的一套副本,且互不干擾?;ゲ桓蓴_。舉例舉例: public class Zoo public static void main(String args)Animal x1=new Animal();Animal x2=new Animal();x1.legs=4;x2.legs=0;System.out.println(x1.legs); /4System.out.println(x2.legs); /0 x1.legs=2;System.out.println(x1.legs); /2System.out.println(x2.legs); /0 Person St

6、ring name = “Peter; int age; public void addAge() int i = 2; age = age +i; main() Person p = new Person(); = “Lily; p.addAge(); Person p1 = new Person(); 棧堆p: 0 x3423new Person();0 x3423String name = “Peter; int age = 0;Lilyi = 22p1:0 x34330 x3433String name = “Peter; int age = 0;練習(xí):根據(jù)代碼,畫出內(nèi)存

7、圖練習(xí):根據(jù)代碼,畫出內(nèi)存圖class Car String color = red; int num = 4; void show() System.out.println(color=+color+“num=+num); class TestCar public static void main(String args) Car c1 = new Car(); /建立對象建立對象c1Car c2 = new Car(); /建立對象建立對象c2c1.color = blue; /對對象的屬性進(jìn)展修正對對象的屬性進(jìn)展修正c1.show(); /運(yùn)用對象的方法運(yùn)用對象的方法c2.show();

8、 對象內(nèi)存構(gòu)造對象內(nèi)存構(gòu)造Car c1 = new Car(); c1.color=blue;Car c2 = new Car();heapc10 x0034c20 x00780 x00340 x0078new Car( )new Car( )color=rednum=4color=rednum=4blue三、構(gòu)造器的運(yùn)用三、構(gòu)造器的運(yùn)用l 根據(jù)參數(shù)不同,構(gòu)造器可以分為如下兩類:l 隱式無參構(gòu)造器系統(tǒng)默許提供l 顯式定義一個或多個構(gòu)造器無參、有參l 注 意:l Java言語中,每個類都至少有一個構(gòu)造器l 默許構(gòu)造器的修飾符與所屬類的修飾符一致l 一旦顯式定義了構(gòu)造器,那么系統(tǒng)不再提供默許構(gòu)造器

9、l 一個類可以創(chuàng)建多個重載的構(gòu)造器l 父類的構(gòu)造器不可被子類承繼class Person/ 定義Person類private String name ;private int age ;public Person() / 無參構(gòu)造System.out.println(“調(diào)用無參構(gòu)造器) ;public Person(String name)this(); / 調(diào)用本類中的無參構(gòu)造方法 = name ;public Person(String name,int age)this(name) ; / 調(diào)用有一個參數(shù)的構(gòu)造方法this.age = age;public String

10、 getInfo()return 姓名: + name + ,年齡: + age ; 重載構(gòu)造器的迭代運(yùn)用重載構(gòu)造器的迭代運(yùn)用調(diào)用父類的構(gòu)造器調(diào)用父類的構(gòu)造器l 子類中一切的構(gòu)造器默許都會訪問父類中空參數(shù)的構(gòu)造器l 當(dāng)父類中沒有空參數(shù)的構(gòu)造器時,子類的構(gòu)造器必需經(jīng)過this(參數(shù)列表)或者super(參數(shù)列表)語句指定調(diào)用本類或者父類中相應(yīng)的構(gòu)造器,且必需放在構(gòu)造器的第一行l(wèi) 假設(shè)子類構(gòu)造器中既未顯式調(diào)用父類或本類的構(gòu)造器,且父類中又沒有無參的構(gòu)造器,那么編譯出錯s:0 x1243new Student()父類的屬性age:0name:nullschool:nullObject類調(diào)用父類構(gòu)造器

11、舉例調(diào)用父類構(gòu)造器舉例 1 public class Student extends Person 2 private String school;34 public Student(String name, int age, String s) 5 super(name, age);6 school = s;7 8 public Student(String name, String s) 9 super(name);10 school = s;11 12 public Student(String s) / 編譯出錯: no super(),系統(tǒng)將調(diào)用父類 無參數(shù)的構(gòu)造方法。13 scho

12、ol = s;14 15 class Creature public Creature()System.out.println(Creature無參數(shù)的構(gòu)造器無參數(shù)的構(gòu)造器); class Animal extends Creature public Animal(String name)System.out.println(Animal帶一個參數(shù)的構(gòu)造器,該動物的帶一個參數(shù)的構(gòu)造器,該動物的name為為 + name); public Animal(String name , int age)this(name);System.out.println(Animal帶兩個參數(shù)的構(gòu)造器,其帶兩個

13、參數(shù)的構(gòu)造器,其age為為 + age); public class Wolf extends Animal public Wolf()super(灰太狼灰太狼, 3);System.out.println(Wolf無參數(shù)的構(gòu)造器無參數(shù)的構(gòu)造器); public static void main(String args)new Wolf(); 練習(xí):寫出輸出結(jié)果 當(dāng)我們編寫一個類時,其實(shí)就是在描畫其對象的屬性和行為,而并沒有產(chǎn)生本質(zhì)上的對象,只需經(jīng)過new關(guān)鍵字才會產(chǎn)生出對象,這時系統(tǒng)才會分配內(nèi)存空間給對象,其方法才可以供外部調(diào)用。我們有時候希望無論能否產(chǎn)生了對象或無論產(chǎn)生了多少對象的情況下,

14、某些特定的數(shù)據(jù)在內(nèi)存空間里只需一份,例如一切的中國人都有個國家稱號,每一個中國人都共享這個國家稱號,不用在每一個中國人的實(shí)例對象中都單獨(dú)分配一個用于代表國家稱號的變量。四、關(guān)鍵字四、關(guān)鍵字staticc2:c1:radius:2.0name:radius:3.0name:靜態(tài)域name:這是一個圓關(guān)鍵字關(guān)鍵字staticl class Circlelprivate double radius;lpublic Circle(double radius)this.radius=radius;lpublic double findArea()return Math.PI*radius*radius;

15、l 創(chuàng)建兩個Circle對象l Circle c1=new Circle(2.0);/c1.radius=2.0l Circle c2=new Circle(3.0);/c2.radius=3.0l Circle類中的變量radius是一個實(shí)例變量(instance variable),它屬于類的每一個對象,不能被同一個類的不同對象所共享。l 上例中c1的radius獨(dú)立于c2的radius,存儲在不同的空間。c1中的radius變化不會影響c2的radius,反之亦然。假設(shè)想讓一個類的一切實(shí)例共享數(shù)據(jù),就用類變量!假設(shè)想讓一個類的一切實(shí)例共享數(shù)據(jù),就用類變量!靜態(tài)域堆棧country:CHI

16、NAstatic的屬性a1:0 x1232name:Peterage:12country:a2:0 x1222name:Lileiage:21country:class Circle private double radius;public static String name = 這是一個圓;public static String getName()return name;public Circle(double radius) getName();this.radius = radius;public double findArea() return Math.PI * radius *

17、 radius;public void display()System.out.println(name:+name+radius:+radius);public class TestStatic public static void main(String args) Circle c1 = new Circle(2.0);Circle c2 = new Circle(3.0);c1.display();c2.display();棧堆靜態(tài)域c1:c2:radius:2.0name:radius:3.0name:name:圓static修飾初始化塊修飾初始化塊l 一個類中初始化塊假設(shè)有修飾符,

18、那么只能被static修飾,稱為靜態(tài)代碼塊(static block ),當(dāng)類被載入時,類屬性的聲明和靜態(tài)代碼塊先后順序被執(zhí)行,且只被執(zhí)行一次。l static塊通常用于初始化static (類)屬性l class Person lpublic static int total;lstatic l total = 100;/為total賦初值 ll /其它屬性或方法聲明l l 非靜態(tài)代碼塊:沒有非靜態(tài)代碼塊:沒有static修飾的代碼塊修飾的代碼塊l 1.可以有輸出語句。可以有輸出語句。l 2.可以對類的屬性、類的聲明進(jìn)展初始化操作??梢詫︻惖膶傩浴㈩惖穆暶鬟M(jìn)展初始化操作。l 3.可以調(diào)用靜態(tài)

19、的變量或方法??梢哉{(diào)用靜態(tài)的變量或方法。l 4.假設(shè)有多個非靜態(tài)的代碼塊,那么按照從上到下的順序假設(shè)有多個非靜態(tài)的代碼塊,那么按照從上到下的順序依依l 次執(zhí)行。次執(zhí)行。l 5.每次創(chuàng)建對象的時候,都會執(zhí)行一次。且先于構(gòu)造器執(zhí)每次創(chuàng)建對象的時候,都會執(zhí)行一次。且先于構(gòu)造器執(zhí)行行l(wèi) 靜態(tài)代碼塊:用靜態(tài)代碼塊:用static 修飾的代碼塊修飾的代碼塊l 1.可以有輸出語句??梢杂休敵稣Z句。l 2.可以對類的屬性、類的聲明進(jìn)展初始化操作。可以對類的屬性、類的聲明進(jìn)展初始化操作。l 3.不可以對非靜態(tài)的屬性初始化。即:不可以調(diào)用非靜態(tài)的不可以對非靜態(tài)的屬性初始化。即:不可以調(diào)用非靜態(tài)的屬屬l 性和方法。

20、性和方法。l 4.假設(shè)有多個靜態(tài)的代碼塊,那么按照從上到下的順序依次假設(shè)有多個靜態(tài)的代碼塊,那么按照從上到下的順序依次執(zhí)行。執(zhí)行。l 5.靜態(tài)代碼塊的執(zhí)行要先于非靜態(tài)代碼塊。靜態(tài)代碼塊的執(zhí)行要先于非靜態(tài)代碼塊。l 6.靜態(tài)代碼塊只執(zhí)行一次靜態(tài)代碼塊只執(zhí)行一次靜態(tài)初始化塊舉例靜態(tài)初始化塊舉例class Person public static int total; static total = 100;System.out.println(in static block!); public class Test public static void main(String args) Syste

21、m.out.println(total = + Person.total);System.out.println(total = + Person.total);練習(xí):練習(xí):TestLeaf.java輸出:輸出:in static blocktotal=100total=100五、方法的參數(shù)傳送五、方法的參數(shù)傳送l 方法只需被調(diào)用才會被執(zhí)行l(wèi) 方法調(diào)用的過程分析:方法的參數(shù)傳送方法的參數(shù)傳送l 方法,必需有其所在類或?qū)ο笳{(diào)用才有意義。假方法,必需有其所在類或?qū)ο笳{(diào)用才有意義。假設(shè)方法含有參數(shù):設(shè)方法含有參數(shù):l 形參:方法聲明時的參數(shù)形參:方法聲明時的參數(shù)l 實(shí)參:方法調(diào)用時實(shí)踐傳給形參的參數(shù)

22、值實(shí)參:方法調(diào)用時實(shí)踐傳給形參的參數(shù)值l Java的實(shí)參值如何傳入方法呢?的實(shí)參值如何傳入方法呢?l Java里方法的參數(shù)傳送方式只需一種:值傳里方法的參數(shù)傳送方式只需一種:值傳送。送。 即將實(shí)踐參數(shù)值的副本復(fù)制品傳入方法即將實(shí)踐參數(shù)值的副本復(fù)制品傳入方法內(nèi),而參數(shù)本身不受影響。內(nèi),而參數(shù)本身不受影響。方法的參數(shù)傳送方法的參數(shù)傳送 根本數(shù)據(jù)類型的參根本數(shù)據(jù)類型的參數(shù)傳送數(shù)傳送 :方法的參數(shù)傳送方法的參數(shù)傳送 援用數(shù)據(jù)類型的參援用數(shù)據(jù)類型的參數(shù)傳送數(shù)傳送:方法的參數(shù)傳送方法的參數(shù)傳送 援用數(shù)據(jù)類型的參援用數(shù)據(jù)類型的參數(shù)傳送數(shù)傳送方法的參數(shù)傳送方法的參數(shù)傳送public class TestTra

23、nsfer public static void swap(int a , int b)int tmp = a;a = b;b = tmp;System.out.println(swap方法里,a的值是 + a + ;b的值是 + b);public static void main(String args) int a = 6;int b = 9;swap(a , b);System.out.println(交換終了后,變量a的值是 + a + ;變量b的值是 + b); 請輸出結(jié)果請輸出結(jié)果a:6b:9main()swap()dw:0 x1233d:0 x1233a:9b:6 new Da

24、taSwap()方法的參數(shù)傳送方法的參數(shù)傳送class DataSwappublic int a;public int b;public class TestTransfer1 public static void swap(DataSwap ds)int tmp = ds.a;ds.a = ds.b;ds.b = tmp;System.out.println(swap方法里,方法里,a Field的值是的值是+ ds.a + ;b Field的值是的值是 + ds.b);public static void main(String args) DataSwap ds = new DataSw

25、ap();ds.a = 6;ds.b = 9;swap(ds);System.out.println(交換終了后,交換終了后,a Field的值是的值是 + ds.a + ;b Field的值是的值是 + ds.b);請輸出結(jié)果請輸出結(jié)果mainswapi=6j=9i=6j=9i=9j=6mainswapds:0 x7654new DataSwap()a = 9b = 6class Value int i = 15;class Test public static void main(String args)Test t = new Test();t.first();public void f

26、irst() int i = 5;Value v = new Value();v.i = 25;second(v, i);System.out.println(v.i);public void second(Value v, int i) i = 0;v.i = 20;Value val = new Value();v = val;System.out.println(v.i + + i);練練 習(xí):寫出輸出結(jié)果習(xí):寫出輸出結(jié)果t:0 x1234i = 5v:0 x8765i = 1525v:0 x8765i = 5 020val:0 x4567i = 150 x4567class BirthDateprivate int day;private int month;private int year;public BirthDate(int d,int m,int y)day = d; month = m; year = y;public void setDay(int d)day = d;public void setMonth(int m)month = m;public void setYear(int y)year = y;public int getDay()return day;public int getMo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論