Java——面向对象进阶(封装、继承、多态)

news2025/7/11 13:17:19

Java面向对象三大特性——封装、继承、多态

  • 一、封装
    • 1.封装基本概念
    • 2.访问修饰符
    • 3.Java中封装的理解
    • 4.封装的优点
  • 二、继承
    • 1.为什么需要继承
    • 2.继承层次结构
    • 3.super和this关键字
    • 4.继承语法与设计一个继承体系
  • 三、多态
    • 1.多态的概念
    • 2.多态的实现条件
    • 3.多态的优缺点

一、封装

1.封装基本概念

封装(encapsulation,有时称为信息隐藏)是处理对象的一个重要概念。
从形式上看,封装就是将数据和行为组合在一个包中,并对对象的使用者
隐藏具体的实现细节。对象中的数据称为实例字段(instance field),
操作数据的过程称为方法(method)。作为一个类的实例,一个特定对象
就有一组特定的实例字段值。这些值的集合就是这个对象当前的状态(state)
只要在对象上调用一个方法,它的状态就有可能发生改变。

封装的关键:
绝对不能让其他类中的方法直接访问这个类的实例字段。程序只能通过对象的方法与对象的数据进行交互。

2.访问修饰符

下面是小编整理的访问限定符,这是一定要掌握的哦😊

No范围privatedefaultprotectedpublic
1同一包中的同一类
2同一包中的不一类
3不同包中的子类
4不同包中的非子类

3.Java中封装的理解

我们在设计程序的时候追求高内聚、低耦合
高内聚——类的内部数据的操作和细节自己完成,不允许外部干涉;
低耦合——对外提供少量的公共方法使用

我们在实现的一个类的时候隐藏类内部的复杂性、之对外提供简单的公开的接口。便于外界调用从而提高系统的可拓展性、可维护性,这里就要讲到Java中权限访问修饰符(private、默认(什么都不加)、protected、public)进行封装。

下面我们用封装的思想来编写一个员工类
属性——姓名、年龄、工资
行为——上班摸鱼

public class Employee {
    /**
     * 将特有的属性进行封装,并且不希望外界随意
     * 的对他进行修稿,这里我们就要用到私有的访
     * 问修饰符——private
     */
    private String name;
    private int age;
    private double salary;

    //构造方法,供外界实例一个类对象来操作数据
    public Employee(String name,int age,double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    /**
     * 对外提供少量的公共方法供实例对象来操作数据
     * 主要是get、set方法,就比如说有一天我的员工修
     * 改了姓名或者调薪
     */
    //set设置器
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //get访问器
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }

    //特有的行为
    public void work() {
        System.out.println("名字为" + name + "的员工正在上班摸鱼");
    }

    public void raiseSalary(double byPercent) {
        double raise = salary * byPercent / 100;
        salary += raise;
    }
}

4.封装的优点

最后我们再仔细看一下非常简单getName、getSalary方法

public String getName() {
	return name;
}

public double getSalary() {
	return salary;
}

这些都是典型的访问器。由于他们只返回实例字段的值,因此又称为字段访问器(field accessor)。

如果将name、salary字段标记为公共,而不是编写单独的访问器方法,不是更容易一些吗?

不过name只是一个只读字段,一旦再构造器(构造方法)中设置,就没有办法能够修改这个字段。这样我们就可以确保name字段不会受到外界的破坏。

虽然salary不是只读字段,但是它只能用raiseSalary方法修改。具体的,如果这个值发生错误,那么只需要调试这个raiseSalary方法就可以了。如果salary字段是公共的,破坏这个字段的罪魁祸首就可以出现再任何地方(那就很难调试了)。

二、继承

1.为什么需要继承

让我们回忆一下上面讨论的employee类。假设你在某个公司工作,这个公司里经理的待遇与普通员工的待遇存在着一些差异。不过,当然他们当中也存在很多相同的地方,例如,他们都领取薪水。只是普通员工在完成本职任务后仅领取薪水,而经理在完成了预期的业绩之后还能得到奖金。这种情形就需要使用继承。
为什么呢?因为需要为经理定义一个新类Manager,并增加一些新功能,但可以重用Employee类中已经编写好的部分代码,并保留Employee类中的所有字段。

**继承机制:**是面向对象程序设计使代码可以复用的重要手段,它允许程序员在保持原有类特性的基础上进行拓展,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。

2.继承层次结构

继承并不仅限于一个层次。例如,可以由Animal类派生出狗类、猫类、鸟类,再由猫类派生出中华田园猫、英国短毛猫、布偶猫等。由一个公共超类派生出来的所有类的集合称为继承层次结构(inheritance hierarchy),如下图所示。再继承层次结构中,从某个特定的类到其祖先的路径称为该类的继承链(inheritance chain)。

补充:
在C++中,一个类可以有多个超类。Java不支持多重继承,但支持多层继承。

在这里插入图片描述

3.super和this关键字

由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成员时,该如何操作?直接访问是无法做到的,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。
this关键字主要在本类访问本类成员成员变量,**该关键字的主要作用:**在本类方法中访问本类的成员
super和this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,他们之间有什么区别呢/?
【相同点】
1.都是Java中的关键字
2。只能在类的非静态方法中使用,用来访问非静态的成员方法和字段
3.在构造方法中调用时,必须时构造方法中的第一条语句,并且不能不能同时存在
【不同点】
1.this是当前对象的引用,当前对象即为调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
3. 在构造方法中:this(…)用于调用本类构造方法,super(…)用于调用父类构造方法,两种调用不能同时在构造
方法中出现
4. 构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有

4.继承语法与设计一个继承体系

4.1 继承语法:
Java中如果要表示类之间的继承关系,需借助extends关键字,具体如下:

修饰符 class 子类名 extends 父类名 {
	//...
}

4.2 设计一个继承体系
父类Employee类:
属性——姓名、年龄、工资
行为——上班摸鱼、调薪
子类Manager类:
属性——姓名、年龄、工资、奖金(特有的)
行为——看看谁摸鱼、调薪

class Employee {
    //属性
    private String name;
    private int age;
    private double salary;

    //构造方法
    public Employee(String name,int age,double salary) {
        /**this关键字的用法解释
         * 由于方法形参与成员变量同名,不适用this关键字就造成变量
         * 同名,不使用this关键字就遵循就近原则,影响不到成员变量
         * 故this.name指定了成员变量的name,而非形参的name
         */
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    //set更改器
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //get访问器
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }

    //行为
    public void work() {
        System.out.println("名字为" + name + "的员工正在上班摸鱼!");
    }

    public void raiseSalary(double byPercent) {
        double raise = salary * byPercent / 100;
        salary += raise;
    }
}

class Manager extends Employee {
    //属性,与父类相同的属性就不必写了,这就是继承的好处
    private double bonus;

    public Manager(String name, int age, double salary) {
        /**super关键字用法的解释
         * 因为这个类继承了Employee类,必须帮助父类构造
         * 这里的super是调用了父类的构造方法
         */
        super(name, age, salary);
        //这里的奖金并不是构造对象时马上给出的,根据业绩的给定的
        this.bonus = 0;
    }

    /*由于父类的访问器已经不能满足子类的需求了,故需要重写
    父类的getSalary()方法,这里不加拓展重写,有关内容期待博主更新
    或者网上查阅资料哦!!!*/
    public double getSalary() {
        //这里super关键字的用法时调用父类的成员方法
        double baseSalary = super.getSalary();
        return baseSalary + bonus;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }

    public void superviseWork() {
        System.out.println("名为" + super.getName() + "正在看看谁上班摸鱼!");
    }
}

三、多态

1.多态的概念

在Java程序设计语言中,对象变量时多态的(polymorphic)。一个Employee类型的变量既可以引用一个Employee类型的对象,也可以引用Employee类的任何一个子类的对象(例如:Manager)。
那就意味着我们可以这样用,接上面的继承篇

Manager boss = new Manager("张三",24,12000);
Employee[] staff = new Employee[3];
staff[0] = boss;
boss.setBonus(5000)//OK
staff[0].setBonus(5000)//ERROR

为什么会发生错误呢?这是因为staff声明是Employee类型,Employee类中并没有setBonus()方法,boss则是声明为Manager类型,类中有setBonus()方法,所以调用时正确的。

**多态的概念:**通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生不同的状态。

2.多态的实现条件

在Java中要想完成多态,必须要满足如下几个条件,缺一不可:

  • 必须在继承体系下
  • 子类必须要对父类中的方法进行重写
  • 通过父类的引用调用重写的方法

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

Employee boss = new Manager("张三",24,12000);
/**
*此时父类和子类中都有setSalary()方法,编译器在编译代码时并不知道
*要调用Employee中的方法还是Manager中的方法,等程序运行起来后,变量
*boss引用的具体对象确定后,才知道要调用那个方法。明显这里boss引用
*Manager,所以回调用Manager类中的getSalary方法。
*/
boss.getSalary();

3.多态的优缺点

1.多态的优点

  • 能够降低代码的复杂度,避免大量使用if-else
  • 拓展能力更强

2.多态的缺陷

  • 属性没有多态性
当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己
的成员属性
  • 构造方法没有多态性

结语:每个人的成长和进步都离不开点点滴滴的积累,如果小编的内容对您有所帮助,希望友友们三连加关注哦,你的支持是小编创作的最大动力。

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

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

相关文章

【微服务架构组件】Nacos

初识nacos 最近在整合nacos做配置的热下发,总结下。 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 阿里开源产品:什么是 Nacos 如 Na…

[Leetcode]138. 复制带随机指针的链表

目录 1.题目链接 2.1解法①(暴力) 2.1.1解法思路: 2.1.2代码实现: 2.2解法②(进阶) 2.1.1解法思路: 2.2.2代码实现: 1.题目链接 138. 复制带随机指针的链表 - 力扣(LeetCode) 2.1解法①(暴力) 2.1.…

软考 - 操作系统

操作系统概述 bit和byte区别 bit 位 说白了就是0或者1;计算机内存中的存储都是01这两个东西。 byte(B) 字节 1byte8bit(一字节 8比特) 1byte就是1B 1byte 存1个英文字母,2个byte存一个汉字。 了解 操作系统的作用&#xff1…

SpringBoot使用EasyExcel类一键导出数据库数据生成Excel,导入Excle生成List<>数据(作者直接给demo项目)

文章目录一、简单一键导出Excel直接给出生成效果Empty&#xff0c;这个很关键controller层EasyExcel类的多种使用方式二、导入Excel生成List<>数据controller层&#xff0c;简单写法监听器写法&#xff08;观察者模式&#xff09;&#xff0c;稍微麻烦其他如果要使类中的…

动态拼接 merge 语句

【问题】 Hello everyone, I have one query, would be great if anyone can help me out on this. In SQL, I have two tables with same column names. Want to query if there is any difference in the column values and if yes will update the values(in the first ta…

LEADTOOLS 入门教程: 使用 AWS Lambda 转换文档 - C# .NET Core

LEADTOOLS 是一个综合工具包的集合&#xff0c;用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中&#xff0c;是一项企业级文档自动化解决方案&#xff0c;有捕捉&#xff0c;OCR&#xff0c;OMR&#xff0c;表单识别和处理&#…

SSM框架真没那么难,这份阿里大佬的进阶实战笔记真给讲透了!

SSM框架&#xff1a; SSM框架是spring MVC &#xff0c;spring和mybatis框架的整合&#xff0c;是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层 使用spring MVC负责请求的转发和视图管理 spring实现…

Docker学习笔记

1.docker比vm快的原因: docker有着比虚拟机更少的抽象层,不需要实现硬件资源的虚拟化运行,运行在docker上的程序使用的都是物理机的资源. dicker利用的是宿主机的内核,不需要加载操作系统的os内核. 2.docker帮助文档docker help 具体到某一个命令是使用 docker run --help即可…

【JMeter】Jmeter分布式压测教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、原理二、环境搭建2.1 环境准备2.2 slave机器配置2.3 master机器配置三、脚本及执行3.1 参数化问题3.2 GUI启动测试3.3 命令行启动测试总结一、原理 Jmeter分布式…

【深入理解Kotlin协程】CoroutineScope.launch源码追踪扒皮

lifecycleScope、viewModelScope、GlobalScope、MainScope的上下文 协程最重要的就是协程上下文对象&#xff0c;因为通过上下文可以获取到协程相关的任何东西(Job、Dispatcher、Interceptor、Name、ExceptionHandler)&#xff0c;所以有必要了解清楚常用的协程作用域对象中cor…

asp.net+sqlserver汽车4s店销售网站系统c#项目

数据项 管理员信息表&#xff5b;用户编号&#xff0c;用户名称&#xff0c;用户密码&#xff5d; 新闻信息表&#xff5b;编号&#xff0c;标题&#xff0c;内容&#xff0c;添加时间&#xff5d; 汽车信息表&#xff5b;编号&#xff0c;汽车名称&#xff0c;汽车价格&#x…

制造业行业现状及智能生产管理系统一体化解决方案

前言&#xff1a; 《中国制造2025》作为我国实施制造强国战略第一个十年的行动纲领。它重点提出了坚持&#xff1a;创新驱动、质量为先、绿色发展、结构优化、人才为本的基本方针。坚持&#xff1a;市场主导、政策引导&#xff0c;立足当前、着眼长远&#xff0c;整体推进、重…

Selenium实现原理

Selenium 是目前主流的用于Web应用程序测试的工具&#xff0c;可以直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 selenium的实现原理是这样的&#xff1a; 1.运行代码&#xff0c;启动浏览器后&#xff0c;webdriver会将浏览器绑定到特定端口&#xff0c;作为we…

[go学习笔记.第十五章.反射] 1.反射的基本介绍以及实践

一.反射的引入以及基本介绍 1.看两个问题 (1).对于结构体的序列化和反序列化&#xff0c;看一段代码 package mainimport("fmt" "encoding/josn" )type Monster struct {Name string json:"monsterName"Age int json:"monsterAge&quo…

deque容器(20221115)

1、基本概念 功能&#xff1a;双端数组&#xff0c;可以对头端进行插入删除元素 deque与vector的区别&#xff1a; vector对应头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低 deque对头部的插入删除速度比vector快 vector访问元素速度比deque快 deque内…

sanic 教程

sanic 教程 在Sanic的生命周期流程大致如下&#xff1a; http请求——Sanic解析request——匹配路由——请求中间件——视图函数——响应中间件——http响应 依赖库 sanic21.3.4 sanic-jwt1.7.0 sanic-openapi21.12.0 gunicorn20.1.0 PyMySQL1.0.2 aiomysql0.1.1 DBUtils1.3…

WPS(WSC)中M1 到M8 图解

背景 之前实习的时候就学了Wifi p2p相关的东西&#xff0c;当时找M1到M8的功能把我累惨了&#xff0c;找到的还全是千篇一律的东西&#xff0c;讲的不是很清楚&#xff08;当然原版出书的那个前辈肯定是懂的&#xff09;&#xff0c;但是对我等小白不友好&#xff0c;就萌生了这…

3.线性代数-矩阵

矩阵和Tensor1. Tensor2.矩阵3.线性代数正确打开方式3.1 行视图3.2 列视图4.线性相关和线性无关5. Span、基和子空间(Subspace)6.四个基本的子空间6.1 列空间6.2 零空间6.3 行空间6.4 左零空间6.5 四个基本子空间的关系7.可逆矩阵8.方阵的特征值与特征向量9.特征分解9.1一般矩阵…

【Pytorch with fastai】第 7 章 :训练SOTA的模型

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Nginx优化方案

目录 一、Nginx返回错误页面 1、HTTP常见状态代码列表 二、Nginx状态页面 1、安装status模块 2、激活status 三、优化并发连接数 1、压力测试软件ab&#xff08;http-tools&#xff09; 2、优化并发连接数 2.1、修改nginx并发数 2.2、修改内核最大文件数量 四、Nginx…