八,深入多态

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;
	}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值