1.抽象的类
有些类不应该被初始化
可以通过将类标记成abstract来防止类被new() 出来
abstract public class Canine extends Animal{
public void roam();
}
public class MakeCanine{
public void go(){
Canine c;
c = new Dog(); //可以赋值子类对象给父类的引用即使父类是抽象的
c = new Canine(); //无法通过编译,Canine被标记成abstract无法被new出来
c.roam();
}
}
抽象类除了被继承过之外是没有意义和用途的(除了抽象的class有static的成员之外)
2.抽象的方法
抽象的方法没有实体
public abstract void eat(); //没有方法体,直接以分号结束
如果你声明一个抽象的方法,则必须将该类也标记为抽象的不能在非抽象类中拥有抽象的方法
抽象方法的意义就算无法实现,但还是可以定义一组子型共同的协定(为了标记出多态而存在)
多态的好处就是所有的子型都会有那些抽象的方法
对于抽象的方法位于继承树下第一个具体的子类必须实现该方法,但是还是可以通过抽象机制将实现转给下层实现
(以相同的参数和返回类型来实现抽象的方法)
3.多态的使用
自己创建Dog专用List
public class MyDogList{
private Dog [] dogs = new Dog[5];
private int nextIndex = 0; //初始位置
public void add( Dog d ){
if( nextIndex < dogs.length ){
dogs[nextIndex] = d;
System.out.println( "Dog add at"+ nextIndex+"point" );
nextIndex++;
}
}
}
上面的List有局限性只能存放Dog下面是多态的威力
public class MyAnimalList{
private Animal [] Animals = new Animal[5];
private int nextIndex = 0; //初始位置
public void add( Animal d ){
if( nextIndex < Animals.length ){
Animals[nextIndex] = d;
System.out.println( "Dog add at"+ nextIndex+"point" );
nextIndex++;
}
}
}
终极对象( Object )
1.equals( Object o) //让你比较两个对象是否相等
2.getClass(); //告诉你对象从哪被初始化
cat c = new Cat();
c.getClass(); //输出:Class Cat
3.hashCode() //列出对象的哈希代码可以想象成对象唯一ID
4.toString() //列出类的名称和一串数字
建议用自己写的类覆盖掉Object中的equals 和 toString hashCode方法
多态的引用转换
ArrayList<Object> myDogList = new ArrayList<Object>();
Dog aDog = new Dog();
myDogList.add( aDog );
Dog d = myDogList.get(0); //无法通过编译 调用get方法返回的是Object类型,编译器无法确认它是Dog
编译器是根据引用类型来判断那些method可以调用而不是根据Object确实的类型
转换回原来的类型 可以使用instanceof运算符
if( o instanceof Dog ){
Dog d = (Dog)o;
}