一、抽象类
抽象方法:
所谓抽象方法,即只定义该方法,但不实现该方法,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;
}
输出结果: