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

今日内容

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

零、 复习昨日

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.mfbz.cn/a/417110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spade CNN技术细节

Input: (1,3,256,64,128) 做downsample 成 : (1,3,8,16,32) 首先有一个 EqualConv3D(3,128,3,3,stride1,padding1) 对 input 进行卷积得到: (1,128,8,16,32) input channel: 3 output channel: 128 EqualConv3D 就是一个普通的3D CNN, 只是 用到了 equ…

如何使用Docker部署IT-Tools并结合内网穿透实现公网访问本地工具箱服务

作为程序员,在日常工作中,需要借助一些工具来提高我们工作效率,IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能,使开发者能以更高效方式完成任务。经由IT-Tools,开发人员能轻松应对各类技术挑战&…

Rocky Linux 运维工具 ls

一、ls 的简介 ​​ls​ 用于列出当前目录下的文件和目录,以及它们的属性信息。通过 ​ls​命令可以查看文件名、文件大小、创建时间等信息,并方便用户浏览和管理文件。 二、ls 的参数说明 序号参数描述1-a显示所有文件,包括以 ​.​开头的…

C# OpenVINO Nail Seg 指甲分割 指甲检测

目录 效果 模型信息 项目 代码 数据集 下载 C# OpenVINO Nail Seg 指甲分割 指甲检测 效果 模型信息 Model Properties ------------------------- date:2024-02-29T16:41:28.273760 author:Ultralytics task:segment version&#…

msys2使用MinGW64编译ffmpeg 64bit库

搭建编译环境 下载安装msys2,参考文章《QT Mingw编译ffmpeg源码以及测试》。 安装必要的库文件 双击msys2安装目录下的msys2.exe,在cmd窗口中执行以下命令: //升级所有库 pacman -Syu //使用下列命令安装ffmpeg编译的依赖和工具 pacman -S mingw-w64-x8…

插值、逼近、拟合、光顺

插值 插值(Interpolation)是数学和计算科学中的一个重要概念,它指的是通过已知的一系列数据点,构造一个函数或曲线,并据此估计未知数据点的值。这个过程通常发生在已知数据点之间,用于预测或估算在这些已知…

操作系统系列学习——系统调用的实现

文章目录 前言系统调用的实现 前言 一个本硕双非的小菜鸡,备战24年秋招,计划学习操作系统并完成6.0S81,加油! 本文总结自B站【哈工大】操作系统 李治军(全32讲) 老师课程讲的非常好,感谢 【哈工…

【飞桨EasyDL】飞桨EasyDL发布的模型转换onnx(附工程代码)

一个愿意伫立在巨人肩膀上的农民...... 一、paddle转onnx转rknn环境搭建 paddle转onnx和onnx转rknn两个环境可以分开搭建,也可以搭建在一起。这里选择分开搭建,先搭建paddle转onnx。 1.1、创建环境 选择python3.8.13包进行创建环境 conda create --nam…

事物管理(黑马学习笔记)

事物回顾 在数据库阶段我们已学习过事务了,我们讲到: 事物是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时…

经典DP-最长单调子序列

最长递增子序列 思路 定义状态: 我们定义一个数组 dp,其中 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。初始化状态: 对于数组中的每个元素 nums[i],初始时都可以被视为一个长度为1的递增子序列,因此 dp[i] 的…

Mac电脑输入正确密码后提示密码错误

🏝 背景 Mac Pro 在擦键盘时,屏幕一直亮起,导致密码一致输入错误,想来没有什么问题便没有处理。但是!!!在擦完键盘后输入正确的密码依旧提示密码错误😱 接下来就是不断的重启、关机…

如何制作一款建材商城微信小程序

现在,微信小程序已经成为了很多企业和商家开展线上业务的重要渠道之一。对于建材商城而言,制作一款专属的微信小程序可以帮助企业更好地展示产品、提供服务,并增加销售额。下面将介绍如何制作一款建材商城微信小程序。 首先,登录【…

ai作画在线生成!这8个AI生图工具一定要知道。

过去的2023年被称作AI元年,随之而来的2024,被业内人士称之为AI应用元年,即随着大模型和各类AI应用的涌现速度放缓,人们关注的焦点也从产品层面(有哪些好用的AI应用),转移到AI如何更好地赋能实际…

如何下载和配置Linux(使用VMware部署Centos)--看这篇文章就懂了

目录: LinuxLinux概述Linux特点Linux的各个发行版本Linux和Windows区别 Linux的下载和安装安装VMWare虚拟机和Centos安装Centos实现Linux的远程登录使用Xshell连接 Linux Linux概述 Linux内核最初只是由芬兰人林纳斯托瓦兹1991年在赫尔辛基大学上学时出于个人爱好而编写的。 …

会声会影2024出来了吗?

近年来,随着人们对于娱乐和创意的需求不断增长,视频编辑软件也越来越受到大众的关注。其中,会声会影是一款备受欢迎的视频编辑软件,许多用户都在关注其新版本——会声会影2024。 然而,目前并没有官方宣布会声会影2024的…

一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人

一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人 前言一、Deepfakes技术原理卷积神经网络(CNN):细致的艺术学徒生成对抗网络(GAN):画家与评审的双重角色…

车载电子电器架构 —— 车辆模式管理

车载电子电器架构 —— 车辆模式管理 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的…

Python算法题集_组合总和

Python算法题集_组合总和 题39:组合总和1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【值传递回溯】2) 改进版一【引用传递堆栈回溯】3) 改进版二【过程值列表缓存遍历后检索】 4. 最优算法5. 相关资源 本文为Python算法题集之一的…

JVM运行流程

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:JavaEE 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 JVM 1. 运行流程2. 运行时数据区2.1 堆&am…

【精品】集合list去重

示例一&#xff1a;对于简单类型&#xff0c;比如String public static void main(String[] args) {List<String> list new ArrayList< >();list.add("aaa");list.add("bbb");list.add("bbb");list.add("ccc");list.add(…
最新文章