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));
}
}