【Java SE语法篇】8.面向对象三大特征——封装、继承和多态

news2025/4/25 12:33:12

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

文章目录

  • 1. 封装
    • 1.1 封装的概念
    • 1.2 为什么封装
    • 1.3 封装的实现步骤
  • 2. 继承
    • 2.1 继承的概念
    • 2.2 继承的格式
    • 2.3 为什么继承
    • 2.4 继承类型
    • 2.5 继承特性
    • 2.6 super 与 this 关键字
    • 2.7 final 关键字
  • 3. 多态
    • 3.1 多态的概念
    • 3.2 多态的优点
    • 3.3 多态存在的三个必要条件
    • 3.4 instanceof 关键字

面向对象三大特性:封装、继承和多态。

1. 封装

1.1 封装的概念

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

1.2 为什么封装

封装的目的是保护数据的安全和完整性,同时隐藏数据的实现细节,提高代码的可维护性和可扩展性,具体有以下几个方面的好处:

  • 良好的封装能够减少耦合。
  • 类内部的结构可以自由修改。
  • 可以对成员变量进行更精确的控制。
  • 隐藏信息,实现细节。

1.3 封装的实现步骤

  1. 修改属性的可见性来限制属性的访问(用private来修饰),如:

    public class Test {
        private String name;
        private int age;
    }
    

    这段代码中,将name age 属性设置为私有的,只有在本类中被访问,其他类访问不了,就实现对信息的隐藏。

  2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

    public class Test {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    

    采用 this 关键字是为了解决实例变量和局部变量之间发生的同名的冲突。

2. 继承

2.1 继承的概念

继承是 java 面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

生活中的继承

image-20231124152011118

兔子和羊属于食草动物,狮子和老虎属于食肉动物。

食草动物和食肉动物又是属于动物。

所有的继承需要符合的关系:is-a,父类更通用,子类更具体

虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性

2.2 继承的格式

Java 中通过关键字 extends 来声明一个类是从另一个类继承而来的,一般格式如下:

class 父类 {
    
}
class 子类 extends 父类 {
    
}

2.3 为什么继承

接下来我们通过实例的说明这个需求。

开发动物类,其中动物分别为狗和猫,要求如下:

  • 狗:属性(姓名,颜色),方法(吃,叫)
  • 猫:属性(姓名,颜色),方法(吃,叫)
class Dog{
    private String name;
    private String color;

    public void eat() {
        System.out.println(this.name + "正在吃...");
    }

    public void cry() {
        System.out.println(this.name + "正在叫...");
    }
}
class Cat {
    private String name;
    private String color;

    public void eat() {
        System.out.println(this.name + "正在吃...");
    }

    public void cry() {
        System.out.println(this.name + "正在叫...");
    }
}

从这两段代码可以看出来,代码存在重复了,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个父类:

class Animal {
    private String name;
    private String color;

    public Animal(String name, String color) {
        this.name = name;
        this.color = color;
    }

    public void eat() {
        System.out.println(this.name + "正在吃...");
    }

    public void cry() {
        System.out.println(this.name + "正在叫...");
    }
}

这个Animal类就可以作为一个父类,然后狗类和猫类继承这个类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性(复用性主要是可以多次使用,不用再多次写同样的代码) 继承之后的代码:

  • 狗类
class Dog extends Animal{
   public Dog(String name , String color) {
       super(name, color);
   }
}
  • 猫类
class Cat extends Animal {
    public Cat(String name , String color) {
        super(name, color);
    }
}

2.4 继承类型

Java 中不支持多继承,但支持多重继承。

Java 继承 _Java 教程_后端语言_教程_教程_JSON在线解析及格式化验证 - JSON.cn

2.5 继承特性

  • 子类拥有父类非 private 的属性、方法。
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。
  • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

2.6 super 与 this 关键字

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类

this关键字:指向自己的引用。

class Animal {
  void eat() {
    System.out.println("animal : eat");
  }
}

class Dog extends Animal {
  void eat() {
    System.out.println("dog : eat");
  }
  void eatTest() {
    this.eat();   // this 调用自己的方法
    super.eat();  // super 调用父类方法
  }
}

public class Test {
  public static void main(String[] args) {
    Animal a = new Animal();
    a.eat();
    Dog d = new Dog();
    d.eatTest();
  }
}
// 运行结果
//animal : eat
//dog : eat
//animal : eat

2.7 final 关键字

final关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写;

  • 声明类
final class 类名 {
    // 类体
}
  • 声明方法
访问限定符 final 返回值类型 方法名(){
    // 方法体
}

注意:实例变量也可以被定义为final,被定义为final 的变量不能被修改。被声明为final 的类的方法自动声明为final,但是实例变量并不是final

3. 多态

3.1 多态的概念

多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:

image-20231124190601241

多态性是对象多种表现形式的体现。

同一个事件发生在不同的对象上会产生不同的结果。

3.2 多态的优点

  • 消除类型之间的耦合关系
  • 可替换性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

3.3 多态存在的三个必要条件

  1. 继承

  2. 重写

    重写:子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写

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

    class Animal {
        public void eat() {
            System.out.println("正在吃...");
        }
    }
    
    class Dog extends Animal {
        public void eat() {
            System.out.println("狗正在吃狗粮...");
        }
    }
    
    class Bird extends Animal {
        public void eat() {
            System.out.println("鸟正在吃鸟粮...");
        }
    }
    
    public class Test1 {
        public static void fun(Animal animal) {
            animal.eat();
        }
        
        public static void main(String[] args) {
            Dog dog = new Dog();
            fun(dog);
    
            Bird bird = new Bird();
            fun(bird);
        }
    }
    // 运行结果
    狗正在吃狗粮...
    鸟正在吃鸟粮...
    

    重写(覆盖)的规则:

    • 方法名相同
    • 参数列表相同【顺序、个数、类型】
    • 返回值相同
  3. 父类引用指向子类对象

比如:

Animal dog = new Dog();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理

以下是多态的例子:

abstract class Animal {  
    abstract void eat();  
}  

class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void work() {  
        System.out.println("抓老鼠");  
    }  
}  

class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void work() {  
        System.out.println("看家");  
    }  
}
// 测试类
public class Test {
    
     public static void show(Animal a)  {
      a.eat();  
        // 类型判断
        if (a instanceof Cat)  {  // 猫做的事情 
            Cat c = (Cat)a;  
            c.work();  
        } else if (a instanceof Dog) { // 狗做的事情 
            Dog c = (Dog)a;  
            c.work();  
        }  
    }  
    
    public static void main(String[] args) {
      show(new Cat());  // 以 Cat 对象调用 show 方法
      show(new Dog());  // 以 Dog 对象调用 show 方法

      Animal a = new Cat();  // 向上转型: 子类对象 -> 父类对象 
      a.eat();               // 调用的是 Cat 的 eat
      Cat c = (Cat)a;        // 向下转型: 父类对象 -> 子类对象
      c.work();        // 调用的是 Cat 的 work
  }     
}

// 运行结果
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠

3.4 instanceof 关键字

Java中可以使用instanceof 关键字判断对象是否是某个类的实例,语法格式如下:

对象 instanceof

在上述格式中,如果对象是指定类的实例对象,则返回true,否则返回false

class Animal {
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat() {
        System.out.println(this.name + "正在吃...");
    }
}

class Dog extends Animal {
    public String color;

    public Dog(String name, int age,String color) {
        super(name,age);
        this.color = color;
    }

    public void eat() {
        System.out.println(this.name + "正在吃狗粮...");
    }

    public void barks() {
        System.out.println(this.name + "正在旺旺叫...");
    }
}

class Bird extends Animal {
    public Bird(String name, int age) {
        super(name, age);
    }

    public void eat() {
        System.out.println(this.name + "正在吃鸟粮...");
    }

    public void fly() {
        System.out.println(this.name + "正在飞...");
    }
}

public class Test1 {
    public static void main(String[] args) {
        Animal animal1 = new Dog("旺财",10,"黄色");
        if (animal1 instanceof Bird){ // 判断 dog对象是否是Bird类的实例 如果是则实例化对象,否则打印hell
            Bird bird2 = (Bird)animal1;
            bird2.fly();
        }else {
            System.out.println("hell");
        }
    }
}

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

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

相关文章

Vue基知识四

本文对前边几章所学习的内容,以案例的形式做一个总结 一 TodoList案例 即待办事项案例,效果如下 1.1 组件化编码流程(通用) 这是编码时的通用流程,以后也可以按照这个流程来写代码(熟悉后这个流程的顺…

Flutter开发进阶之动画

Flutter开发进阶之动画 在Flutter中,动画是至关重要的一个部分,它能够为应用程序提供更加丰富和生动的用户体验,Flutter中的动画系统是UI框架的核心功能之一,也是开发者学习Flutter框架的重要部分,由于动画原理在所有…

Python基本语法与变量的相关介绍

python基本语法与变量 python语句的缩进 Python代码块使用缩进对齐表示代码逻辑,Python每段代码块缩进的空白数量可以任意,但要确保同段代码块语句必须包含相同的缩进空白数量。建议在代码块的每个缩进层次使用单个制表符或两个空格或四个空格 , 切记不…

GPU云服务器使用教程、运行YOLOV5项目并连接到本地VSCode(Pycharm)

编程如画,我是panda! 之前已经教过大家如何在自己的电脑中配置Pytorch深度学习环境,但是有些小伙伴没有英伟达的GPU,所以用CPU的话训练模型会比较慢,所以这次出一期使用GPU云服务器的教程。 码字不易,如果对…

金南瓜SECS/GEM发送event、VID

金南瓜SECS/GEM发送事件(CEID)很简单,只需一步就完成。 最重要是简单易懂,任何人一看就上手。无需懂得内部逻辑,以及一大堆的导入问题。 代码如下 C#的代码: // 扫码成功 private void buttonReadBarco…

一个简易的PHP论坛系统

一个简易的PHP论坛系统 php课程设计,毕业设计 预览 技术 bootstrap 4.x jquery css php mysql 5.7 目录结构 登录 管理员 admin/123456 测试用户 user1/123456 更多文章和源码获取查看

51-13 多模态论文串讲—BEiT v3 论文精读

BEIT-3的核心思想是将图像建模为一种语言,这样我们就可以对图像、文本以及图像-文本对进行统一的mask modeling。Multi-way transformer模型可以有效地完成不同的视觉和视觉语言任务,使其成为通用建模的一个有效选择。 同时,本文也对多模态大…

深入 Move 生态,探秘铭文热潮背后的思考

Move 语言是 Meta(Facebook)在 2018 年开发的新一代智能合约编程语言。回顾过去的一年,Aptos 与 Sui 主网上线,为整个 Web3 开启了下一个十亿用户服务的新征程。Rooch、Initia、MoveMent 等多条使用 Move 语言的区块链网络涌现&am…

边缘计算的舞台,挑战与机遇相伴

目录 前言 边缘计算保卫战:数据宝藏的隐藏与探索 稳如磐石:保障你的边缘计算宝藏安稳运行! 打破时间的桎梏:为边缘计算注入超快速度与实时表演 边缘计算:应对多样性和异构性的酷炫策略大揭秘 边缘计算:释…

MySQL面试题 | 06.精选MySQL面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Spring Boot - JaCoCo Code Coverage

文章目录 概述如何集成pom添加插件Code Demo排除不相关的类CI/CD中使用完整POM 概述 JaCoCo(Java Code Coverage)是一个开源的Java代码覆盖率工具,它主要用于评估Java程序的测试完整性。通过跟踪测试过程中执行的代码,JaCoCo能够…

【Python数据可视化】matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图

文章传送门 Python 数据可视化matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

读元宇宙改变一切笔记07_硬件与互操作性(上)

1. 元宇宙的头号入口 1.1. 元宇宙最令人兴奋的地方在于,我们可以借此开发用来访问、渲染和操纵它的新设备 1.1.1. App Newton于1993年发布,是世界上第一款掌上电脑 1.2. 功能超强大又轻巧的AR和沉浸式VR头显 1.2.1.…

AI智能创作软件,颠覆你的写作体验

你是否想过,有一天,文字创作不再受限于人的思维和表达能力?AI智能文章创作就是这样一个神奇的存在。它运用先进的自然语言处理技术,通过对大量数据的深度学习,根据需要自动生成文章。你只需输入关键词或主题&#xff0…

【天龙八部】攻略day6

关键字: 灵武、寻宝要求、雁门 1】灵武选择 西凉枫林,锦带,短匕 白溪湖,明镜,双刺 竹海,玉钩,锁甲 2】楼兰寻宝需求 等级80级,40级前6本心法 3】雁门奖励 简单35*4元佑碎金 普…

机器学习扩散模型简介

一、说明 扩散模型的迅速崛起是过去几年机器学习领域最大的发展之一。在这本易于理解的指南中了解您需要了解的有关扩散模型的所有信息。 扩散模型是生成模型,在过去几年中越来越受欢迎,这是有充分理由的。仅在 2020 年代发布的几篇开创性论文就向世界…

强化学习应用(二):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法,用于解决基于马尔可夫决策过程(MDP)的问题。它通过学习一个值函数来指导智能体在环境中做出决策,以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

Docker实战10|实现volum数据卷

上一篇文章中,仔细讲解了Docker是如何改变当前的root文件系统以及mount等操作。 本文继续讲解Docker是如何实现Volum数据卷的。 实现Volume数据卷 获取代码 git clone https://gitee.com/mjreams/docker.git 上一小节介绍了如何使用AUFS包装busybox&#xff0c…

【Python】使用tkinter设计开发Windows桌面程序记事本(5)

上一篇:【Python】使用tkinter设计开发Windows桌面程序记事本(4)-CSDN博客 下一篇:待羽翼丰满之时,必将是文章更新之日! 作者发炎 本篇文章继承了前面四篇文章,并且实现了新建、保存、另存、打…

Open3D 计算点云质心和中心(18)

Open3D 计算点云质心和中心(18) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 质心和中心是有所区别的,点云质心可以看作每个点的坐标均值,点云中心可以看作点云所在包围盒的中心,这也是上一章坐标最值的常用方法,下面就两种方法进行实现(图例,大概就是这个意思…