JAVA(雜記四) -- 類與對象

東西太多,先寫在代碼裏了,以後有時間整理

public class Main   
{  
    public static void main(String[] args)  
    {  
        Employee e1 = new Employee("lyy", 3800.0);
    	//	此處的e1等同於C++指針,new出來的對象返回的是一個引用 
        
        Employee e2 = e1;
        //	JAVA沒有默認的複製構造函數
        //	因此上一行的作用是e1和e2指向同一對象
        
        e1 = null;	
        //	可將對象變量設置爲null,此時若調用方法將會出錯
        
        e1 = new Employee("qwe", 2400.0);
        //	不能使用 e1.Employee("asf", 10000.0); 來構造新對象
        //	構造器只能在初始化時使用,不能作爲方法調用
        
        System.out.println(e1.getId());	// 1002
        System.out.println(e2.getId());	// 1002
        System.out.println(Employee.getNum());	// 2
    }  
} 

//	JAVA中方法、實例域的聲明和定義均在類中完成
//	JAVA不能爲類重載運算符
class Employee
{
	//	靜態域
	//	只在該類第一次加載時初始化
	private static int nextId = 0;
	
	//	實例域
	//	可以在實例域聲明時初始化,也可由構造器初始化,也可由初始化塊進行初始化
	//	若都不進行初始化,則實例域自動初始化爲0、null或false
	private String name = "";
	private double salary = 0;
	private final int id;
	
	//	初始化塊,首先運行,之後纔會執行構造器
	//	不是必須的
	{
		nextId++;
		id = 1000+nextId;	
	}
	
	//	構造器
	//	JAVA沒有列表初始化
	public Employee(String aname, double asalary)
	{
		name = aname;
		salary = asalary;
	}
	//	構造器和方法均可以重載,要求名字相同,參數列表不同,而與返回類型無關
	//	JAVA可以在構造器中調用另一個構造器(c++不行)
	public Employee()
	{
		this("nameless", 3500.0);
	}
	
	//	域訪問器
	//	JAVA不提供const或者final後綴保證實例域不被更改
	//	注意,不要直接返回實例域中可變對象(如類的實例)的引用
	//	若該引用又使用域更改器( Setxx() ),則破壞了其封裝性
	//	應使用clone方法
	public String getName() { return name; }
	public double getSalary() { return salary; }
	public int getId() { return id; }	
	
	//這類靜態方法可以直接使用類名訪問,即Employee.getNum()
	public static int getNum() { return nextId; }
	public static void swap(Employee e1, Employee e2)
	{
		/**
		 * 該方法試圖交換2個引用,但是不會生效
		 * 因爲傳入的參數相當於是C++的指針的拷貝
		 * 對指針指向的區域修改是有效的
		 * 但是對拷貝的指針做修改並不會影響到實參
		 */
		Employee tmp = e1;
		e1 = e2;
		e2 = tmp;
		//	由此可見,JAVA對對象採用的是“按值傳遞”
		//	即方法無法更改基本數據類型
		//	但方法可以改變對象參數的狀態,而無法使對象引用一個新對象
	}
	
	//	域更改器
	//	這裏的aname和asalary稱爲顯式參數
	//	而這裏的name和salary稱爲隱式參數,相等於this.name和this.salary
	public void setName(String aname) { name = aname; }
	public void setSalary(double asalary){ salary = asalary; }
	
	
	//	自定義類中也可有一個靜態main方法,一般用於單元測試
	//	Eclipse測試方法,右鍵類名,運行方式-JAVA應用程序,找到該類
	public static void main(String[] args)
	{
		Employee e1 = new Employee("skw", 4300.0);
        System.out.println(e1.getId());
        System.out.println(Employee.getNum());
	}
}

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