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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值