多态中调用子类特有方法2种方式(强转+匿名内部类)

多态中调用子类特有方法的两种方式

在日常撸代码的过程当中,总结了多态中调用子类特有方法的2种方式,现整理如下,如有错误,欢迎批评指正,不多说,先上代码!

public  class  Animal{								//父类
  		public void eat(){
  			System.out.println("eat thing");
  		}
}

class Cat extends Animal{							//子类
	   public void eat(){
	   		System.out.println("eat fish");
		}
		public void catchMouse(){
			System.out.println("catch Mouse");
		}
		public void climbTree(){
			System.out.println(" climbTree");
		}
}

一.父类强转成子类,调用特有方法。

此种方式是我们用得最多的一种,相信大家也非常熟悉

main{
	Animal a = new Cat();  
	//a.catchMouse;        此行会报错,父类不能直接调用子类的特有方法,需向下强转成子类对象
	  Cat  c =(Cat)a;	   //强转成子类对象
	c.catchMouse;          //调用成功  输出“catch Mouse”
}

二.匿名内部类对象定义特有方法,并对其调用

匿名内部类的大坑

创建匿名内部类,其中定义特有方法,并让其指向父类引用,我们会发现,
此父类是不能调用特有方法的。
(匿名内部类其实就是表示继承一个类的子类的匿名对象。其也会受到多态的限制)

main{
	Animal a=new Animal(){
			void catchMouse(){         
			System.out.println(“catchmouse”); 		
			}                                  
	};					   //相当于创建一个子类对象,并让a指向它
	a.catmouse();          //此行会报错      父类a不能直接调用子类的特有方法。
}

等号右边虽然盖着Animal的类名,但实际上系统认为它还是Animal的子类。
所以父类对象a不能直接调用特有方法。

解决方式:匿名内部类,不让他指向父类变量,直接调用方法

main{
	new Animal(){							 
		public void catchMouse(){                   
			System.out.println(“catchmouse”); 		
		}                                  
	}.catchMouse();         //输出“catch Mouse”
}

三. 1、2方法对比

当已经有定义好一个子类时,我们常用强转方法,它有以下优点
1父类强转成子类后,可多次调用子类的特有方法,
2.可灵活调用子类各种特有方法()

...
...
Cat     c=(Cat)a;	   //强转成子类对象
c.catchMouse;          //调用成功  输出“catch Mouse”
c.catchMouse;          //调用成功  输出“catch Mouse”
c.catchMouse;          //调用成功  输出“catch Mouse”
c.climbTree();		   //调用成功  输出“climbTree”
c.climbTree();		   //调用成功  输出“climbTree”

当我们没有定义好一个子类时,且也不想去定义这个子类的时候,只想临时用一下,我们可以采用匿名内部类对象方法,它有以下优劣点
1.省去了定义子类的过程
2.较适合于临时,突发性, 想调用一个特有方法时。
3.它想多次调用一个特有方法时,没有1方法方便

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值