一、抽象類
抽象方法:
所謂抽象方法,即只定義該方法,但不實現該方法,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;
}
輸出結果: