1. 程式人生 > 其它 >面向物件----(程式執行過程的記憶體分析01)

面向物件----(程式執行過程的記憶體分析01)

引用型別

Java 語言中除基本型別之外的變數型別都稱之為引用型別.

Java中的物件是通過引用(reference)對其操作的.

類的屬性

屬性 field ,或者叫成員變數

屬性用於定義該類或該類物件包含的資料或者說靜態屬性.

屬性作用範圍是整個類體

在定義成員變數時可以對其初始化,如果不對其初始化,java使用預設的值對其初始化.(數值: 0,0.0 char:\u0000, boolean:false,所有引用型別:null   )

屬性定義格式:

            [修飾符]  屬性型別   屬性名 = [預設值]

  面向物件中,整個程式的基本單位是類,

 方法是從屬於類的.

 方法定義格式

:

  [修飾符] 方法返回值型別  方法名(形參列表) {

n條語句

 }

 java中方法引數傳遞是:值傳遞!沒有引用傳遞  

記憶體分析( SxtStu..java )

:

存放:區域性變數

:

存放new出來的物件

方法區:

存放:類的資訊(程式碼), static變數, 常量池(字串常量).

記憶體分析:

(自動分配連續的空間,後進先出)

放置:區域性變數 

(不連續 , )

:放置new處的物件 

方法區():也是堆的一部分

類的資訊(程式碼), static變數, 常量池(字串常量).

存放:類的程式碼資訊,static變數,常量池(字串常量......) 

package cn.Test.oop;

/**

 *  以類的方式組織程式碼,以物件的方式封裝(組織)資料!

    操作物件就是操作它的地址!

    物件以類為模板來的!

    所有的引用型別都是4個位元組!

 * @author 神奇的夢

 *

 */

public class Student {

    //屬性:靜態的資料 private 私有

//  成員變數你不初始化,系統會幫你初始化一下

     String name;

     int id; //學號

     int age;//年齡

     String gender;//性別

     int weight;//體重   

    //動態的行為     

     public void study() {

//       區域性變數不會初始化,需要自己初始化

         int a;

//       the local variable a 這個區域性變數a

//       may not have been _initializeo 也許沒有被初始化

//       System.out.print(a+3);

         System.out.println(name+"在學習");

     }

     sname是區域性變數需要宣告,name是成員變數已經宣告;

     public void sayHello(String sname) {

         System.out.println(name+"向"+sname+"說:你好!");

     }

//   形參列表形式: 資料型別1 形參名1,資料型別2 形參名2,...

        public int add(int a,int b,int c) {           

            int k=a+b+c;

//          return語句用於終止方法的執行並指定要返回的資料

            return k;           

        }     

//   從程式碼上講Student從屬Student()有關係

//   從邏輯上講Student和Student()沒有關係     

//   main及和它有關係,又可以認為沒關係,因為所有的方法都要從main開始

//   虛擬機器跑起來之後就找main方法

//   java裡面所有的方法只能放在main裡面,不能放到類之外 

     public static void main(String[] a) {         

//       如果是物件的話除了八種資料型別之外的話都是null

//       如果是數字預設是0小數是0.0

//       boolean預設是false

//       char: 反斜槓u0000  表示一個unknown也是0

//       構造類的初始化 建立一個學生物件

//       有沒賦值的時候系統會預設給其賦個值         

         Student s1=new Student();      

         s1.name="寶氣";

         s1.study();

         s1.sayHello("馬克");

         /**

          *

         到這一步_jvm虛擬機器就會在記憶體空間裡面找有沒有Student這個類

         如果已經載入了這個資訊我們這裡可以直接用

         如果沒載入就在類裡面找到並載入,找不到就會報錯,它找的是class位元組碼檔案的類         

         通過類載入器Class Loader載入Student類的資訊,

         載入後,在方法區中就有了類的資訊         

         s2是一個區域性變數  建一個物件把物件的值覆蓋這個變數

         new Student()這是呼叫我們的構造器         

         只要通過new構造的物件都會丟到堆裡面去

         (通過賦值符=指向s2的地址)       

          *

          */ 

         Student s2=new Student();

         /**

          * 方法區(也是堆)

          * 方法區():也是堆的一部分!類的資訊(程式碼), static變數, 常量池(字串常量)等.

                存放:類的程式碼資訊,static變數,常量池(字串常量......)

          * 程式碼

          *     一堆屬性

          *     Study(){

          *     ......

          *     }

          *    

          *     sayHello(){

          *     ......

          *     }  

          * static變數(以後再說)

          * 常量池(字串常量...)

          * "寶氣","寶氣22","寶氣333"

          *

          *

          */

         

         /**

          *

          * 堆(不連續 , )堆:放置new處的物件

        "new出來的模板"

          * 這裡存的是地址(引用)

          *

          * name=null

          * id:0;

          * age:0;

          * gender:null;

          * weight:0;

          *

          * study:

          * sayHello:

          *

          * 通過study:指向study()

          * 通過sayHello:指向sayHello()

          *

          * 通過賦值符=指向s1的地址

          *

          *

          */

         

         /**

          * 棧

          * 棧(自動分配連續的空間,後進先出)放置:區域性變數

          * s1 地址

          *

          * 棧裡面要進行操作開一個棧針(每個方法對應一個棧針),用完就沒有了(斯泰格福瑞姆)

          */ 

//       它方法區裡面的物件通過引用賦值給堆裡面的name地址(引用),

//       然後指向s2的地址

//       通過study:指向study()

//       通過賦值符=指向s2的地址

//       基本資料型別是可以直接賦值的

         s2.age=18;

         s2.name="寶氣";

//       study()會指向它的方法 堆裡面

//       棧裡面要進行操作開一個棧針(每個方法對應一個棧針),

//       用完就沒有了(斯泰格福瑞姆)         

         s2.study();

//       sayHello()會指向它的方法 堆裡面

//       找到s2後指向一個study:再找到Study()方法

         s2.sayHello("寶氣22");         

          Student mt=new Student();

         int i=3,j=4,k=5;

         int result =mt.add(i, j, k);

//       呼叫方法呼叫的形式:物件引用.方法名(實參列表)

//       實參的數目,資料型別和次序必須和所呼叫方法宣告的形參列表匹配

         System.out.println(result);   

     }     

}