多态的基本知识<多态的前提是继承哟!!!!>

多态的基本知识<多态的前提是继承哟!!!!>

多态:


1.何为多态


2.多态的前提条件;


3.多态访问成员的特点


4.多态的优点


5多态的缺点


6如何解决多态的缺点了?

一、多态


某个事物,在不同的时刻表现出来的不同状态

比如:
猫是动物


Animer c = new Cat();


猫是猫


Cat c1 = new Cat();<记得从右边往左边开始年>

二、前提条件


A:有继承的关系


B:子类重写父类的方法


C:父类的引用(比如说上面的c )指向子类的对象

举个例子来说明一下:

/*

动物、狗的例子:

*/

class Animer{


public void show(){


System.out.println(“父类的方法”);


}

}

class Dog extends{//狗狗继承动物


public void show(){


System.out.println(“子类重写了父类的方法”);


}

}

class Test{


public static void main(String [] agrs){


//父类的引用指向子类的对象


Animer d = new Dog();


d.show();


}

}

三、多态访问成员的特点:

在上面的例子中如果子类有特有的方法,在编译的时候是否会报错了?

class Animer{


public void show(){


System.out.println(“父类的方法”);


}

}

class Dog extends{//狗狗继承动物


public void show(){


System.out.println(“子类重写了父类的方法”);


}





public void methed(){


System.out.println(“子类特有的功能”);


}

}

class Test{


public static void main(String [] agrs){


//父类的引用指向子类的对象


Animer d = new Dog();


d.show();





d.methed();//这里会提示报错有!!!!


}

}

这个和多态访问成员的特点有关,

那么

多态有哪些特点了?

1.访问成员变量的时候:


编译看左边,执行看左边

2.构造方法


在继承关系中,在调用子类的构造方法时候,系统都回去默认的访问父类的无参构造方法


对父类的数据进行初始化

3.成员方法


编译看左边,执行看右边




所闻的左边就是父类,右边就是子类

比如说访问成员方法:

编译看左边就是说编译的时候看这个方法在父类中是否存在,

执行看右边是说调用的时候要看子类中的这个方法

四、.优点:可维护、可扩展型

可扩展型举例说明:

class Animer{


public void eat(){


System.out.println(“Animer eat”);


}





public void sleep(){


System.out.println(“Animer sleep”);


}

}

class Cat extends Animer{


public void eat(){


System.out.println(“Cat eat”);


}





public void sleep(){


System.out.println(“Cat sleep”);


}

}

class Dog extends Animer{


public void eat(){


System.out.println(“Dog eat”);


}





public void sleep(){


System.out.println(“Dog sleep”);


}

}

//动物的工具类

class UserTool{


private UserTool(){}//这样设计是为了防止new 对象





public static void useTool(Animer a){


a.eat();


a.sleep();


}

}

class Test3{


public static void main(String[] args){


Animer c = new Cat();//多态这样来解释:cat 是 animeir   从右边往左边看


Animer c2 = new Cat();


Animer c3 = new Cat();





//工具类中的方法是静态方法,调用可以通过类名调用


//为了防止对工具类进行创建对象


//所以构造方法的修饰符该为private,这样都不能创建对象了


//不信你可以试一下看报错不?


/*


错误: UserTool()可以在UserTool中访问private


UserTool ut = new UserTool();


*/


//UserTool ut = new UserTool();


UserTool.useTool(c);//传递的参数是引用类型,那么要传入一个对象


UserTool.useTool(c2);


UserTool.useTool(c3);


System.out.println(“————————-“);


//
cat创建完了。这个时候如果要加入dog了


//这个时候只要创建dog类,然后继承animer,在重写父类的方法都可以了


//从而体现了多态的扩展型



Animer d = new Dog();


UserTool.useTool(d);





//后面如果还要添加,比如说Pig  ,只需要创建Pig类,然后在继承Animer


//在main方法中在创建Pig对象,在调用工具类中的方法即可




五、缺点是:不能访问子类特有的功能

六、怎么办了?

能否把父类的引用赋给子类的引用了?

可以

这个叫做向下转型,注意的是需要强制转换了

比如说:

Animer d = new Dog();//向上转型

d.show();

Dog d2 = (Dog)d;//向下转型

d2.methed();














版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100816.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库设计实战(一):数据库设计规范「建议收藏」

    数据库设计实战(一):数据库设计规范「建议收藏」一、数据库设计流程1、需求分析确定用户对数据库系统的使用要求和各种约束条件,形成用户需求规约2、概念设计对用户要求描述的现实世界,通过对其分类、聚集和概括,建立抽象的概念数据模型3、逻辑设计将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式4、物理设计对具体的应用任务选定最合适的物理存储结构、存取方法和存取路径等5、验证设计在其他设计基础上,收集数据并具体建立一个数据库,运行一些典型的应用任务来验证数据库设计的正确性

    2022年7月12日
    13
  • 3、缺省路由实验配置步骤

    3、缺省路由实验配置步骤缺省路由属于特殊的静态路由 PC 的网关其实就是一种缺省路由缺省路由属于 替补路由 只有当其他的路由不可达时才会使用缺省路由缺省路由适用于边缘节点 以及企业出口 PC1 配置 IP 地址 IP 地址 10 1 1 2 子网掩码 255 255 255 0 网关 10 1 1 1PC2 配置 IP 地址 IP 地址 10 1 1 3 子网掩码 255 255 255 0 网关 10 1 1 1

    2025年6月8日
    0
  • BN层代码实现_无代码

    BN层代码实现_无代码BatchNormalization开发环境项目代码结构生成虚拟数据程序神经网络构建带初始化模型的神经网络构建带BN的FC网络和不带BN的FC网络对比不同初始化方式带BN的网络模型对比开发环境python–3.7torch–1.8+cu101torchsummarytorchvision–0.6.1+cu101PILnumpyopencv-pythonpillow项目代码结构src文件夹存储了带有BN的FC训练文件、基于初始化的带BN的FC训练文件以及BN在训练阶段的操作。t

    2022年10月14日
    0
  • pycharm2021.11.3激活教程【中文破解版】「建议收藏」

    (pycharm2021.11.3激活教程)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html6EK6WKOHUX-eyJsaWNlbnNlSWQi…

    2022年3月28日
    42
  • ubuntu20.04安装opencv_opencv安装教程vs2019

    ubuntu20.04安装opencv_opencv安装教程vs2019更新源 sudo apt update 安装相关包 sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libjasper 报错:无法定位到 libj…

    2022年8月18日
    3
  • Vue生成二维码_vue视频软件怎么生成二维码

    Vue生成二维码_vue视频软件怎么生成二维码1.在vue中安装qrcodejs2npminstall–saveqrcodejs22.在项目中引用qrcodejs2importQRcodefrom’qrcodejs2’3.使用到项目中<viewid=”qrCode”res=”qrCodeDiv”></view>methods:{bindQRcode(){ newQRcode(this.$refs.qrCodeDiv,{ text:”https://www..

    2022年10月3日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号