(十四)面向对象的三大特征

news2024/11/18 21:48:49

目录

前言:

一、面向对象三大特征之一:封装

二、面向对象三大特征之二:继承

三、面向对象三大特征之三:多态


前言:

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

一、面向对象三大特征之一:封装

1.概述:

        封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。

        封装:告诉我们,如何正确设计对象的属性和方法。

        封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应得行为。

        private:修饰的成员只能在当前类中访问。

2.例子:

public class Show{

    public static void show(String str){

    System.out.println(str);

    }

}

上面就是对 System.out.println();的封装。

调用的时候 :

public class Use{

    public static void main(String[] args){

    Show.show("封装");
    
    }

}

这样用的时候就不用使:System.out.println("封装");

二、面向对象三大特征之二:继承

1.什么是继承?

        java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。

        public class Student extends people{}

        Student称为子类(派生类),people称为父类(基类或超类)。

        父类(super)、子类(this)

        作用:      当子类继承父类后,就可以直接使用父类公共的属性和方法了。

2.继承规范:

        ①子类们相同特征(共性属性,共性方法)放在父类中定义。

        ②子类独有的属性和行为应该定义在子类自己里面。

3.继承的特点:

        ①子类有自己的构造器,不能继承父类的构造器 ②子类是否可以继承父类的私有成员(可以继承父类的私有成员,只是不能直接访问! )

        ③子类是否可以继承父类的静态成员(不是继承,是共享的父类的) ​ ④java只能继承一个父类,不支持多继承,不过支持多层继承。 多层继承: A继承B,B继承C;

        ⑤object :object是祖宗类

4.在子类中给访问成员(成员变量、成员方法)满足:就近原则(局域对象<子类对象<父类对象)

        ①先子类局部范围找。

        ②然后子类成员范围找。

        ③然后父类成员范围找,如果父类范围还没有找到则报错。

5.如果子父类中,出现了重名的成员,会优先使用子类的,此时如果一定要在子类中使用父类的怎么办?

        ①可以通过super关键字,指定访问父类的成员。

                格式:super.父类成员变量/父类成员方法

        ②可以通过this关键字,指定访问子类的成员。

                格式:this.子类成员变量/子类成员方法

6.继承后:方法重写

        在继承体系中,子类出现了和父类中一摸一样的方法声明,我们就称子类这个方法是重写的方法。

7.方法重写的应用场景

        ①当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。

        ②子类可以重写父类中的方法。

8.@Override重写注解:

        放在重写后的方法上,作为重写是否正确的校验注解。

作用:

        1.这个方法必须是正确重写的;

        2.提高代码的可读性,代码优雅。

注意:

        ①重写方法的名词称、形参列表必须与被重写方法的名称和参数列表一致。

        ②私有方法不能被重写。

        ③子类重写父类方法时,访问权限必须大于或者等于父类。

        ④子类不能重写父类的静态方法,如果重写会报错。

9.方法重写案例:

 旧手机的功能只能是基本的打电话,发信息;

新手机的功能需要能够在基本的打电话下支持视频通话。基本的发信息下支持发送语音和图片。

main类:

public class extends_Test {
    public static void main(String[] args) {
        //方法重写
        newphone nw = new newphone();
        nw.call();
        nw.sending();
    }
}
新手机类(子类):
​​​​​​​/*
新手机:子类
 */
class newphone extends phone{
    //重写的方法
    @Override//1.这个方法必须是正确重写的;2.提高代码的可读性,代码优雅。
    public void call(){
        super.call();//先用父类的基本功能
        System.out.println("开始视频通话");
    }
    //重写的方法
    @Override
    public void sending(){
        super.sending();//先用父类的基本功能
        System.out.println("发送有趣的图片~~");
    }
}
旧手机类(父类):
/*
旧手机:父类
 */
class phone{
    public void call(){
        System.out.println("打电话");
    }
    public void sending(){
        System.out.println("发短信");
    }
}

10.继承后:子类继承父类后构造器的特点:

        子类所有构造器都会先访问父类构造器,再调用自己的构造器,初始化父类的数据。

为什么?

        ①子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。

        ②子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。

怎么调用父类构造器?

        子类构造器的第一行语句默认都是:super(),不写也存在。

11.继承后:子类构造器访问父类有参构造器?

super调用父类有参构造器的作用:

        初始化继承自父类的数据;

 如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢?

         会报错,因为子类默认是调用父类无参构造器的。

如何解决?

        子类构造器中可以书写super(...),手动调用父类的有参数构造器。

12.代码演示:

猫类(子类):

public class cat extends dog {
    public cat(){
        System.out.println("子类cat无参数构造器被执行~~");
    }
    public cat(String name){
        System.out.println("子类cat有参数构造器被执行~~");
    }
}
狗类(父类):

public class dog {
    public dog(){
        System.out.println("父类dog无参数构造器被执行~~");
    }
}
main类:

public class test1 {
    public static void main(String[] args) {
        //继承后子类构造器的特点
        cat c1 = new cat();
        System.out.println(c1);
        System.out.println("----------");
        cat c2 = new cat("金毛");
        System.out.println(c2);
    }
}
 

13.this和super小结

        this:代表本类对象的引用;
        super:代表父类存储空间的标识。

  • this()和super()必须要在第一行,所以一个构造器中不能共存this()和super();

  • this :访问子类当前对象的成员

  • super :在子类方法中指定访问父类的成员

  • this(...) :访问本类兄弟构造器

  • super(...) : 在本类构造器中指定访问父类的构造器

14.代码演示:

动物类(父类):

public abstract class Animal {
    public String name = "动物名";
​
    public void eat() {
        System.out.println("动物要吃东西!");
    }
​
    public static String location = "长隆动物园";
​
    public abstract void run();
}

老虎类(子类):

public class Tiger extends Animal {
    public static boolean location;
    String name = "老虎名";
​
    public void showName(){
        String name = "局部名";
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
        super.eat();
        this.eat();
    }
    @Override // 1、重写校验注解,加上之后,这个方法必须是正确重写的,这样更安全  2、提高代码的可读性
    /**1、重写的名字和形参列表必须与被重写的方法一样
     * 2、私有方法不能被重写
     * 3、子类重写父类方法时,访问权限必须大于或者等于父类( 访问权限:privase < 不写 < protected < public)
     * 4、静态方法不能被子类重写
     */
    public void eat(){
        super.eat();//方法重写,重写父类
        System.out.println("老虎在吃东西");
    }
​
    @Override
    public void run() {
        
    }
}

实现类:

//extends :子类继承父类  让一个类与另一个类建立父子关系,用于提高代码复用性(子类extends 父类)
//父类(super)、子类(this)
public class extends_Demo4 {
    /**  继承的特点:
     * 1、子类有自己的构造器,不能继承父类的构造器
     * 2、子类是否可以继承父类的私有成员(可以继承父类的私有成员,只是不能直接访问! )
     * 3、子类是否可以继承父类的静态成员(不是继承,是共享的父类的)
     * 4、java只能继承一个父类,不支持多继承,不过支持多层继承。  多层继承: A继承B,B继承C;
     * 5、object :object是祖宗类
     * 在子类中给访问成员(成员变量、成员方法)满足:就近原则(局域对象<子类对象<父类对象)
     */
    //子类所有构造器都会先访问父类构造器,再调用自己的构造器,初始化父类的数据
​
    /**
     * this()和super()必须要在第一行,所以一个构造器中不能共存this()和super();
     * this :访问子类当前对象的成员
     * super :在子类方法中指定访问父类的成员
     * this(...) :访问本类兄弟构造器
     * super(...) : 在本类构造器中指定访问父类的构造器
     */
    public static void main(String[] args) {
        Tiger t = new Tiger();
        t.eat();
        System.out.println(Tiger.location);
        t.showName();
​
    }
}

 

三、面向对象三大特征之三:多态

1.概述:

        同类型的对象执行同一个行为,会表现出不同的行为特征。

2.多态的常见形式:

        父类类型 对象名称 = new 子类构造器;

        接口 对象名称 = new 实现类构造器;

3.代码演示:

动物类:

public abstract class Animal {
    public String name = "动物名";
​
    public void eat() {
        System.out.println("动物要吃东西!");
    }
​
    public static String location = "长隆动物园";
​
    public abstract void run();
}

实现类:

public class polymorphic_Demo {
    public static void main(String[] args) {
        Animal a = new Animal() {//父类类型 对象名称 = new 子类构造器;
            @Override
            public void run() {
                System.out.println("🐕跑得很快~~");
            }
        };
        a.run();//编译看左边,运行看右边
    }

4.多态成员访问特点:

  • 方法调用:编译看左边,运行看右边

  • 变量调用:编译看左边,运行看左边(多态侧重行为多态)

5.多态的前提:

        ①有继承/实现关系;

        ②有父类引用指向子类对象;

        ③有方法重写;

6.多态的优势:

        ①在多态的形式下,右边对象可以实现解耦合,便于扩展和维护;

        ②定义方法的时候,使父类型作为参数,该方法可以接收这父类的一切子类对象,体现出多态的扩展性与便利;

        ③多态下不能访问子类的独有功能;

7.多态下引用数据类型的类型转换

  • 自动类型转换(从子到父):子类对象赋值给父类类型的变量指向;

  • 强制类型转换(从父到子):子类 对象变量 = (子类)父类类型的变量;

  • 作用:解决多态下的劣势,实现调用子类独有的功能。

  • 有继承或实现关系编译阶段可以强制转换,但如果转型后的类型和对象的真实类型不是同一种类型,那么在转换的时候就会出现异常:ClassCastException

  •  

  • Java建议强制转换前使用instanceof判断当前对象的真实类型,再进行强制转换;

  • 变量名 instanceof 真实类型:用于判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回true;

  •  

9.案例:

需求:

        ①使用面向对象编程模拟:设计一个电脑对象,可以安装2个USB设备。

        ②鼠标:被安装时可以完成接入、调用点击功能、拔出功能。

        ③键盘:被安装时可以完成接入、调用点击功能、拔出功能。

分析:

        ①定义一个USB的接口(申明USB设备的规范必须是:可以接入和拔出)。

        ②提供2个USB实现类代表鼠标和键盘,让其实现USB接口,并分别定义独有功能。

        ③创建电脑对象,创建2个USB实现类对象,分别安装到电脑中并触发功能的执行。

USB接口规范类:

/**
 * USB接口 == 规范
 */
public interface USB {
    //接入、拔出
    void connect();
    void unconnect();
}

键盘实现类:

/**
 * 实现类
 */
public class keyBoard implements USB{
    private String name;
​
    public keyBoard(String name) {
        this.name = name;
    }
    @Override
    public void connect() {
        System.out.println(name+"成功连接电脑");
    }
​
    @Override
    public void unconnect() {
        System.out.println(name+"成功拔出电脑");
    }
​
    /**
     * 独有功能
     */
    public void keyDown(){
        System.out.println(name+"敲击了:来了,老弟~~");
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
}

鼠标实现类:

   /**
     * 实现类
     */
public class Mouse implements USB {
        private String name;
        public Mouse(String name) {
            this.name = name;
        }
        @Override
        public void connect() {
            System.out.println(name + "成功连接电脑");
        }
​
        @Override
        public void unconnect() {
            System.out.println(name + "成功拔出电脑");
        }
        /**
         * 独有功能
         */
        public void duClick() {
            System.out.println(name + "双击点亮:小红心~~");
        }
​
        public String getName() {
            return name;
        }
​
        public void setName(String name) {
            this.name = name;
        }
}

电脑实现类:

public class computer {
    private String name;
​
    public computer(String name) {
        this.name = name;
    }
    public void start(){
        System.out.println(name+"电脑开机了~~");
    }
​
    /**
     * 提供安装USB设备的入口
     */
    public void installUSB(USB usb){
        //多态:usb == 可能是鼠标,也可以是键盘
        usb.connect();
        //独有功能:先判断再强转
        if (usb instanceof keyBoard) {
            keyBoard k = (keyBoard) usb;
            k.keyDown();
        }else if(usb instanceof Mouse){
            Mouse m = (Mouse) usb;
            m.duClick();
        }
        usb.unconnect();
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
}

实现main类:

/**
 * 目标:USB设备模拟
 * 1、定义USB接口:插入和拔出
 * 2、定义两个USB的实现类 :鼠标和键盘
 * 3、创建一个电脑对象,创建USB设备对象,安装启动
 */
public class Test {
    public static void main(String[] args) {
        //1.创建电脑对象
        computer c = new computer("外星人");
        c.start();
        //2.创建鼠标和键盘对象
        USB u = new keyBoard("双飞燕");
        c.installUSB(u);
        USB u1 = new Mouse("逻辑");
        c.installUSB(u1);
​
    }
}

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

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

相关文章

使用Idea编码常用的28种技巧方式

一丶列表: 1丶查看代码历史版本 2丶调整idea的虚拟内存&#xff1a; 3丶idea设置成eclipse的快捷键 4丶设置提示词忽略大小写 5丶关闭代码检查 6丶设置文档注释模板 7丶显示方法分隔符 8丶设置多行tab 9丶快速匹配方法的大括号位置 10丶代码结尾补全 11丶模糊搜索方法 12丶预览…

用 Python selenium爬取股票新闻并存入mysql数据库中带翻页功能demo可下载

用 Python selenium爬取实时股票新闻并存入mysql数据库中1.分析需求2.创建表3.分析需要爬取的网页内容4.python里面selenium进行爬虫操作1.添加包2.连接数据库3.selenium爬虫前配置4.对股票新闻内容爬取并存入mysql中5.翻页功能6.运行程序首先我们先明确我们的主要目标就是要爬…

5、SySeVR复现——Data preprocess(上)

目录 1、环境 2、生成切片对应的hash 3、获取要删除的切片位置信息 4、对切片进行token化 1、环境 从数据预处理开始&#xff0c;操作系统&#xff1a;windows 10 &#xff0c;软件&#xff1a;pycharm 注&#xff1a;对官方提供的文件&#xff0c;做了一些改动&#xff0c…

插槽 slot

文章目录一、什么是插槽二、插槽内容三、渲染作用域四、默认内容五、具名插槽六、作用域插槽一、什么是插槽 我们使用 <slot> 作为一个占位符&#xff0c;父组件就可以把要传递的内容显示到占位符所在位置上&#xff0c;提高组件使用的灵活性。 二、插槽内容 父组件向…

安信可VC系列语音识别的使用教程

安信可VC-02语音识别的应用&#xff0c;本篇只讲述在Windows系统下的应用。Linux下的请参考官方文档介绍和说明。 1-安信可VC-02离线语音识别简介 VC系列模组是我司开发的一款AI离线语音识别的产品&#xff0c;主芯片是云知声推出的离线语音识别芯片锋鸟M(US516P6)&#xff0c…

Redis基础语法和SpringBoot集成使用

在初期&#xff0c;已经讲述了Redis安装问题。现在正式进入Redis的入门阶段。 Redis客户端 命令行客户端 redis-cli [options] [commands]常用到的 options 有&#xff1a; -h 127.0.0.1: 指定要连接的Redis的IP地址【默认127.0.0.1】-p 6379: 指定连接Redis的端口【默认63…

jenkins前端页面自动运维值yarn编译运行项目

配置步骤如下 首先需要在系统管理中心安装node相关插件 安装完成之后&#xff0c;在系统管理——>全局工具配置——>NodeJS 点击新增Nodejs 此处自定义别名&#xff0c;我这里是Nodejs16&#xff0c;取消自动安装前面的复选框&#xff0c;下方选择我们的nodejs安装目录&…

云服务器定时执行python脚本

文章目录前言crontab简介基本语法定时任务具体内容python 脚本定时任务前言 在服务器上定时执行任务有两种方式&#xff0c;一种是at定时任务&#xff0c;一种是crond任务调度&#xff0c;at命令是一次性定时计划任务&#xff0c;at的守护进程 atd会以后台模式运行&#xff0c…

Spring注解之@validated使用

概念 spring-boot中可以用validated来校验数据&#xff0c;如果数据异常则会统一抛出异常&#xff0c;方便异常中心统一处理。 注解源码&#xff1a; Validated 作用在类、方法和参数上 Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER}) Retention(…

python初级教程十一 urllib

urllib Python urllib 库用于操作网页 URL&#xff0c;并对网页的内容进行抓取处理。 本文主要介绍 Python3 的 urllib。 urllib 包 包含以下几个模块&#xff1a; urllib.request - 打开和读取 URL。 urllib.error - 包含 urllib.request 抛出的异常。 urllib.parse - 解…

【Python入门指北】操作数据库

文章目录一、1.数据库2.练手案例二、redis数据库一、 1.创建一个数据库 [guanmaster1 ~]$ mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL…

Apache IoTDB PMC 乔嘉林荣获 2022 杰出开源贡献者|开源技术强大,开源文化活跃...

2022 年 12 月 29 日至 30 日&#xff0c;2022 木兰峰会正式召开&#xff0c;会上发布了中国开源云联盟 2022 年度评选名单。本次评审专家包括数十位开源领域专家、社区领袖、科研院所专家&#xff0c;共评选出杰出开源贡献者 3 人。其中&#xff0c;清华大学助理研究员、博士后…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.16 完结和后续:《Qt开发专题-自定义控件》

本节对应的视频讲解&#xff1a;B_站_视_频 https://www.bilibili.com/video/BV1NW4y1K7eL 1. 为什么需要自定义控件 绘图最大的一个应用场景就是自定义控件&#xff0c;Qt 本身提供的一些控件是有限的&#xff0c;并且它提供的一些控件很可能不满足我们的需要 这种情况下&a…

pygame - 图片移动优化

目录 一、优化过程分析 1、pygame - 图片移动中图片移动模式 2、优化过程 二、代码段 1、附注释 2、无注释 三、效果展示 一、优化过程分析 1、pygame - 图片移动中图片移动模式 按一次方向键&#xff0c;图片移动一小步&#xff1b; 若需要一直往某个方向移动&…

【LaTex】LaTex 极简安装教程

文章目录Latex 安装教程1. 下载texlive.iso2. 点击装载3. 运行 install-tl-windows.bat 进行安装4. 验证是否安装成功5. 安装开发工具Latex 安装教程 1. 下载texlive.iso https://mirrors.tuna.tsinghua.edu.cn/ctan/systems/texlive/Images/ 2. 点击装载 下载完成后&#x…

【博客580】内核如何决定数据包的源ip

内核如何决定数据包的源ip 1、Traversing of packets Receive&#xff1a; 某个interface收到数据包 -> PREROUTING (manage, nat) -> routing -> 是发送给本机的数据包? -> INPUT (manage, filter) -> app 不是 -> FORWARD (manage, filter) -> POST…

《Dubbo源码剖析与实战》学习笔记 Day1

流量控制 为了系统的健壮性和稳定性考虑&#xff0c;通常要对访问进行有效的控制&#xff0c;防止流量突然暴增&#xff0c;引发一系列服务雪崩效应。 1.单机限流 大概逻辑就是把每个请求当作一个小朋友&#xff0c;把最细粒度Dubbo服务中的方法当作游乐场&#xff0c;每个方…

Go第 12 章 :1-家庭收支记账软件项目

Go第 12 章 &#xff1a;1-家庭收支记账软件项目 12.1 项目开发流程说明 12.2 项目需求说明 模拟实现基于文本界面的《家庭记账软件》该软件能够记录家庭的收入、支出&#xff0c;并能够打印收支明细表 12.3 项目的界面 12.4 项目代码实现 12.4.1 实现基本功能(先使用面向过…

Windows 10/11 中的快速录屏的 5 种方法

在当今世界&#xff0c;出于各种原因&#xff0c;人们更喜欢录制他们的 PC 屏幕。录制计算机屏幕的功能对于在线学习、录制在线会议的特定亮点或帮助您制作抖音视频至关重要。不管是什么原因&#xff0c;屏幕录制让许多人的生活更轻松。截屏是有效的&#xff0c;但录制有助于您…

聚簇索引,二级索引,MRR,联合索引和自适应哈希索引-详细总结

目录 聚簇索引&#xff0c;二级索引&#xff0c;MRR&#xff0c;联合索引和自适应哈希索引-详细总结 聚簇索引 定义&#xff1a; 问题&#xff1a;为什么不采用B树作为MySQL表数据底层的存储数据结构&#xff1f; 作图&#xff1a; 问题&#xff1a;如果数据库表没有设置…