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

2024-03-01 22:44

本文主要是介绍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

这篇关于day09_面向对象_构造方法_封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/764079

相关文章

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

JavaWeb【day09】--(Mybatis)

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

【Day09】

目录 Mybatis-基础操作-环境准备 Mybatis-基础操作-删除 Mybatis-基础操作-删除(预编译SQL) Mybatis-基础操作-新增 Mybatis-基础操作-新增(主键返回) Mybatis-基础操作-更新 Mybatis-基础操作-查询(根据ID查询) Mybatis-基础操作-查询(条件查询) Mybatis-XML映射文件 Mybatis-动态S

chapter06 面向对象基础 知识点Note

文章目录 前言类的设计 属性和行为对象的内存解析 (堆 栈 方法区)类的成员之一 变量(属性) field类的成员之二 方法 method对象数组方法重载 overload可变个数的形参 语法糖方法的值传递机制递归关键字package importMVC设计模式import导入面向对象特征之一 封装类的成员之三 构造器JavaBeanUML类图 前言 ` 面向对象封装 面向

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈(虚拟机栈)中,每一个方法调用结束后,都会有一个栈帧被弹出。 每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide:Java内存区域详解(重点) 动态链接 动态链接:指向运行时常量池中该栈帧所属方法的引用。 多态 多态允许不同类的对象对同一消息做出响应,但表现出不同的行为(即方法的多样性)。 多态

Java封装构造方法

private/public的分装 被public修饰的成员变量或者是成员方法,可以被类的调用对象直接使用 而private修饰的成员变量和方法,不能被类的调用对象使用 例如: 可以看到我们是不能在main方法中直接调用被private修饰的变量 当然我们可以在我们定义的TestMode类中可以定一个方法show,然后在调用show方法实现 这里我们可以清楚了解 private 不光可以修