【JavaEE重点知识归纳】第8节:面向对象程序三大特性:封装、继承、多态

news2024/11/19 19:46:21

目录

一:封装

1.封装的概念

2.访问限定符

3.封装扩展包

二:继承

1.概念

2.语法

3.父类成员的访问

4.super关键字

5.子类构造方法

6.super和this

7.继承方式

8.final关键字

9.继承和组合

三:多态

1.概念

2.实现条件

3.重写

4.向上转型和向下转型

5.避免在构造方法中调用重写的方法


一:封装

1.封装的概念

(1)定义:用关键字private对类的成员进行修饰,不透露细节,只是对外提供接口

(2)意义:可以隐藏细节,保证安全性

2.访问限定符

(1)Java中主要通过类和访问修饰限定符来实现封装:类可以将数据以及封装的方法结合在一起,而访问修饰限定符用来控制方法或者字段能否直接在类外使用。Java提供了4中访问限定符。

(2)

public:权限最大

        范围privatedefaultprotectedpublic
同一个包中的同一类
同一个包中的不同类
不同包中的子类
不同包中的非子类

 

3.封装扩展包

(1)为了更好的管理类,把多个类放在一起称为一组,称为软件包(有点类似于目录)

(2)包是对类,接口等的封装机制的体现,是一种对类或接口等很好的组织方式;在同一工程中允许存在相同名称的类,只要处在不同的包中即可

(3)Java中提供了很多现成的类供我们使用,例如Date类:可以使用java.util.Date导入java.util这个包中的Date类

(4)常见的包

        1)java.lang:系统常用的基础类(String、object),从JDK1.1后自动导入

        2)java.lang.reflect:java反射编程包

        3)java.net:进行网络编程开发包

        4)java.sql:进行数据库开发的支持包

        5)java.util:是java提供的工具程序包。(集合类)

        6)java.io:I/O编程开发包

二:继承

1.概念

(1)继承机制:是面向对象程序设计的可以使代码复用的最重要的手段,他允许在保持原有特性的基础上进行扩展,增加新功能,产生新的类,称为子类或者派生类

(2)继承呈现了面向对象程序设计的层次结构,体现了从简单到复杂的认知过程。

(3)继承主要解决的问题:共性的抽取,实现代码的复用

(4)父类:一定是子类的共性

2.语法

Java中表示类之间继承关系,用关键字extends:

修饰符  class  子类   extends   父类{

}

Animal.java 

 

Dog.java 

TestA.java//测试类 

注意:

        1)子类会将父类中的成员变量或者成员方法继承到子类中

        2)子类继承父类之后,必须要添加自己子类自己特有的成员,体现出和基类(父类、超类)的不同,否则就没必要继承了 

3.父类成员的访问

(1)子类中访问父类的成员变量

        1)子类和父类不存在同名的成员变量

        2)子类和父类成员变量同名

        3)总结:

在子类方法中或者通过子类对象访问成员时:

        //如果访问的成员变量子类自己有,优先访问自己的成员变量

        //如果访问的成员变量子类自己无,则访问父类继承下来的,如果父类也没有定义,则编译报错

        //如果访问的成员变量与父类中的成员变量同名的时候,则优先访问自己的

        //成员变量访问遵循就近原则,自己有优先自己的,没有再在父类中找

(2)子类中访问父类的成员方法

        1)成员方法名字不同

总结: 成员方法没有同名时,在子类方法中或者通过子类访问方法时,则优先访问自己的,自己没有是再在父类找,如果父类没有则报错

        2)成员方法名字相同

public class Base {
    public void methodA() {
        System.out.println("Base中的methodA()");
    }

    public void methodB() {
        System.out.println("Base中的methodB()");
    }
}
class Derived extends Base{
    public void methodA(int a){
        System.out.println("Derived中的methodA()");
    }
    public void methodB(){
        System.out.println("Derived中的methodB()");
    }
    public void methodC(){
        methodA();//没有传参,访问父类中的methodA()
        methodA(1);//传递int参数,访问子类的methodA()
        methodB();//直接访问子类的
    }
}

总结:通过子类对象访问父类和子类中不同方法时,优先在子类中找,找到则访问,否则在服了中找,找到则访问,否则编译报错

通过子类对象访问父类对象与子类同名的方法时,如果方法重载了,根据调用方法传递的参数确定合适的方法访问,如果没有则报错

4.super关键字

(1)问题:如果存在同名情况时,偏要访问父类的成员呢?这时就使用super关键字

(2)super作用:在子类方法中访问父类的成员

(3)super在当前类使用,则当前类一定是子类;只能在非静态方法中使用

eg:Student(String id, String name, String birth,String department) 是Undergraduate的父类

5.子类构造方法

(1)子类对象构造时,需要调用父类的构造方法,然后再执行子类的构造方法

(2)子类对象中成员是有两部分组成的,父类继承下来的以及子类自己新增的成员。先调用父类的构造方法,将从父类继承下俩的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增的成员初始化完成

 

6.super和this

(1)相同点:

        1)都是关键字

        2)只能在类的非静态方法中使用,用来访问非静态的成员变量和成员方法

        3)在构造方法调用时,只能是构造方法的第一行,且不能同时存在

(2)不同点:

        1)this代表是当前对象的引用,,super相当于是从子类对象中从父类继承下来的部分成员的引用

        2)this用来访问本类的方法和属性,super用来访问父类的方法和属性

        3)在构造方法中,this(...)用于调用本类的构造方法,super(...)用来调用父类的构造方法,两种不同的调用不能同时存在于构造方法中

        4)构造方法中一定会存在super(...)的调用,用户没写编译器自动添加,而this(...)用户不写则没有

7.继承方式

(1)Java只支持单继承,支持多层继承,支持不同类继承同一个类,但是不支持多继承,

(2)

8.final关键字

(1)final可以用来修饰变量,表示变量不可以修改

(2)final可以修饰类,表示该类不能被继承

(3)final可以修饰方法,表示该方法不能被重写

9.继承和组合

(1)和继承类似,组合也是一种表达类之间关系的方式,也能达到代码复用的效果

(2)继承是is-a 的关系,而组合是 has-a的关系

三:多态

1.概念

        简单来说就是多种形态;复杂点来说就是为了完成某个任务,当不同的对象去完成会产生不同的状态

2.实现条件

(1)必须有继承

(2)子类必须对父类的方法进行重写

(3)通过父类的引用调用父类的方法

多态体现:在代码运行时,当传递不同的类对象时,会调用对应类中的方法

3.重写

(1)重写:也称覆盖。重写是子类对父类非静态,非private修饰的,非final修饰的,非构造方法等的实现过程进行重写,方法名相同,参数列表相同,返回值也相同

(2)重写的好处就是在于子类可以根据需要,定义特定于自己的行为。也就是说子类可以根据需要实现父类的方法

(3)重写(override)和重载(overload)

区别点重写重载
参数列表不能修改必须修改
返回类型不能修改(除非为父子关系)可以修改
访问限定符可以降低限制可以修改

(4)方法重载是一个类的多态性表现,而方法重写是子类对父类的一种多态性表现

(5)重写的设计原则:

        对于已经投入使用的类,尽量不要修改。最好的方式是:重新定义一个新的类,来重复利用其中的共性的内容,并且添加或者改动新的内容

4.向上转型和向下转型

(1)向上转型:就是创建一个子类对象,将其当成父类使用

语法格式:

父类类型 对象名 = new 子类类型();

eg:Animal a = new Cat();//是小范围到大范围的转换

优点:让代码更简单灵活

缺点:不能调用到子类特有的方法 

(2)向下转型:将父类引用在还原为子类对象

语法格式:

 子类类型  对象名 = (子类类型)父类类型;

eg:Cat a = (Cat)Animal;//是大范围到小范围的转换

优点:能调用到子类特有的方法 

缺点:不安全(最好使用instanceof)

5.避免在构造方法中调用重写的方法
class B{
    public B(){
        func();
    }
    public void func(){
        System.out.println("B.func()");
    }
}
class D extends B{
    private int num=1;

    @Override
    public void func() {
        System.out.println("D.func() "+num);
    }
}

public class Test {
    public static void main(String[] args) {
        D d=new D();
    }
}

总结:"用尽量简单的方式使对象进入可工作状态",尽量不要在构造方法中调用方法(如果这个方法被子类重写,就会触发动态绑定,但是此时子类还没有完成构造),可能会出现一些隐藏的极难发现的问题。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1116971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【supervisor】 问题处理 unix:///var/run/supervisor/supervisor.sock no such file

问题描述 最近笔者在配置 supervisor,希望用 supervisor 进行进程服务管理的时候遇到了一些问题,具体是: 运行 supervisorctl status 的时候遇到了 unix:///var/run/supervisor/supervisor.sock no such file 的问题。在运行 sudo service …

MySQL日志 错误日志 二进制日志 查询日志 慢查询日志

一、错误日志 错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的,默认存放目录/var/log/,默认的日志文件名…

了解多媒体展厅弧幕投影系统收费构成,轻松制定预算

随着数字多媒体技术在内容展示行业中的广泛应用,基于投影、LED等技术手段的多媒体互动装置呈现多样化发展趋势,越来越多的新颖模式出现在大众眼前,其中就包括了备受关注的弧幕投影系统,作为投影技术显示形式的一种,它打…

抖音招聘直播报白有成本低和招聘效果精准的优势

抖音的短视频流量能够让岗位信息覆盖更广泛的人群,增加招聘信息的曝光度。通过抖音的短视频流量红利和精准推送,能够提高岗位信息的曝光度和求职者的留存率。如果你想做招聘报白却不知道怎么处理,可以咨询我。 创意创新:抖音招聘注重创意和创…

遍历完全二叉树节点

完全二叉树的节点个数 递归普通二叉树遍历解法 我们先来普及一下完全二叉树的概念:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层…

C语言之排序

1.冒泡排序 冒泡排序就不多说了,只需要两层循环嵌套,两两比较确定相对正确的顺序即可。 2.插入排序 插入排序的思想就是每一次向后寻找一个再将其与前面有序的部分进行对比,寻找合适位置插入。 这里关键要避免让前移超出目前读取的数字&…

Java版ORM最初雏形

经过一个晚上的加班,终于把ORM初步结构工程搭好了。工程依赖有点难用,编辑器提示比VS差很多。 首先LIS.Core创建一个最初的容器雏形,先能反射得到对象给ORM获得数据库驱动 然后ORM创建数据库驱动差异接口,不同数据库实现接口后配…

MATLAB中 tf2zpk函数用法

目录 语法 说明 示例 IIR滤波器的极点、零点和增益 tf2zpk函数的功能是将传递函数滤波器参数转换为零极点增益形式。 语法 [z,p,k] tf2zpk(b,a) 说明 [z, p, k] tf2zpk(b, a) 从传递函数参数 b 和 a 中找到零点矩阵 z,极点向量 p,以及相关的增益…

岗亭一键报警器设计

岗亭一键报警器设计 岗亭一键报警器设计人性化,拥有多种功能,例如: 紧急报警:遇到紧急情况时,只需按下报警器按钮,即可迅速向监控中心发送报警信号,以便相关人员及时采取应对措施。远程监控&am…

NLP:从头开始的文本矢量化方法

一、说明 NLP 项目使用文本,但机器学习算法不能使用文本,除非将其转换为数字表示。这种表示通常称为向量,它可以应用于文本的任何合理单位:单个标记、n-gram、句子、段落,甚至整个文档。 在整个语料库的统计 NLP 中&am…

EPLAN_007#3D图形的导入、编辑和定义

一定要打开对象捕捉,否则会严重偏移!!! 一、导入3D模型,合并模型 1、新建一个宏项目 2、导入(3D图形) 可以对目标进行旋转查看 3、合并图形(不建议合并) 框选目标 点合并…

用python写一个贪吃蛇的程序能运行能用键盘控制

用python写一个贪吃蛇的程序能运行能用键盘控制 1.源码2.运行效果 1.源码 开发库使用:pygame random 直接在终端运行:pip install pygame pycharm安装库:文件-设置-项目-Python 解释器 import pygame import random# 初始化pygame pygame…

代码随想录算法训练营第五十九天 | 647. 回文子串、516.最长回文子序列

647. 回文子串 链接: 代码随想录 (1)代码 516.最长回文子序列 链接: 代码随想录 (1)代码

文件上传漏洞靶场前十关

pass1: 只能上传照片 用burp抓包改一下数据包试试: 上传成功 菜刀getshell Pass2: 寄 Png可以,抓包: 跟pass1一样阿 Pass3: 又寄 这里用抓包改数据包,发现仍然不可以 说明后端还有对文件名后缀…

springboot中@scheduled的使用

1.主要实现类ScheduledAnnotationBeanPostProcessor 在postProcessAfterInitialization(Object bean,String beanName)方法中找到所有bean中有注解为Scheduled的方法,组装成task,添加到调度线程池中 2.Task先按线程池接口类型TaskScheduler去容器中寻找taskSchedu…

freeipa server副本同步中断,两主节点数据不一致

/var/log/messages 和/var/log/dirsrv/slapd-testhadoop-COM 日志都出现以下日志: If replication stops, the consumer may need to be reinitialized. [27/Jun/2023:05:15:09.469361922 0800] - ERR - NSMMReplicationPlugin - changelog program - repl_plugin_name_cl - a…

【vue+nestjs】qq第三方授权登录【超详细】

项目场景: 前端使用vue3ts 后端使用nestjs 1.申请appId,appKey 1.进入qq互联官网。创建应用 特别注意 在填写网站回调域时,需要你线上真实能访问的。不然审核不通过。我的回调地址是前端路由地址 2.代码演示 特别注意: 如果你跟我一样是前后端分离的模式开发的…

17、监测数据采集物联网应用开发步骤(12.2)

阶段性源码将于本章节末尾给出下载 监测数据采集物联网应用开发步骤(12.1) 新建web数据接口http-request解析类com.zxy.tcp.Request.py #! python3 # -*- coding: utf-8 -Created on 2017年05月10日 author: zxyong 13738196011 import urllib.parse,json from com.zxy.comm…

华为OD机试 - 根据某条件聚类最少交换次数 - 滑动窗口(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

解决ubuntu系统运行pyside2或6的问题

解决ubuntu系统运行pyside2或6时出现的问题 当运行程序时,出现“qt.qpa.plugin: Could not load the Qt platform plugin “xcb” in “/usr/local/lib/python3.6/dist-packages/cv2/qt/plugins” even though it was found. This application failed to start bec…