面向對象開發設計

一、建立並使用對象的格式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);
	}
}
相關文章
相關標籤/搜索