zoukankan      html  css  js  c++  java
  • java面向对象三大特性:封装、继承、多态

    一、封装

    封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系。也就是说用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作就行。

    封装的好处:

    1) 实现了专业的分工

    2) 良好的封装能够减少耦合

    3) 类内部的结构能够自由修改

    4) 可以对成员进行更精确的控制

    5) 隐藏信息,实现细节

    二、继承

    Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,父类是子类的一般化,子类是父类的特殊化(具体化)

    继承的声明方式:

    1)、使用extends 关键字声明,

    2)、子类 extends 父类{}

    继承的特征:

    1)、传递性

    若类C继承类B,类B继承类A(多继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法

    2)、单根性

    若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。

    3)、子类调用父类成员

    使用super关键字调用父类成员

    子类默认会先调用父类的无参构造方法,如果父没有则报错,可以手动指定,但必须在第一行

    设计继承关系的验证方法:

    如果想要知道某物是否应该要继承另一物是,则可以使用IS-A测试来检验。例如:狗是动物,三角形是一个多边形等。

    注意:

    1)、继承下来的方法可以被覆盖掉,但是实例变量不能被覆盖掉。

    2)、当某个方法在子类中被覆盖过,调用这个方法时会调用到覆盖过的版本。

    三、多态

    在了解多态之前,首先需要知道方法的唯一性标识即什么是相同/不同的方法:

    • 一个方法可以由:修饰符如public、static+返回值+方法名+参数+throw的异常 5部分构成
    • 其中只有方法名和参数是唯一性标识,意即只要方法名和参数相同那他们就是相同的方法
    • 所谓参数相同,是指参数的个数,类型,顺序一致,其中任何一项不同都是不同的方法

    何谓重载:

    • 重载是指一个类里面(包括父类的方法)存在方法名相同,但是参数不一样的方法,参数不一样可以是不同的参数个数、类型或顺序
    • 如果仅仅是修饰符、返回值、throw的异常 不同,那这是2个相同的方法,编译都通不过,更不要说重载了

    何谓覆盖/重写:

    • 覆盖描述存在继承关系时子类的一种行为
    • 子类中存在和父类相同的方法即为覆盖,何谓相同方法请牢记前面的描述,方法名和参数相同,包括参数个数、类型、顺序

    覆盖/重写的规则:

    • 子类不能覆盖父类private的方法,private对子类不可见,如果子类定义了一个和父类private方法相同的方法,实为新增方法
    • 重写方法的修饰符一定要大于被重写方法的修饰符(public > protected > default > private)
    • 重写抛出的异常需与父类相同或是父类异常的子类,或者重写方法干脆不写throws
    • 重写方法的返回值必须与被重写方法一致,否则编译报错
    • 静态方法不能被重写为非静态方法,否则编译出错

    理解了上述知识点,是时候定义多态了:

    • 多态可以说是“一个接口,多种实现”或者说是父类的引用变量可以指向子类的实例,被引用对象的类型决定调用谁的方法,但这个方法必须在父类中定义
    • 多态可以分为两种类型:编译时多态(方法的重载)和运行时多态(继承时方法的重写),编译时多态很好理解,后述内容针对运行时多态
    • 运行时多态依赖于继承、重写和向上转型

    向上转型的缺憾:

    • 只能调用父类中定义的属性和方法,对于子类中的方法和属性它就望尘莫及了,必须强转成子类类型

    总结概括:

    • 当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)
    关注二营长的微信公众号| 二营长的笔记,回复“二营长”,领取营长秘制Java技术资料。
  • 相关阅读:
    3728 联合权值[NOIP 2014 Day1 T2]
    关于深度优先遍历图的非递归算法的一个讨论
    图的遍历递归和非递归实现【整理自网络】
    CSS 居中布局
    css怎样让背景充满整个屏幕
    关于html,body{height:100%}的解释
    4103:踩方格
    2287 火车站
    平面分割问题
    蜜蜂路线
  • 原文地址:https://www.cnblogs.com/happyone/p/10505156.html
Copyright © 2011-2022 走看看