day08_面向对象_封装_继承_this_super_访问修饰符

news2024/9/23 23:30:19

今日内容

1.作业
2.封装
3.继承
4.this和super
5.访问修饰符

零、复习

成员变量和局部变量(画表格)

this的作用

  • this是当前对象,当前方法的调用者
  • this可以调用属性和方法
  • this.属性, this.方法名(),this()

构造方法的作用和语法特征

  • 作用: 创建对象,属性初始化
  • 特征: 没有返回值,没有void,方法名是类名

有参无参构造的区别

  • 无参创建出的对象属性是默认值
  • 有参创建出的对象属性是指定值

重载的语法要求

  • 在同一类中,方法名,参数列表不一样

一、作业

1.1 关于引用类型的题目

pdf5,t4,5,9,14 都是

解题思路
* 1 方法执行进栈,执行完弹栈
* 2 凡是new都会在堆中创建对象
* 3 基本数据类型,赋值是直接将数据复制一份传递
*   引用数据类型(数组,类,接口),赋值是将地址值赋值一份传递
* 4 成员变量在堆中(在堆中的对象中)
*   局部变量在栈中(在栈中的方法中)
----------------------
多画内存图,多读代码

1.2 类中定义类属性

有工人(Worker)类,有地址(Address)类

工人类中定义属性addr,该属性是Address类型的
工人类中定义属性age,该属性是int类型

public class Worker {

    /**
     * 属性,就是变量
     * 数据类型 变量名;
     * 基本数据类型/引用数据类型
     */
    String name;
    int age;
    double salary;// 薪水
    Address addr; // Address属性
    //....
}
    
public class TestWorker {

    public static void main(String[] args) {
        // 创建一个Worker 对象,其姓名为"zhangsan",年龄为25,工资为2500,
        // 家庭住址为“北京市海淀区清华园1 号”,邮政编码为100084。

        Worker worker = new Worker( );
        System.out.println(worker.age);// 0
        System.out.println(worker.salary);// 0.0
        System.out.println(worker.name);// null
        System.out.println(worker.addr);// null

        worker.age = 25;
        worker.salary =2500;
        worker.name = "张三";
        /**
         * NullPointerException
         * 空指针异常
         * 指针就是引用
         * 空指针即空引用,空对象
         * ------------------
         * 凡是空指针异常,就是在拿着一个空对象在调用属性或者方法
         */
        // worker.addr.address = "航海路60号";
        worker.addr = new Address(  );
        worker.addr.address = "航海路60号";
        worker.addr.zipCode = "450000";

        System.out.println(worker.name );
        System.out.println(worker.age );
        System.out.println(worker.salary );
        System.out.println(worker.addr.address );
        System.out.println(worker.addr.zipCode);
    }

}

image-20231018100730733

练习题

  • 部门类(Dept)

    • 属性 部门编号,部门名称
  • 员工类(Emp)

    • 属性 姓名,工号,职位
  • 部门类中设置属性emp,属性为Emp

  • 创建部门类对象,给每个属性赋值

二、封装

在这之前,学习的

  • 类,属性,方法
  • 创建对象
  • 内存关系
  • 构造方法
  • 引用类型的理解

都是面向对象的基础知识


面向对象的核心

  • 封装
  • 继承
  • 多态

2.1 封装

封装: 就是将代码封装起来,方便使用

比如: 快递包裹,手机,电脑

作用: 将一些实现的动作隐藏起来,只需要关心如何使用


封装可以分为

  • 方法的封装
  • 属性的封装
  • 类的封装(多个类,组成一个庞大系统)

2.2 属性的封装

为什么要封装属性? 因为现在是直接通过对象操作属性,这样不安全

怎么封装?

  • 属性私有化,设置private修饰符
  • 设计方法
    • setXxx 给属性赋值
    • getXxx 取出属性值

重要: 以后写项目,工作中属性封装都是固定格式(属性私有,setget方法)

  • 给属性赋值的方法名 必须叫set,后面必须跟属性名,例如 setAge
  • 获得属性值的方法名,必须叫get,后面必须跟属性名,例如 getAge
 /* @desc  属性封装演示
 */
public class Phone {

    /**
     * 属性就是变量,
     * 特殊的是前面可以使用修饰符,例如public
     * 现在属性要封装,就要将其私有,就是写private
     */
    private String brand;// 品牌
    private double price;

    /**
     * 设计方法对属性封装,封装成方法
     * 有了方法后就可以对属性做一些操作
     */
    // setXxx给属性赋值
    public void setPrice(double price) {
        if (price >= 0) {
            this.price = price;
        } else {
            System.out.println("价格有误!" );
        }
    }

    // getXxx用于取出属性值
    public double getPrice(){
        return price;
    }

    public void setBrand(String brand){
        this.brand = brand;
    }

    public String getBrand(){
        return brand;
    }
}

// 测试

public class TestPhone {
    public static void main(String[] args) {
        // 创建对象
        Phone phone = new Phone( );
        // 属性赋值
        // phone.price = -3999;
        // 属性私有了,不能再直接通过对象调用

        // 调用set方法给属性赋值
        phone.setPrice(3999);
        // 调用get方法获得属性值
        double price = phone.getPrice( );
        System.out.println(price );
    }
}

三、继承【重点】

3.1 继承

什么是继承? 子级(子类) 从父级(父类) 获得它们的东西(属性,方法)

为什么需要继承?

  • 将多个类重复代码向上抽取到父类,子类复用
  • 继承是多态的前提

代码写继承? class A extends B ,就是继承,读作A类继承B类,A是子类,B是父类

// 父类
public class Animal {
    int age;
    String  name;

    public void eat(){
        System.out.println("吃 " );
    }
}
// 子类Dog继承Animal
 /* @desc 狗类继承Animal动物类
 * 狗类是子类
 * 动物是父类
 */
public class Dog extends Animal{// 继承
}
// 测试
public class TestExtends {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();// 调用父类中的方法
        System.out.println(dog.age );// 调用的是父类中的属性
    }
}

3.2 继承特点

java中类只能单继承,即一个类只能继承一个类,不能出现两个父类

image-20231018150735648

支持层次继承(多级继承)

image-20231018151218193

子类继承父类**,可以使用父类非私有修饰的属性和方法**

image-20231018151845476

3.3 继承中的属性

  • 子类继承父类只能使用父类非私有属性
  • 特殊的,某一个属性,父类中 子类中都有,子类默认使用自己的属性

3.4 继承中的方法

  • 子类继承父类,只能使用父类中非私有的方法
  • 特殊的,某一个方法,父类中 子类中都有,子类默认使用自己的方法
    • 这就是方法的重写(Override)

3.5 方法重写

方法重写又叫方法覆盖,方法覆写

什么是重写? 在继承中,子类重写了父类方法(子类和父类方法签名一样,但是方法体不一样)

为什么需要重写?

  • 继承的目的是为了使用父类的属性和方法
  • 但是有些时候子类在使用父类方法时,不适用于自己,所以需要重写
  • 这也是多态前提

如何写?

  • 子类继承父类
  • 子类中写一个与父类方法
    • 访问修饰符一样
    • 返回值类型一样
    • 方法名一样
    • 参数列表一样
    • 方法体不一样
  • 的方法就是重写

image-20231018160019297

3.6 继承中的构造方法

在创建子类时会先创建父类对象

调用子类构造方法创建子类对象时,会 调用父类构造方法创建父类对象

  • 机制: 每个类的每个构造方法第一行都隐藏了一个super()在调用父类无参构造

创建对象的过程

  • 调用子类构造方法创建对象
  • 先父类属性初始化
  • 再执行父类构造方法内代码
  • 后再子类属性初始化
  • 最后再子类构造方法内代码执行

总结:

  • 整体是有父类先执行父类,后子类
  • 具体到类中,先初始化属性再执行构造方法

四、this和super

thissuper
代表代表当前类对象代表父类对象
调用属性this.属性(子类属性,子类没有也会调用父类属性)super.属性(父类属性)
调用方法this.方法()(子类方法,子类没有也会调用父类方法)super.方法()(父类方法)
构造方法this() 调用自己无参构造
this(参数) 调用自己有参构造
super() 调用父类无参构造
super(参数) 调用父类有参构造

ps: 调用构造方法的语句必须放在构造方法内的第一行

五、单词

private 私有
extends 继承
super 父
sub 子

六、总结

封装: 
	属性私有
	提供setget方法
	固定写法,可以生产
继承:
	注意继承中特性(属性,方法,构造)
重写的知识(知道语法)
this和super知识(知道怎么用)

作业

不用重复代码,应该按照笔记中写的特性,自己建类实现这些特性
重写和重载总结表格
写两道关于继承的题(很重要)pdf6-t19,t24

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

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

相关文章

数据结构和算法(13):优先级队列

概述 按照事先约定的优先级,可以始终高效查找并访问优先级最高数据项的数据结构,也统称作优先级队列 优先级队列将操作对象限定于当前的全局极值者。 根据数据对象之间相对优先级对其进行访问的方式,与此前的访问方式有着本质区别&#xf…

PostgreSQL与MySQL数据库对比:适用场景和选择指南

数据库是现代应用程序的基石之一,而在选择合适的数据库管理系统(DBMS)时,开发者常常会面临着许多选择。在这方面,PostgreSQL和MySQL是两个备受瞩目的选项。本文将深入研究这两者之间的异同,并为您提供适用场…

疯狂星期四的营销策略是什么?如何复制?

你知道疯狂星期四吗?它的策略是什么?如何对标它写一个类似的方案呢? 1、消费者心理 KFC疯狂星期四的核心目标消费者是对价格敏感的年轻人和家庭消费者。他们寻求物有所值的美食体验,希望在合理的价格范围内享受到美味的食物。通过…

Unity之ShaderGraph如何实现UV抖动

前言 今天我们通过噪波图来实现一个UV抖动的效果。 如下图所示: 关键节点 Time:提供对着色器中各种时间参数的访问 UV:提供对网格顶点或片段的UV坐标的访问。可以使用通道下拉参数选择输出值的坐标通道。 SimpleNoise:根据…

论文导读 | 支持事务与图分析的图存储系统

事务系统保证了系统的数据一致性,确保事务更新的原子性或是不同事务之间的数据隔离性等在多线程并发环境下所必不可少的ACID特性。而在今天快速变化的商业环境下,诸如物流和供应链,金融风控和欺诈检测等场景都需要图分析系统提供对数据动态更…

Node.js在Python中的应用实例解析

随着互联网的发展,数据爬取成为了获取信息的重要手段。本文将以豆瓣网为案例,通过技术问答的方式,介绍如何使用Node.js在Python中实现数据爬取,并提供详细的实现代码过程。 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境…

SEAL:RLWE-BFV 开源算法库

参考文献: GitHub - microsoft/SEAL: Microsoft SEAL is an easy-to-use and powerful homomorphic encryption library.[HS13] Halevi S, Shoup V. Design and implementation of a homomorphic-encryption library[J]. IBM Research (Manuscript), 2013, 6(12-15…

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition)&#x…

【python零基础入门学习】python进阶篇之OOP - 面向对象的程序设计

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

MS5248数模转换器可pin对pin兼容AD5648

MS5228/5248/5268 是一款 12/14/16bit 八通道输出的电压型 DAC,内部集成上电复位电路、可选内部基准、接口采用四线串口模式,最高工作频率可以到 40MHz,可以兼容 SPI、QSPI、DSP 接口和 Microwire 串口。可pin对pin兼容AD5648。输出接到一个 …

潮玩IP助力环境保护,泡泡玛特发布行业首款碳中和产品

在今年的2023上海PTS国际潮流玩具展上,泡泡玛特正式发布了首款“碳中和”潮玩产品DIMOO X蒙新河狸手办(下简称DIMOO河狸),通过环保主题与流行文化的联合,让年轻人知道野生动物保护有多种方式,同时以创新的设…

Crypto(3)NewStarCTF 2023 公开赛道 WEEK2|Crypto-不止一个pi

题目代码 from flag import flag from Crypto.Util.number import * import gmpy2 p getPrime(1024) #这行生成一个大约1024位长度的随机素数,并将其赋给变量p。 q getPrime(1024) #类似地,这行生成另一个大约1024位长度的随机素数,并将其…

Fortinet详解如何量化网安价值,把握网安态势

网络安全价值量化是企业准确把握自身网络安全态势的前提,也是网络安全管理人员持续推动工作的有力支撑。网络安全行业发展迅速,其价值量化也在不断地演进,如何进行量化则一直都是企业和网络安全管理人员的挑战。近期,Fortinet 委托…

【视觉算法系列2】在自定义数据集上训练 YOLO NAS(上篇)

提示:免费获取本文涉及的完整代码与数据集,请添加微信peaeci122 YOLO-NAS是目前最新的YOLO目标检测模型,它在准确性方面击败了所有其他 YOLO 模型。与之前的 YOLO 模型相比,预训练的 YOLO-NAS 模型能够以更高的准确度检测更多目标…

【三】kubernetes kuboard部署分布式系统

#服务器 #部署 #云原生 #k8s 目录 一、前言二、搭建docker私有仓库三、系统搭建1、NFS部署1)部署nfs server (192.168.16.200)2)部署nfs client (全部节点)3)在Kuboard中创建 NFS 存储类 2、创建命名空间3、添加docker密文4、创建…

Nginx 配置文件解读

一.配置文件解读 nginx配置文件主要分为四个部分: main{ #(全局设置)http{ #服务器配置upstream{} #(负载均衡服务器设置)server{ #(主机设置:主要用于指定主机和端口)location{} …

Flink学习之旅:(三)Flink源算子(数据源)

1.Flink数据源 Flink可以从各种数据源获取数据,然后构建DataStream 进行处理转换。source就是整个数据处理程序的输入端。 数据集合数据文件Socket数据kafka数据自定义Source 2.案例 2.1.从集合中获取数据 创建 FlinkSource_List 类,再创建个 Student 类…

5256C 5G终端综合测试仪

01 5256C 5G终端综合测试仪 产品综述: 5256C 5G终端综合测试仪主要用于5G终端、基带芯片的研发、生产、校准、检测、认证和教学等领域。该仪表具备5G信号发送功能、5G信号功率特性、解调特性和频谱特性分析功能,支持5G终端的产线高速校准及终端发射机…

Dev-C++ 软件安装教程

Dev-C 软件安装包https://download.csdn.net/download/W_Fe5/88446511(软件包下载后,右键解压) 一、打开文件夹,双击“Dev-C” 二、软件安装,点击“OK” 三、点击“I Agree” 四、点击“Next” 五、更改安装目录&…

虚拟机ubantu系统突然重启失去网络

1.进入 root用户 cd /var/lib/NetworkManager然后查看网络服务状态 如果网络状态和我一样不可用 ,就先停止网络服务 service ModemManager stop#删除状态rm networker.stateservice ModemManager start