JAVA筆記【20131208】

一、抽象類

抽象方法:

所謂抽象方法,即只定義該方法,但不實現該方法,Java中使用關鍵字abstract表示該方法是抽象方法。

抽象方法其實就是相當於佔坑的角色,就是先霸佔着這位置,到底怎麼實現這個方法,由以後的子孫類們去考慮。

public abstract String getDesc()
{
//無具體實現
}

包含一個或者多個抽象方法的類也必須被聲明爲抽象的,也即抽象類,同樣使用關鍵字abstract修飾。

抽象類中除了有抽象方法之外,還可以有實例域和具體方法。

注:一個類即使其中沒有抽象方法,也可以聲明爲抽象類。

抽象類不能實例化,也即不能創建該類的實例,但可以聲明一個抽象類的對象變量,該對象變量可以引用該抽象類的非抽象子類。

abstract class Person
{
	public abstract String getDesc()
	{
		//未實現
	}
	//...........
}

class Student extends Person
{
	public String getDesc() //實現了父類的抽象方法
	{
		return name ;
	}
	//............
}

Person tempP = new Person(); //報錯,不能實例化抽象類
Person tempH = new Student(); //正確,聲明Person對象變量tempH,指向Person類的非抽象子類Student

二、訪問控制

1、private ------- 僅對本類可見

2、public  ------- 對所有類可見

3、protected ----- 對本包和所有子類可見

4、默認    ------- 對包可見(默認不推薦)


三、Object:所有類的超類

Java中除了基本類型的值不是對象之外,其餘的都是對象,擴展於Object類。

equals方法:

Object類中equals方法用於檢測一個對象與另外一個對象是否相等,在Object類本身中,equals方法用於判斷兩個對象是否具有相同的引用。如果兩個對象具有相同的引用,則肯定相等。

對於類,經常會遇到比較兩個對象狀態,來判斷是否相等,因此可以重寫equals方法。

Class Employee
{
	public boolean equals(Object objs)       //重寫Object類中equals方法
	{
		if(this == objs)     //首先判斷兩個對象引用是否相同,引用相同,則肯定相同
			return true ;
		if(objs == null)     //其次判斷對象是否爲null,爲null就不相等
			return false;
		if(this.getClass() != objs.getClass())   //判斷兩個對象類型是否一致
			return false;                          //此處不能使用instanceof判斷,因爲instanceof可能是該類的子類的情況下,也可以轉換
		Employee TempE = (Employee) objs ;       //將類型轉換爲Employee
		return name.equals(TempE.name);
	}
	
	public boolean equals(Employee emp)        //這種方法並未重寫Object類中的equals方法,而是定義了一個完全無關的方法。
	{
		return name.equals(emp.name);
	}
}

hashCode方法:

hashCode是由對象導出的一個整型值。hashCode本身是無規律的,兩個不同的對象,一般hashCode值也不同,但兩個相同的對象,其hashCode值必然相同

hashCode方法定義在Object類中,因此每個對象都有一個默認的hashCode值

如果重新定義equals方法就必須重新定義hashCode方法,如果兩個對象equals爲true,則兩個對象的hashCode值也必須相等。

Class Employee
{
	public boolean equals(Object objs)       //重寫Object類中equals方法
	{
		//..............................
	}
	
	public int hashCode()                      //重寫Object類中hashCode方法
	{
		return 100*name.hashCode();
	}
}

toString方法:

Object類中的toString方法用於返回表示對象值的字符串。其默認返回的是對象所屬類名和hashCode

大部分toString方法遵循這樣的格式:類名[域值|域值]

Class Employee
{
	public String toString()
	{
		return getClass().getName()
		  + "[name="+name+"id="+id+"]" ;
	}
}

建議爲自己的類都重寫toString方法。

例:

public class Test22
{
	public static void main(String[] args)
	{
		Employee[] staff = new Employee[3];
		staff[0] = new Employee("zhangs",100);
		staff[1] = new Employee("lisi",200);
		staff[2] = new Employee("lisi",300);
		
		System.out.println(staff[0].toString());
		System.out.println(staff[1].hashCode());
		System.out.println(staff[2].hashCode());
		System.out.println(staff[1].equals(staff[2]));
	}
	
}

class Employee
{
	public Employee(String name,int id)
	{
		this.name = name;
		this.id = id;
		nextId++;
	}

  public boolean equals(Object objs)   //重寫Object類中的equals方法
  {
  	if(this == objs)
  		return true;
  	if(objs == null)
  		return false;
  	if(this.getClass() != objs.getClass())
  		return false;
  	Employee tempE = (Employee) objs;
  	return name.equals(tempE.name); 
  }

	public int hashCode()               //重寫Object類中的hashCode方法
	{
		return 100*name.hashCode();
	}
	
	public String toString()            //重寫Object類中的toString方法
	{
		return getClass().getName()
		  +"[name="+name+" id="+id+" nextId="+nextId+"]";
	}
	
	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public int getId()
	{
		return id;
	}

	public void setId(int id)
	{
		this.id = id;
	}
	
	public static int getNextId()
	{
		return nextId ;
	}
	
	private String name;
	private int id;
	private static int nextId = 0; 
}

輸出結果:







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