我是靠谱客的博主 雪白玫瑰,最近开发中收集的这篇文章主要介绍多态中调用子类特有方法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方法方便

最后

以上就是雪白玫瑰为你收集整理的多态中调用子类特有方法2种方式(强转+匿名内部类)的全部内容,希望文章能够帮你解决多态中调用子类特有方法2种方式(强转+匿名内部类)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(83)

评论列表共有 0 条评论

立即
投稿
返回
顶部