一、建立並使用對象的格式java
static 區分共享與私有c++
一、建立對象的語法 ---- 注意:對象也是一個變量(引用類型)數組
類名 對象名 = new 類名();spa
二、調用對象的屬性code
對象名.變量名orm
三、調用對象的方法對象
對象名.方法名內存
static 修飾的字段 ----> 被全部對象共享資源
非static 字段---------> 每一個對象專有的字符串
Java如何實現的?
static修飾的字段 -----> 存在的位置 -----> 方法區的靜態區 -----> 只有一塊內存
非static 的字段 ------> 存在的位置 -----> 堆中的對象的空間 ---> 有多少個對象
就建立多少份對應字段 ------> 每一個對象都有本身專有的
Java經過內存分配實現了專有與共享
class OOp03 { public static void main(String[] args){ //一、建立對象 Dorm dorm1 = new Dorm(); Dorm dorm2 = new Dorm(); //二、使用計算機概念的對象模擬實現對象的屬性與行爲 // -------- 將宿舍101以代碼的方式體現 -------- dorm1.title = "101"; dorm1.elec = 0; dorm1.water = false; //改變電錶數字 dorm1.changeElec(); System.out.println("101的當前電錶數:" + dorm1.elec);//101的當前電錶數:1 // ------- 將宿舍102以代碼的方式體現 --------- dorm2.title = "102"; dorm2.elec = 100; dorm2.water = true; dorm2.changeElec(); System.out.println("102的當前電錶數:" + dorm2.elec);//102的當前電錶數:101 System.out.println("101的當前電錶數:" + dorm1.elec);//101的當前電錶數:1 //三、static System.out.println("當前總水閘狀態" + dorm1.waterAll);//false dorm1.waterAll = true; System.out.println("dorm1查看當前總水閘狀態" + dorm1.waterAll);//true System.out.println("dorm2查看當前總水閘狀態" + dorm2.waterAll);//true } } /** 抽取計算機概念的宿舍類 */ class Dorm { //------------共享屬性------------- public static int elecAll;//共享的電錶(總電錶) public static boolean waterAll;//共享的水閘 //------------私有(成員)屬性------------- public String title; public int elec; public boolean water; //------------共享行爲------------- //------------改變水閘狀態--------- public static void changeWaterAll(){ if(waterAll){ waterAll = false; }else{ waterAll = true; } } //------------私有(成員)行爲------------- public void changeElec(){ elec++; } }
二、對象建立的內存說明
對象名打印 ----> 類名@地址值
一、從磁盤讀取class文件,加載進方法區的class文件區
二、將class文件靜態的屬性和行爲加載進靜態區
三、將class文件中私有的行爲加載進方法區
四、在堆中爲對象開闢空間
五、讀取class文件中的成員字段,並初始化
六、在堆中持有方法的引用
七、將這個地址值賦值給對象名
對象使用:
一、打印對象名 ----> 打印的是類名和地址值
二、給對象設置數據或是讀對象的數據
格式:對象名.變量名
三、調用對象的方法:
格式:對象名.方法名(對應的參數);
棧楨 ---- 方法運行時內存
棧 ------ 存儲棧楨
堆 ------ 存儲 new 出來的 ----> 數組 對象
方法區--- class文件區 --------> 存儲class文件
靜態區 -------------> 存儲被static修飾的變量和方法
成員區 -------------> 存儲非static修飾的方法(成員方法)
dorm1.方法名(); --------------> 一、根據dorm1存儲的地址值找到堆
二、堆內有方法名,方法名指向一個地址值
三、根據這個地址,找到方法區中的具體方法實現代碼
四、將方法實現壓入棧
成員方法的實現代碼,爲何不像成員字段同樣存在堆中?
一、成員字段隨對象不一樣而不一樣
二、成員方法都是同樣的實現
三、出於節約資源的考慮,成員方法存儲進成員區
class OOp04 { public static void main(String[] args){ //一、建立對象 Dorm dorm1 = new Dorm(); System.out.println("dorm1 = " + dorm1);//dorm1 = Dorm@139a55 //二、向對象中設置數據 dorm1.elec = 100; dorm1.water = true; //三、獲取對象的數據 System.out.println("dorm1 的電錶數 = " + dorm1.elec);//dorm1 的電錶數 = 100 System.out.println("dorm1 的水閘狀態 = " + dorm1.water);//dorm1 的水閘狀態 = true //四、操做對象的行爲 dorm1.changeWater(); System.out.println("dorm1的水閘改變後的狀態 = " + dorm1.water);//dorm1的水閘改變後的狀態 = false Dorm dorm2 = new Dorm(); dorm2.elec = 1000; System.out.println("dorm2的電錶數 = " + dorm2.elec);//1000 System.out.println("dorm1的電錶數 = " + dorm1.elec);//100 System.out.println("-------------------------------"); Dorm dorm3 = dorm2; dorm3.elec = 0; System.out.println("dorm2 的電錶數 = " + dorm2.elec);// 0 System.out.println("dorm1 的電錶數 = " + dorm1.elec);// 100 System.out.println("dorm3 的電錶數 = " + dorm3.elec);// 0 System.out.println("-------------------------------"); System.out.println(dorm1.elecAll);//0(初始的默認值) System.out.println(dorm1.waterAll);//false(初始的默認值) dorm1.elecAll = 10000; System.out.println("dorm2訪問共享電錶:" + dorm2.elecAll);//10000 System.out.println("dorm1訪問共享電錶:" + dorm1.elecAll);//10000 System.out.println("dorm3訪問共享電錶:" + dorm3.elecAll);//10000 } } /** 從現實的宿舍,抽取計算機概念的類 共享的 私有的 數據: 共享的電錶 本身的電錶 共享的水閘 私有的水閘 行爲: 關閉共享的水閘 本身的水閘 */ class Dorm { //---------- 共享的數據 ---------- public static int elecAll;//共享的電錶 public static boolean waterAll;//共享的水閘 //---------- 私有的數據 ---------- public int elec; public boolean water; //---------- 共享的行爲 ---------- public static void changeWaterAll(){ waterAll = !waterAll; } //---------- 私有的行爲 ---------- public void changeWater(){ System.out.println("水閘狀態改變"); water = !water; } }
三、構造方法基本使用
構造方法的格式:
權限修飾符 類名(能夠有參數){
}
注意:
一、當聲明一個類時,默認會添加一個無參的構造方法
二、構造方法能夠本身寫,會致使默認提供的不可用
一、類加載時,方法不會執行,只有方法被調用時,纔會執行
二、類加載時,要有一個行爲(運算並輸出結果) ----> 可使用靜態代碼塊
構造代碼塊:隨對象的建立而建立 ---- 對象每建立一次調用一次
靜態代碼塊:隨類的加載而加載 ------ 只會加載一次
class OOp05 { public static void main(String[] args){ Dorm dorm = new Dorm();//一個Dorm對象被建立了 Dorm dorm2 = new Dorm();//一個Dorm對象被建立了 } } class Dorm { //構造代碼塊 { System.out.println("構造代碼塊"); } //靜態代碼塊 static { System.out.println("-------------------");//合法 } //System.out.println("-------------------");//非法 public Dorm(){ System.out.println("一個Dorm對象被建立了"); } //---------- 共享的數據 ---------- public static int elecAll;//共享的電錶 public static boolean waterAll;//共享的水閘 //---------- 私有的數據 ---------- public int elec; public boolean water; //---------- 共享的行爲 ---------- public static void changeWaterAll(){ waterAll = !waterAll; } //---------- 私有的行爲 ---------- public void changeWater(){ System.out.println("水閘狀態改變"); water = !water; } }
四、靜態代碼塊與構造代碼塊
class OOp06 { public static void main(String[] args){ Test test = new Test(); } } class Test { //靜態屬性 public static int num; //靜態行爲 static { System.out.println("靜態代碼塊"); } public static void staticMethod(){ System.out.println("static Method"); } //構造方法 ------ 靜態的 public Test(){ System.out.println("構造方法建立對象完成"); } //成員屬性 public int age; //成員行爲 { System.out.println("構造代碼塊"); } public void method(){ System.out.println("method"); } }
五、靜態與成員的使用限制與比較
雖然 對象名.字段名 這種方法合法,但不建議
而是使用 類名.字段名 的方式
行爲是操做屬性的:
方法操做字段
使用限制:
一、靜態方法操做靜態字段 ---->合法
二、靜態方法操做成員字段 ---->非法
三、成員方法操做靜態字段 ---->合法
四、成員方法操做成員字段 ---->合法
成員的能夠操做靜態的和成員的,但靜態的只能操做靜態的
爲何?
靜態的先於成員的加載,成員的依賴於對象,
靜態加載時,對象可能還沒建立,因此靜態的不能操做成員的
A、能夠經過main方法爲程序傳數據
B、格式:java XXX v1 v2 v3
C、v1 v2 v3 按照空格分隔,組織成一個一個字符串數組
class OOp07 { public static void main(String[] args){ /*Dorm d1 = new Dorm(); d1.waterAll = false;不建議這種寫法*/ //Dorm.waterAll = false; Dorm.changeWaterAll();//waterAll = true //Dorm.staticchangeWater(); Dorm d1 = new Dorm(); d1.changeWaterAll2();//waterAll = true } } class Dorm { //public static boolean waterAll = true; //---------- 共享的數據 ---------- public static int elecAll;//共享的電錶 public static boolean waterAll;//共享的水閘 //---------- 私有的數據 ---------- public int elec; public boolean water; //---------- 共享的行爲 ---------- public static void changeWaterAll(){ waterAll = !waterAll; System.out.println("waterAll = " + waterAll); } /*public static void staticchangeWater(){ System.out.println("water = " + water); }*/ //---------- 私有的行爲 ---------- public void changeWater(){ System.out.println("水閘狀態改變"); water = !water; } public void changeWaterAll2(){ System.out.println("waterAll = " + waterAll); } }