day09_面向对象_构造方法_封装

news2024/11/18 3:21:00

今日内容

零、 复习昨日
一、构造方法
二、重载
三、封装

零、 复习昨日

1 类和对象是什么关系?

  • 类是模板(原材料)
  • 对象是具体实例(成品)
  • 类创建出对象

2 类中有什么?(类的成员)

  • 成员属性(成员变量), 成员方法

3 创建对象的语法?

  • 类名 对象名 = new 类名();

4 调用对象属性,方法的语法

  • 对象名.属性
  • 对象名.方法()

5 成员变量和局部变量的区别

  • 位置: 成员变量在方法外,局部变量方法内
  • 内存位置: 成员变量堆中对象里面,局部变量在栈中方法内

6 画创建一个对象的内存图

7 类可不可以创建多个对象呢?

  • 可以,对象之间没有关系
  • 每个对象都有属于自己属性方法

8 this是什么?

  • this就是当前类对象

一、构造方法

1.1 无参构造

构造方法又叫构造器,构造函数单词 constructor

  • 构造方法就是用来创建对象的

  • 每个类中都有构造方法,但是默认隐藏的

  • 语法

    public 类名(){
    }
    
    • 构造方法没有返回值,也不需要定义返回值类型,连void也没有
    • 构造方法的方法名只能是当前类类名
    • 只能通过new来调用
  • 构造方法作用

    • 通过调用构造方法,可以在堆中创建对象
    • 属性,方法初始化

// 类定义中可以写出无参构造

public class Student {

    String name;
    int age;

    /**
     * 构造方法,默认不显示
     * 构造方法作用
     * - 通过调用构造方法,可以在堆中创建对象
     * - 属性,方法初始化
     */
    public Student(){
        System.out.println("Student()执行了" );
    }

    public void study(){
        System.out.println(name+"在学习" );
    }
}

// 通过无参构造创建对象

package com.qf.oop;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/2/29
 * @desc
 */
public class TestOOP1 {

    public static void main(String[] args) {
        // 创建对象
        // 类名 对象名 = new 类名();
        // 类名 对象名 = new 构造方法();
        Student student = new Student();
        // student就是通过构造方法创建出的对象,属性就会初始化
    }
}

无参构造创建出的对象,属性默认值是什么?

  • 对应数据类型的默认值

思考: 通过无参构造创建出的对象属性都是默认值,使用时还需要单独给属性赋值,然后才可以有具体效果! 能不能有一种方式,创建出对象后 属性直接就有值呢?

  • 有!! 通过有参构造创建对象!

1.2 有参构造

有参构造就是给构造方法设计参数,调用构造方法时,传入参数给属性赋值

作用就是: 创建出的对象有指定属性值,而不是默认值

public 类名(数据类型 变量名,...){
    this.成员属性 = 变量;
}

// 定义有参构造

public class Student {

    String name;
    int age;

    /**
     * 构造方法,默认不显示
     * 构造方法作用
     * - 通过调用构造方法,可以在堆中创建对象
     * - 属性,方法初始化
     */
    public Student(){
        System.out.println("Student()执行了" );
    }

    // 有参数的构造方法
    public Student(String name,int age){
        this.name = name; // 因为成员变量和局部变量重名,用this来调用成员变量
        this.age = age;
        System.out.println("Student(String,int)" );
    }

    public void study(){
        System.out.println(name+"在学习" );
    }

}

// 调用有参构造创建对象

public static void main(String[] args) {
        // 创建对象
        // 类名 对象名 = new 类名();
        // 类名 对象名 = new 构造方法();
        Student student = new Student();
        student.name = "老王";
        student.study();

        System.out.println("-------------" );
        // 使用有参构造创建对象
        Student student2 = new Student("老李",38);// 调用时给参数赋值
        student2.study();
        // student2对象创建出后,属性就有值

    }

image-20240229101055210

1.3 总结

语法总结

  • 每个类都默认提供无参构造方法
  • 但是类中只要写出任何一个构造方法,默认不再提供

使用总结

  • 无论无参构造还是有参构造,都是创建对象的
  • 无参构造*创建出的对象的属性是默认值(空值)
  • 有参构造创建出的对象,属性直接就有值
  • 以后建议定义类时候,给出类的有参和无参构造方法

1.4 练习

pdf5

通过构造方法创建对象,

  • 先属性初始化
  • 再执行构造方法内部代码

二、重载

重载是指类中方法的重载(Overload),语法要求

  • 方法名一样,参数列表不一样(类型,个数,顺序任意不一样都行)
    • 重载和返回值没有关系
  • 作用: 就是方便使用,会根据传入的参数自己确定执行哪个方法
    public static void main(String[] args) {
        /**
         * println()方法就是重载,源码中有多个重名但是参数不同的方法
         * 作用: 方便调用
         * 会根据传入的参数自己确定执行哪个方法
         */
        System.out.println( );
        System.out.println(1);
        System.out.println(1.1);
        System.out.println(true);
        System.out.println("字符串");
        System.out.println(new Student(  ) );

        System.out.println("-----------" );
        /**
         * 这几个构造方法,自己定义了重载的构造
         * 方便调用,无论怎么传参数都可以创建对象
         */
        Student s1 = new Student( );
        Student s2 = new Student(18);
        Student s3 = new Student("校长");
        Student s4 = new Student("小张", 18);
    }

image-20240229150959987

练习pdf5,T1,T2

三、封装

面向对象编程: 封装,继承,多态

3.1 封装介绍

封装,就是打包,代码中将代码封装起来,比如

  • 方法的封装
  • 类的封装

封装什么作用?

  • 隐藏一些实现的细节
  • 只管使用就行

3.2 类的封装

完整的类的封装步骤

  • 属性私有,设置private修饰符
  • 提供setXxx,getXxx方法

强调: set,get方法是固定写法,一定是set,get后是属性名大写

package com.qf.oop;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/2/29
 * @desc
 */
public class Phone {

    /**
     * 封装,需要将属性藏起来
     * 即私有化,也就是给属性设置私有的修饰符
     */
    private String brand;// 品牌
    private double price;// 价格

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

    public String getBrand() {
        return brand;
    }

    // set方法给属性赋值的
    public void setPrice(double price){
        if (price > 0) {
            this.price = price;
        } else {
            System.out.println("设置价格有误!" );
        }
    }

    // get方法是获得属性值
    public double getPrice(){
        return price;
    }

    public void play(){
        System.out.println(brand+"手机,价格"+price+"元,在打游戏" );
    }
}

练习: 定义狗类,属性 int age, String color, String name,要求属性封装,提供有参无参构造

public class Dog{
    // 属性私有
    private int age;
    private String color;
    private String name;
    
    // 构造方法
    public Dog(){}
    public Dog(int age,String color,String name){
        this.age = age;
        this.color = color;
        this.name = name;
    }
    // setget方法
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setColor(String color){
        this.color = color;
    }
    public String getColor(){
        return color;
    }
}

四、实战

类中定义其他类的属性的写法

定义工人类

image-20240229170750598

定义地址类

image-20240229170808241

要求:

为的Worker 类添加一个属性addr,该属性为 Address 类型。 创建一个Worker 对象,其姓名为"zhangsan",年龄为25,工资为2500,家庭住 址为“北京市海淀区清华园1 号”,邮政编码为100084。

// 工人(Worker)类,其中定义的有地址(Address)类属性

package com.qf.pdf.pdf5t13;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/2/29
 * @desc
 * 数据类型
 *  -基本
 *  -引用(数组,类,接口)
 */
public class Worker {

    // 属性
    private String name;
    private int age;
    private double salary;

    // 设置属性 addr
    private Address addr;

    public Worker() {
    }

    public Worker(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }


    public void setAddr(Address addr){
        this.addr = addr;
    }

    public Address getAddr(){
        return addr;
    }

    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;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    // 普通方法
    public void work(){
        System.out.println(name+"在工作" );
    }
    public void work(int hours){
        System.out.println(name+"在工作"+hours+"小时" );
    }
}

// Address类

package com.qf.pdf.pdf5t13;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/2/29
 * @desc
 */
public class Address {
    private String address; // 住址
    private int zipCode;// 邮编

    public Address() {
    }

    public Address(String address, int zipCode) {
        this.address = address;
        this.zipCode = zipCode;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getZipCode() {
        return zipCode;
    }

    public void setZipCode(int zipCode) {
        this.zipCode = zipCode;
    }
}

// 测试

package com.qf.pdf.pdf5t13;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/2/29
 * @desc
 */
public class TestWorker {

    public static void main(String[] args) {
        // 创建Worker类对象
        Worker worker = new Worker( );
        worker.setName("zhangsan");
        worker.setAge(25);
        worker.setSalary(2500);

        // 创建Address对象
        Address address = new Address( );
        address.setAddress("郑州二七区航海路60号");
        address.setZipCode(4500000);
        // 给工人类的addr属性赋值,赋值的是Address类对象
        worker.setAddr(address);

        // 输出工人的所有信息
        System.out.println("工人姓名:" + worker.getName() );
        System.out.println("工人年龄:" + worker.getAge() );
        System.out.println("工人工资:" + worker.getSalary() );
        // 这个输出的是Address的对象地址
        System.out.println("工人地址:" + worker.getAddr() );
        // worker.getAddr()是获得工人类中的Address对象,
        // 再通过Address对象调用getAddress()方法获得住址属性
        System.out.println("工人住址:" + worker.getAddr().getAddress() );
        System.out.println("住址邮编:" + worker.getAddr().getZipCode() );
    }
}

// 内存关系

image-20240229171018272

五、总结

构造方法:

  • 创建对象,输出初始化的
  • 无参构造创建对象,属性默认值
  • 有参构造创建对象,属性指定值

重载:

  • 方法名一样,参数不一样
  • 方便调用的

封装:

  • 属性私有private,提供set get方法
  • 固定格式,以后实体类都这么写

重点: 最后那个练习题的写法很重要!!!

idea情况缓存重启

image-20240229094010868

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

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

相关文章

音频筑基:CD还是HiRes?高清音频分类一文说透

音频筑基:CD还是HiRes?高清音频分类一文说透 前言音乐品质分类相关资料 前言 音频信号中,经常遇到高清音乐、无损音质、CD、HiRes等说法,本文主要在纯数字信号级别,从音源分类和编码质量两个维度,做一个分析…

[AutoSar]BSW_Com06 CAN报文应用层到Can总线的函数调用

目录 关键词平台说明一、背景二、PDU转换三、函数调用 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector ,芯片厂商TI 英飞凌编程语言C,C编译器HighTec (GCC)autosar版本4.3.X >>>>>回到总目…

《商用密码应用安全性评估管理办法》解读

根据《中华人民共和国密码法》(以下简称《密码法》)、《商用密码管理条例》(以下简称《条例》)等法律法规,国家密码管理局研究制定了《商用密码应用安全性评估管理办法》(国家密码管理局令第3号&#xff09…

Vue页面更新后刷新页面不会渲染解决

小编今天犯了个很低级的错误,导致VUE页面刷新样式不会更新的问题! 解决方法:查看你的路由路径大小写是否正确!小编是犯了这种错误,特此分享下!

Vite 构建的 Vue3 项目如何整合 Monaco Editor 代码编辑器

目录 🦁 一. 前言🦁 二. 探索过程2.1 安装2.2 配置 Monaco Editor2.3 编写 Monaco Editor 代码编辑器2.3.1 创建 Coding Editor 组件2.3.2 父组件使用 CodingEditor 组件 2.4 效果展示 三. 总结 🦁 一. 前言 各位好!我是&#x1…

Unity 预制体与变体

预制体作用: 更改预制体,则更改全部的以预制体复制出的模型。 生成预制体: 当你建立好了一个模型,从层级拖动到项目中即可生成预制体。 预制体复制模型: 将项目中的预制体拖动到层级中即可复制。或者选择物体复制粘贴。…

2024年2月总结及随笔之平平安安过大年

1. 回头看 日更坚持了425天。 读《千脑智能》开更并更新完成 读《十堂极简人工智能课》开更并更新完成 读《人工不智能:计算机如何误解世界》开更并持续更新中 2023年至2024年2月底累计码字898882字,累计日均码字2115字。 2024年2月码字84475字&am…

【机器学习:Recommendation System】推荐系统

推荐系统(或推荐系统)是一类机器学习,它使用数据来帮助预测、缩小范围并在呈指数级增长的选项中找到人们正在寻找的内容。 【机器学习:Recommendation System】推荐系统 什么是推荐系统?用例和应用电子商务与零售&…

基于springboot+vue的常规应急物资管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

动态规划|【路径问题】礼物的最大价值(LCR 166.珠宝的最高价值)

目录 题目 题目解析 思路 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 代码 题目 LCR 166. 珠宝的最高价值 (现在leetcode上面是这个题)这个题跟下面这个题叙述方式一样,就拿下面这个 题来讲解) 题目描述&…

基于语义解析的KBQA——代码和论文详细分析

根据论文:Semantic Parsing on Freebase from Question-Answer Pairs,分析其代码和步骤,以加强对这一流程的深入理解,重点关注模型的输入、输出和具体方法。 前言 提供阅读本文的前提知识,引用自Semantic Parsing on…

Python利用pandas对数据进行特定排序

更多Python学习内容:ipengtao.com 在数据分析和处理过程中,排序是一项常见而重要的操作。Python中的pandas库提供了丰富的功能,可以方便地对数据进行各种排序操作。本文将详细介绍如何利用pandas对数据进行特定排序,包括基本排序、…

ODOO12设置收发邮件服务器教程

一、设置-技术 二、设置–技术–发件服务器 信息填写完整后,点击‘测试连接’,若提示成功,则发件服务器设置成功。 三、设置–技术–收件服务器 四、设置–参数–系统参数 修改之前的email系统参数: mail.catchall.alias: 收件服…

vivo 在离线混部探索与实践

作者:来自 vivo 互联网服务器团队 本文根据甘青、黄荣杰老师在“2023 vivo开发者大会"现场演讲内容整理而成。 伴随 vivo 互联网业务的高速发展,数据中心的规模不断扩大,成本问题日益突出。在离线混部技术可以在保证服务质量的同时&…

在 Linux 环境下安装 Kibana

目录 一、Kibana 是什么 二、在 Linux 环境下安装 Kibana 1、下载安装包 2、解压 3、修改 Kibana的配置文件 config/kibana.yml 4、启动 5、浏览器登录 Kibana 6、测试查询 一、Kibana 是什么 Kibana 是通向 Elastic 产品集的窗口。 它可以在 Elasticsearch 中对数据进…

postman切换成黑色主题

postman安装以后默认是白色背景,如果想要切换成黑色的,大家可以按照下图箭头指示来操作。 1打开设置 2在Themes页面选择黑色主题

ElasticSearch之Completion Suggester

写在前面 通过completion suggester可以实现如下的效果: 其实就是做的like xxx%这种。通过FST这种数据结构来存储,实现快速的前缀匹配,并且可以将es所有的数据加载到内存中所以速度completion的查询速度非常快。 需要注意,如果…

Docker技术概论(2):Docker环境的搭建

Docker技术概论(2) Docker环境的搭建 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blo…

贪心算法(算法竞赛、蓝桥杯)--修理牛棚

1、B站视频链接&#xff1a;A27 贪心算法 P1209 [USACO1.3] 修理牛棚_哔哩哔哩_bilibili 题目链接&#xff1a;[USACO1.3] 修理牛棚 Barn Repair - 洛谷 #include <bits/stdc.h> using namespace std; const int N205; int m,s,c,ans; int a[N];//牛的位置标号 int d[N…

C/C++语言文字小游戏(荒岛求生)

游戏背景 玩家在荒岛上&#xff0c;需要寻找食物、水源、避难所等资源来生存。 玩家需要避免危险&#xff0c;如野兽、植物、天气等&#xff0c;否则会失去血量或生命。 玩家可以在荒岛上遇到其他生存者&#xff0c;可以选择合作或对抗。 游戏目标是生存一定时间或找到生存的出…