详解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在唱歌”。

实现多态的必要条件为:继承、重写、向上转型(或者说父类引用指向子类对象)。其实现机制为:调用那个方法是由被引用对象的类型决定,而不是引用变量的类型决定的,并且这个被调用的方法必须是被子类重写过的。

总结:

  1. 使用父类的引用指向子类对象

  2. 该引用只能调用父类中定义的方法和变量

  3. 若子类重写了父类的一个方法(只能重写方法,不能重写变量,否则编译时期会报错),那么调用的时候会调用子类的这个方法。

此外,在多态引用时,可能会涉及到超类的构造方法。调用超类的构造方法的顺序是先调用最远的超类的构造方法。

以上所述是小编给大家介绍的java封装继承多态详解整合网站的支持!

来源:https://blog.csdn.net/zzyssg/article/details/88605988

标签:java,封装,继承,多态
0
投稿

猜你喜欢

  • 解析spring cloud ouath2中的Eureka

    2023-10-12 04:07:54
  • C++结合QT实现带有优先级的计算器功能

    2022-07-05 08:12:49
  • Spring中RedisTemplate的基本使用浅析

    2023-03-08 05:46:50
  • JavaWeb搭建网上图书商城毕业设计

    2023-08-29 00:08:32
  • android.enableD8.desugaring = false引发问题解决

    2023-11-03 16:06:15
  • Spring深入刨析声明式事务

    2022-07-04 03:57:15
  • C#中foreach语句深入研究

    2022-11-15 00:30:17
  • Flutter利用Hero组件实现自定义路径效果的动画

    2023-06-25 13:46:29
  • WinForm开发中屏蔽WebBrowser脚本错误提示的方法

    2021-06-23 08:49:40
  • Java数据机构中关于并查集的详解

    2022-09-05 13:23:53
  • Java聊天室之解决连接超时问题

    2021-06-07 16:30:54
  • 详解Spring框架入门

    2023-08-14 12:56:14
  • 出现SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.的解决方法

    2021-09-01 12:02:09
  • 解决Android手机屏幕横竖屏切换

    2022-10-21 18:55:33
  • 关注Ionic底部导航按钮tabs在android情况下浮在上面的处理

    2023-10-01 05:38:17
  • Mybatis-Plus之ID自动增长的设置实现

    2022-10-27 00:09:47
  • Java BeanPostProcessor与BeanFactoryPostProcessor基础使用讲解

    2022-10-25 21:52:35
  • java解析XML详解

    2023-02-26 09:19:51
  • AQS(AbstractQueuedSynchronizer)抽象队列同步器及工作原理解析

    2023-02-24 22:20:09
  • hadoop上传文件功能实例代码

    2021-11-01 00:57:59
  • asp之家 软件编程 m.aspxhome.com