详解java封装继承多态
作者:海绵爱上星 发布时间:2023-11-24 08:29:37
面向对象编程(Object Oriented Programming)有三大特性:封装、继承、多态。在这里,和大家一起加深对三者的理解。
封装
封装可以拆开理解,装,是把数据和方法放进了类里;封,把装进去的数据和成员方法加上访问权限。对于外界,内部细节是透明的,暴露给外面的是它的访问方法。
继承
继承,是为了重用父类代码。两个类若具有is a的关系就可以用extends。另外,继承也为实现多态做了铺垫。
多态
程序中定义的引用变量(java有两大数据类型,内部数据类型和引用数据类型)所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量到低指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。
在理解多态时,总是逃不掉“向上转型”。
问题的核心在于,一般情况下,在子类继承父类后,子类具有父类的所有成员和方法。但是在向上转型之后,子类中一些独有的成员和方法对于该父类类型的引用变量则“不可见”。
实例
package binaryheap.test;
import java.awt.image.SinglePixelPackedSampleModel;
//创建一个Animal类
class Animal {
public void run() {
System.out.println("Animal在奔跑!!!");
sing();
}
public void sing() {
System.out.println("Animal在唱歌~~~");
}
}
//创建一个子类继承父类
class Lion extends Animal {
// 重载run()方法,和父类中的run()方法不是一个
// 向上转型时会丢失该方法
public void run(String anotherAnimal) {
System.out.println(("Lion在追一只" + anotherAnimal));;
sing();
}
// 重写
public void sing() {
System.out.println("Lion在唱歌~~~");
}
}
public class BH {
public static void main(String[] args) {
// 创建一个父类引用,但是指向Lion对象
Animal animal = new Lion();
animal.run();
}
}
结果:
Animal在奔跑!!!
Lion在唱歌~~~
Animal animal = new Lion(); 向上转型后的Animal类型的引用,丢失了重载的方法run(),即子类中的run(),指向的是父类的run(),因此输出“Animal在奔跑”,而不是“Lion在奔跑”。run()方法中调用了sing()方法,因为sing()方法被重写,引用能够找到sing()方法,因此引用调用此sing()方法(动然调用),输出“Lion在唱歌”。
实现多态的必要条件为:继承、重写、向上转型(或者说父类引用指向子类对象)。其实现机制为:调用那个方法是由被引用对象的类型决定,而不是引用变量的类型决定的,并且这个被调用的方法必须是被子类重写过的。
总结:
使用父类的引用指向子类对象
该引用只能调用父类中定义的方法和变量
若子类重写了父类的一个方法(只能重写方法,不能重写变量,否则编译时期会报错),那么调用的时候会调用子类的这个方法。
此外,在多态引用时,可能会涉及到超类的构造方法。调用超类的构造方法的顺序是先调用最远的超类的构造方法。
以上所述是小编给大家介绍的java封装继承多态详解整合网站的支持!
来源:https://blog.csdn.net/zzyssg/article/details/88605988


猜你喜欢
- Zuul作为网关服务,是其他各服务对外中转站,通过Zuul进行请求转发。这就涉及到部分数据是不能原封返回的,比如服务之间通信的凭证,用户的加
- 本文帮助大家掌握Java多线程基础知识来对应日后碰到的问题,具体内容如下一、Java多线程面试问题1. 进程和线程之间有什么不同?一个进程是
- /// <summary> /// 导出Ex
- 1、什么是 IOC?IOC-Inversion of Control,即控制反转。它不是什么技术,而是一种设计思想。传统的创建对象的方法是直
- JDK、JRE、JVMJDK包含JRE,而JRE包含JVMJDK(Java Development Kit)是针对Java开发员的产品,是整
- 1、本篇内容本文让大家掌握 springmvc 中异步处理请求,特别牛逼的一个功能,大家一定要掌握。2、看段代码,分析问题@Response
- js和python是两种语言,js处理网页数据,python可作为服务端开发,两者通过websocket进行通信。websocket是soc
- java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装。当对文件或其他目标频繁读写或操作效率低,效能差。这
- 一、CAS(Compare And Set)Compare And Set(或Compare And Swap),CAS是解决多线程并行情况
- 前言今天有一个需求,把之前的判断逻辑进行修改,之前我是用大于(>)小于(<)进行对比的,但是今天让改成大于等于(>=)和小
- 利用AsyncQueryHandler能异步任务获取手机联系人,增加用户体验,使用起来也很方便。不多说,上干货。布局文件main.xml&l
- @PathVariable和@RequestParam传参为空@RestControllerpublic class UserControl
- 本文实例为大家分享了java实现图片分割指定大小的具体代码,供大家参考,具体内容如下1.使用工具:ThumbnailsThumbnails
- 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便
- 废话不多说了,直接给大家贴java代码了。具体代码如下所示:/*支付流程*//****Controller.java 代码如下:*/@Req
- 首先我们都知道java中的比较都是同一类对象与对象之间的比较,就好像现实生活中比较人和人的年龄一样,你不会去把人的年龄和人的身高来比较,这显
- 引言前文中了解到AQS借助LockSupport.park和LockSupport.unpark完成线程的阻塞和唤醒,那么LockSuppo
- Java 7的这个新特性改变了警告的对象。构建这些类型毕竟有破坏类型安全的风险,这总得有人知道。但 API 的用户对此是无能为力的,不管do
- 要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscor
- 话不多说,先上图 &n