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;// 设置属性 addrprivate 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.hqwc.cn/news/499242.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go开发 入门以VSCode为例

一、Go环境搭建 1.1 安装 进入Golang官网 https://go.dev,点击 Download 若无法打开网页可以使用国内的Go语言中文网 https://studygolang.com/dl 进入下载 找到合适的平台点击链接下载即可(这里以Windows距离) 下载完成后 Next Next 安…

js 对象总结

文章目录 1、创建对象的6种方式总结一、new 操作符 Object 创建对象二、字面式创建对象 2、js 如何判断对象是否为空3、获取对象长度4、js 遍历对象的 5 种方法1、for … in2、Object.keys(obj)3、Object.values(obj)4、Object.getOwnPropertyNames(obj)5、使用Reflect.ownKey…

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

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

VirtualBox虚拟机安装 Linux 系统

要想学习各种计算机技术,自然离不开Linux系统。并且目前大多数生产系统都是安装在Linux系统上。常用的Linux系统有 Redhat,Centos,OracleLinux 三种。 三者的区别简单说明如下: Red Hat Enterprise Linux (RHEL): RHEL 是由美国…

InnoDB锁介绍

本文主要介绍MySQL InnoDB引擎中的各种锁策略和锁类别,并针对记录锁做演示以便于理解。 以下内容适用于MySQL 8.0版本。 读写锁 处理并发读/写访问的系统通常实现一个由两种锁类型组成的锁系统。这两种锁通常被称为共享锁(shared lock)和排他锁(exclusive lock)&…

如何在Window系统部署BUG管理软件并结合内网穿透实现远程管理本地BUG

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

【数据分享】2001-2022年我国省市县镇四级的逐日平均降水量数据(免费获取\excel\shp格式)

降水数据是我们在各项研究中最常用的气象指标之一!之前我们给大家分享过来源于国家青藏高原科学数据中心发布的1961—2022年全国范围的逐日降水栅格数据(可查看之前的文章获悉详情)! 本次我们分享的是2001-2002年我国省市县镇四个…

Linux零基础快速入门

Linux的诞生 Linux创始人:林纳斯 托瓦兹 Linux 诞生于1991年,作者上大学期间 因为创始人在上大学期间经常需要浏览新闻和处理邮件,发现现有的操作系统不好用,于是他决心自己写一个保护模式下的操作系统,这就是Linux的原型,当时他…

方格分割644--2017蓝桥杯

1.用dfs解决,首先这题的方格图形就很像一个走迷宫的类型,迷宫想到dfs,最中心点视为起点,起点有两个小人在这个方格里面对称行动,直到走出迷宫(一个人走出来了另一个人就也走出来了,而走过的点会…

【力扣白嫖日记】550.游戏玩法分析IV

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 550.游戏玩法分析IV 表:Activity 列名类型player_idintdevice_idintevent_datedategames_played…

Python 从文件中读取JSON 数据并解析转存

文章目录 文章开篇Json简介Json数据类型Json硬性规则Json数据转化网站Json和Dict类型转换json模块的使用Python数据和Json数据的类型映射json.dumps1.字典数据中含有**存在中文**2.json数据通过缩进符**美观输出**3.对Python数据类型中键进行**排序输出**4.json数据**分隔符的控…

Python调用ChatGPT API使用国内中转key 修改接口教程

大家好,我是淘小白~ 有的客户使用4.0的apikey ,直接使用官方直连的apikey消费很高,有一位客户一个月要消费2万,想使用4.0中转的apikey,使用中转的apikey 需要修改官方的openai库,下面具体说下。 1、首先确保安装的op…