Java類、方法、對象的應用以及GC

package Practice;

class Cylinder {
/**
 * 	被static修飾的成員稱爲類成員,未被static修飾的稱爲實例成員
 *  被static修飾的變量稱爲“靜態變量”(類成員),被static修飾的方法稱爲“靜態方法”(類方法)
 *  使用格式:
 *  	類名.靜態變量名;(建議使用)
 *  	對象名.靜態變量名;
 */
	private static int num = 0;
	private static double pi = 3.14;
	private double radius;
	private int height;
	
//	無參構造方法
	public Cylinder() {}
//	帶參數的構造方法
	public Cylinder(double radius, int height) {
		this.radius = radius;
		this.height = height;
		num++;
	}
	
//	一個構造方法調用另外一個構造方法時,必須使用this關鍵字,必須放在第一行
	public Cylinder(double radius, int height, double PI) {
		this(radius, height);
		this.pi = PI;
	}
	
	/**
	 * 靜態初始化器:將屬性或方法變成全局,不用實例化,可直接調用。
	 * 		static{}:先構造方法被調用。
	 * 		它的作用和構造方法有些類似,都是用來初始化工作的。
	 * 靜態初始化器與構造方法的區別:
	 *		1.構造方法是對每個新創建的對象初始化,而靜態初始化器
	 *		是對整個類自身進行初始化,包括static成員變量賦初值。
	 *		2.構造方法是在用new創建新的對象時由系統自動執行,
	 *		而靜態初始化器一般不能由程序來調用,他是在所屬的類
	 *		被加載入內存時由系統調用執行。
	 *		3.用new創建了多少個對象,構造方法就被調用多少次,
	 *		但靜態初始化器則在類被加載入內存時只執行一次。
	 *		4.靜態初始化器不是方法,它沒有方法名、返回值和參數。
	 *		5.如果有多個靜態初始化器,則它們在類的初始化時會依次執行。
	 */
	static {
		num++;
	}
	
//	靜態方法測試
	public void count() {
		System.out.println(num);
	}
	public static void count1() {
		System.out.println(num);
	}
	
	public double setCylider(double radius, int height) {
		this.radius = radius;
		this.height = height;
		
		return radius+height;
	}
//	重載: 方法名相同,參數列表不同(個數,類型,順序),返回值和訪問控制符可以相同,也可以不同
	public double setCylider(int height, double radius) {
		this.radius = radius;
		this.height = height;
		
		return radius+height;
	}
	double area() {
		
		return pi* radius* radius;
	} 
	
	double volume() {
		
		return area()* height;
	}
}

class Person{
	
	private String name;
	private int age;
	
	public Person() {}
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public Person compare(Person person) {
		
		if(this.age > person.age)
			return this;
		else
			return person;
	}
	
	public void show() {
		System.out.println("name:" + name +"\n"+"age:" + age);
	}
	
	public static int minAge(Person [] p) {
		
		int min = Integer.MAX_VALUE;
		
		for(int i = 0; i < p.length; i++) 
			if(p[i].age < min)
				min = p[i].age;
		return min;
	}
}

/**
 * @author Administrator
 *	垃圾回收(Garbage-collection)是Java提供的一種自動內存回收功能,
 *	可以讓程序員減輕許多內存管理的負擔,也減少程序員犯錯的機會。
 *	當一個對象被創建時,JVM爲該對象分配一定的內存、調用該對象的構造方法,並開始跟蹤對象。
 *	當對象停止使用時,JVM將通過垃圾回收器回收該對象所佔用的內存。
 *垃圾回收的好處:
 *	它把程序員從複雜的內存追蹤、檢測和釋放等工作解放出來;
 *	它防止了系統內存被非法釋放,從而使系統更穩定。
 *垃圾回收的特點:
 *	只有當一個對象不被任何引用類型的變量使用時,它的內存纔可能被垃圾回收器所回收。
 *	不能通過程序強迫回收器立即執行。
 *	當垃圾回收器將要釋放無用對象的內存時,先調用對象的finalze()方法。
 */
	class LocalVarGC {

/**
* 在申請空間後,立即進行垃圾回收,很明顯,由於byte數組被變量a引用,因此無法回收這塊空間
*/
		public void localvarGc1() {
		byte[] a = new byte[6 * 1024 * 1024];
		System.gc();
		}

/**
* 垃圾回收前,先將a變量置爲null,使byte數組失去強引用,故垃圾回收可以順利回收byte數組
*/
		public void localvarGc2() {
		byte[] a = new byte[6 * 1024 * 1024];
		a = null;
		System.gc();
		}

/**
* 進行垃圾回收前,先使局部變量a失效,雖然變量a已經離開了作用域,但是變量a依然存在於局部變量中,並且也指向這塊byte數組,故byte數組依然無法被回收
*/
		public void localvarGc3() {
		{
		byte[] a = new byte[6 * 1024 * 1024];
		}
		System.gc();
		}

/**
* 垃圾回收之前,不僅使變量a失效,更是申明瞭變量c,使變量c複用了變量a的字,由於變量a此時被撤銷,故垃圾回收器可以順利回收byte數組
*/
		public void localvarGc4() {
		{
		byte[] a = new byte[6 * 1024 * 1024];
		}
		int c = 10;
		System.gc();
		}

/**
* 首先調用了localvarGc1(),很明顯,在localvarGc1()中並沒有釋放byte數組,
* 但是localvarGc1()返回後,它的棧幀被銷燬,自然也包括了棧幀中的所有局部變量
* 故byte數組失去引用,在localvarGc5()的垃圾回收中被回收
*/
		public void localvarGc5() {
		localvarGc1();
		System.gc();
		}

	public static void main(String[] args) {
// 初始化LocalVarGC類,併爲每一個localvarGcN()函數分配一個6MB的堆空間,並使用局部變量引用這塊空間
		LocalVarGC ins = new LocalVarGC();
		ins.localvarGc1();
	}
}

public class ChapterSeven {
	public static void main(String[] args) {
//		使用類名調用
		Cylinder.count1();
		
		Cylinder cylinder1 = new Cylinder();
//		使用對象名調用
		cylinder1.count();
		cylinder1.setCylider(3.2, 5);
		
		System.out.println(cylinder1.area());
		System.out.println(cylinder1.volume());
		
		Cylinder cylinder2 = new Cylinder(2.5,3);
		cylinder2.count();
		System.out.println(cylinder2.area());
		System.out.println(cylinder2.volume());
		
		Cylinder cylinder3 = new Cylinder(2.5,3);
		cylinder3.count();
		
//		對象的應用
		Person person1 = new Person("張三", 20);
		Person person2 = new Person("里斯", 30);
//		將person3的地址指向person1和person2中比較大的一個
		Person person3 = person1.compare(person2);
		
		if(person3 == person1)
			System.out.println("張三的年齡大.");
		else
			System.out.println("里斯的年齡大.");
		
/**
 * 類類型的數組:
 * 		用數組來存放對象一般需經歷兩個步驟:
 * 			1.聲明類類型的數組變量,並用new運算符分配內存空間給數組。
 * 			2.用new創建新的對象,分配內存空間給它,並讓數組元素指向它。
 */
		Person [] per1 = new Person[3];
		per1[0] = new Person("white", 10);
		per1[1] = new Person("blue", 11);
		per1[2] = new Person("yellow", 12);
		
		per1[0].show();
		per1[1].show();

/**
 * 以對象數組爲參數進行方法調用
 * 		傳遞數組時實參只需給出其數組名即可。
 */
		Person [] per2 = new Person[3];
		per2[0] = new Person("white", 10);
		per2[1] = new Person("blue", 11);
		per2[2] = new Person("yellow", 12);	
		System.out.println("最小的年齡爲:" + Person.minAge(per2));
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章