面向物件----(程式執行過程的記憶體分析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);
}
}