模块七 面向对象

回顾与重点

模块六回顾

  1. 方法概述:拥有功能性代码的代码块

    将来干开发一个功能就应该对应一个方法

  2. 方法的通用定义格式

    修饰符 返回值类型 方法名(参数) {
      方法体
       return 结果
    }
    

    a. 修饰符:public static

    b. 返回值类型:方法最终返回的结果的数据类型

    c. 方法名:给方法取名字,见名知意,小驼峰式

    d. 参数:进入到方法内部参与执行的数据

    e. 方法体:具体实现该方法的具体代码

    f. return 结果:该方法操作完参数之后,最终返回的一个数据

  3. 无参无返回值方法

    a. 定义

    public static void 方法名() {
      方法体
    }
    

    b. 调用

    ​ 方法名()

  4. 有参无返回值方法

    a. 定义

    public static void 方法名(形参) {
      方法体
    }
    

    b.调用

    ​ 方法名(实参)

  5. 无参有返回值方法

    a. 定义

    public static 返回值类型 方法名() {
      方法体
      return 结果
    }
    

    b.调用

    ​ 打印调用:sout(方法名()) → 不推荐使用

    ​ 赋值调用:数据类型 变量名 = 方法名() → 推荐使用

  6. 有参有返回值方法

    a. 定义

    public static 返回值类型 方法名(形参) {
      方法体
      return 结果
    }
    

    b.调用

    ​ 打印调用:sout(方法名(实参)) → 不推荐使用

    ​ 赋值调用:数据类型 变量名 = 方法名(实参) → 推荐使用

  7. 注意事项

    a. 方法不调用不执行,main方法是jvm(虚拟机)调用的

    b. 方法之间不能互相调用

    c. 方法的执行顺序只和调用顺序有关

    d. void不能和【return 结果】共存,但是能和【return】共存

    ​ void:代表没有返回值

    ​ return 结果:代表有返回值,先将结果返回,在结束方法

    ​ return:仅仅代表结束方法

    e. 一个方法中不能连续写多个return

    f. 调用方法时,需要看有没有此方法

  8. 参数和返回值使用时机

    a. 参数:当想将一个方法中的数据,传递到另外一个方法中操作,就需要参数了

    b. 返回值:如果调用者需要使用被调用者的结果,被调用者就需要将自己的结果返回

  9. 方法的重载

    a. 概述:方法名相同,参数列表不同

    b. 什么叫参数列表不同:

    ​ 参数个数不同,类型不同,类型顺序不同

    c. 和什么无关:

    ​ 和参数名无关,和返回值无关

模块七重点

  1. 知道为啥使用面向对象思想编程
  2. 知道怎么使用面向对象思想编程
  3. 知道什么时候使用面向对象思想编程
  4. 会利用代码去描述世间万物的分类
  5. 会在一个类中访问另一个类中的成员 → new 对象
  6. 成员变量和局部变量的区别

第一章 类和对象

1.1 面向对象介绍

  1. 面向过程:自己的事情自己干,代表语言(C语言)

  2. 面向对象:自己的事情别人帮忙干,代表语言(Java语言)

  3. 为啥要使用面向对象思想编程

    很多功能别人都给我们实现好了,我们只需要直接拿过来使用即可,简化了我们自己的编写过程,减少了我们的代码量

  4. 什么时候使用面向对象思想编程

    在一个类中想使用别的类中的成员是,就是用面向对象思想编程

    至于我们使用的功能,人家怎么实现的,我们不需要关心,我们只需要知道怎么使用即可。

    import java.util.Arrays;
    import java.util.Random;
    import java.util.Scanner;
    
    /*
    在一个类中想使用别的类中的成员是,就是用面向对象思想编程
     */
    public class Demo01Object {
        public static void main(String[] args) {
            /*
            我们想在 Demo01Object 类中使用 Scanner 类中的 next 方法实现录入字符串
            那么我们就需要使用面向对象思想编程
            对象:Scanner → new 出来的
            对象实现好的功能:next()
    
            我们只需要知道找来 Scanner 这个对象,就可以调用这个对象中实现好的 next 方法
            至于 next 方法怎么实现的,我们不需要关心
             */
            Scanner sc = new Scanner(System.in);
            String data = sc.next();
            System.out.println("data = " + data);
    
            System.out.println("=====================");
            /*
            我们想在 Demo01Object 类中使用 Random 类中的 nextInt 方法实现录入字符串
            那么我们就需要使用面向对象思想编程
            对象:Random → new 出来的
            对象实现好的功能:nextInt()
    
            我们只需要知道找来 Random 这个对象,就可以调用这个对象中实现好的 nextInt 方法
            至于 nextInt 方法怎么实现的,我们不需要关心
             */
            Random rd = new Random();
            int data1 = rd.nextInt();
            System.out.println("data1 = " + data1);
    
            System.out.println("=====================");
            int[] arr = {1, 2 ,3, 4};
            /*System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                if (i == arr.length - 1) {
                    System.out.print(arr[i] + "]");
                } else  {
                    System.out.print(arr[i]+",");
                }
            }*/
            /*
            Arrays 就是我们找来的对象
            toString 就是此对象中实现好的功能
            我们只需要调用,怎么实现我们不关心
             */
            System.out.println(Arrays.toString(arr));
    
        }
    }
    
  5. 怎么使用面向对象思想编程

    a. new 对象 → new完,点方法名调用

    b. 特殊:如果调用的成员带 static 关键字,我们不需要 new ,我们直接类名点即可。

1.2 类和对象

1.2.1 类(实体类)_class

  1. 测试类:带main方法的类,主要是运行代码的
  2. 实体类:是一类事物的抽象表示形式,世间万物的分类,比如:人类 狗类 猫类 鼠标类

组成部分:

  1. 属性(成员变量):这一类事物有啥

    a. 定义位置:类中方法外

    b. 作用范围:作用于当前类

    c. 定义格式:数据类型 变量名

    d. 默认值:

    ​ 整数:0

    ​ 小数:0.0

    ​ 字符:‘\n0000’

    ​ 布尔:false

    ​ 引用:null

    image-20240321111402514

  2. 行为(成员方法):这一类事物都能干啥

    只需要将模块六所学的方法中的 static 干掉,其他的都一样

    人类描述

    public class Person {
        // 属性 → 成员变量
        String name;
        int age;
    
        // 行为 → 成员方法
        public void eat() {
            System.out.println("人要干饭");
        }
        public void drink() {
            System.out.println("人要喝水");
        }
    }
    

    动物类描述

    public class Animal {
        String kind; // 品种
        String color; // 颜色
    
        public void eat() {
            System.out.println("动物要吃饭");
        }
        public void sleep() {
            System.out.println("动物要睡觉");
        }
    }
    

    描述手机类

    public class Phone {
        // 属性
        String brand;
        String color;
        int price;
        // 行为
        public void call(String name) {
            System.out.println("给" + name + "打电话");
        }
        public String message() {
            return "给金莲发短信";
        }
    }
    

1.2.2 对象

  1. 概述:一类事物的具体体现

  2. 作用:

    a. 导包

    import 包名.类名
    

    如果两个类在同一个包下,想要使用对方的成员不需要导包;如果两个类不在同一个包下,想要使用对方的成员需要导包。

    特殊包:java.lang → 使用 lang 包下的类,不需要导包 → String

    友情提示:在学四种权限修饰符之前,尽量让两个类在同一包下

    b. 创建对象:想要使用哪个类中的成员,就 new 哪个对象

    类名 对象名 = new 类名() → 比如:Person person = new Person()
    

    c. 调用成员(成员变量、成员方法)→ 想要使用哪个类中的成员,就用哪个类的对象去点那个成员

    对象名.成员变量名 = 值
    对象名.方法名() → 调用的是无参无返回值方法
    对象名.方法名(实参) → 调用的是有参无返回值方法
    数据类型 变量名 = 对象名.方法名() → 调用的是无参有返回值方法
    数据类型 变量名 = 对象名.方法名(实参) → 调用的是有参有返回值方法
    
    public class Person {
        // 属性 → 成员变量
        String name;
        int age;
    
        // 行为 → 成员方法
        public void eat() {
            System.out.println("人要干饭");
        }
        public void drink() {
            System.out.println("人要喝水");
        }
    }
    
    /*============================================*/
    public class Demo01Person {
        public static void main(String[] args) {
            Person person = new Person();
            System.out.println(person.name);
            System.out.println(person.age);
            person.name = "张三";
            person.age = 26;
            System.out.println(person.name);
            System.out.println(person.age);
            person.eat();
            person.drink();
        }
    }
    

1.2.3 练习

需求:用代码去描述一个手机类,在测试类中为手机属性赋值,并调用手机类中的功能

public class Phone {
    // 属性
    String brand;
    String color;
    int price;
    // 行为
    public void call(String name) {
        System.out.println("给" + name + "打电话");
    }
    public String message() {
        return "给金莲发短信";
    }
}

/*=====================================*/
public class Demo02Phone {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.brand = "苹果";
        phone.color = "黑色";
        phone.price = 7999;

        System.out.println(phone.brand);
        System.out.println(phone.color);
        System.out.println(phone.price);
        
        phone.call("金莲");
        String mess = phone.message();
        System.out.println("mess = " + mess);
    }
}

image-20240321120407829

第二章 匿名对象的使用

  1. 所谓的匿名对象:其实就是没有等号左边的部分,只有等号右边的部分(对象)

    比如:

    int i = 10

    a. int:是数据类型
    b. i:变量名
    c. 等号右边的10:真正的数据

    Person p = new Person()
    a. 等号左边的Person:对象的类型,好比是int
    b. p:对象名
    c. 等号右边的new Person():真正的数据,是一个Person对象,将这个对象真正创建出来了

  2. 使用

    new 对象().成员
    
  3. 注意

    a. 如果我们只想单纯的调用一个方法,让方法执行,我们可以考虑使用匿名对象

    b. 但是如果涉及到赋值,千万不要用匿名对象

public class Person {
    String name;
    public void eat(){
        System.out.println("人要吃饭");
    }
}

/*==================================*/

public class Demo01Person {
    public static void main(String[] args) {
        // 原始方式
        Person person = new Person();
        person.name = "金莲";
        System.out.println(person.name);
        person.eat();

        System.out.println("============");
        // 匿名对象
        new Person().eat();
        new Person().name = "大郎";
        System.out.println(new Person().name); // null
    }
}

image-20240321130006307

第三章 对象的内存解析

3.1 一个对象的内存图

public class Phone {
    String brand;
    int price;

    public void call() {
        System.out.println("给金莲打电话");
    }
}

/*==============================*/

public class Demo01Phone {
    public static void main(String[] args) {
        Phone p = new Phone();

        System.out.println(p); //  地址值
        System.out.println(p.brand); //  null
        System.out.println(p.price); // 0

        p.brand = "小米";
        p.price = 2999;

        System.out.println(p.brand); //  小米
        System.out.println(p.price); // 2999

        p.call();
    }
}

image-20240321131606778

3.2 两个对象的内存图

public class Phone {
    String brand;
    int price;

    public void call() {
        System.out.println("给金莲打电话");
    }
}

/*================================*/

public class Demo02Phone {
    public static void main(String[] args) {
        Phone p = new Phone();
        System.out.println(p); //  地址值
        System.out.println(p.brand); //  null
        System.out.println(p.price); // 0
        p.brand = "小米";
        p.price = 2999;
        System.out.println(p.brand); //  小米
        System.out.println(p.price); // 2999

        System.out.println("===================");

        Phone p1 = new Phone();
        System.out.println(p1); //  地址值
        p1.brand = "华为";
        p1.price = 6999;
        System.out.println(p1.brand); //  华为
        System.out.println(p1.price); // 6999
    }
}

image-20240321174431194

p 和 p1 都是 new 出来的对象,所以在堆内存中开辟了两个不同的空间,修改自己空间中的数据不会影响其他空间的数据。

3.3 两个对象指向同一片空间的内存图

public class Phone {
    String brand;
    int price;

    public void call() {
        System.out.println("给金莲打电话");
    }
}

/*================================*/

public class Demo03Phone {
    public static void main(String[] args) {
        Phone p = new Phone();
        System.out.println(p); //  地址值
        System.out.println(p.brand); //  null
        System.out.println(p.price); // 0
        p.brand = "小米";
        p.price = 2999;

        Phone p1 = p;
        System.out.println(p1); //  地址值
        p1.brand = "华为";
        p1.price = 6999;

        System.out.println(p.brand); //  华为
        System.out.println(p.price); // 6999
        System.out.println(p1.brand); //  华为
        System.out.println(p1.price); // 6999
    }
}

image-20240321175603992

p1 是 p 给的,p在内存中保存的是地址值,所以此时p1和p的地址值是一样的,操作同一片空间中的数据,所以修改一个对象会影响另外一个对象。

第四章 成员变量和局部变量的区别

  1. 定义位置不同(重点)

    a. 成员变量:类中方法外

    b. 局部变量:定义在方法之中或者参数位置

  2. 初始化值不同(重点)

    a. 成员变量:有默认值,所以不用先手动赋值,就可以直接使用

    b. 局部变量:是没有默认值的,所以需要先手动赋值,再使用

  3. 作用范围不同(重点)

    a. 成员变量:作用域整个类

    b. 局部变量:只作用于自己所在的方法,其他方法使用不了

  4. 内存位置不同(了解)

    a. 成员变量:在堆中,跟着对象走

    b. 局部变量:在栈中,跟着方法走

  5. 生命周期不同(了解)

    a. 成员变量:随着对象的创建而产生,随着对象的消失而消失

    b. 局部变量:随着方法的调用而产生,随着方法的调用完毕而消失

public class Person {
    String name; // 成员变量
    public void eat() {
        int i = 10; //  局部变量
        System.out.println(name); // 成员变量不用手动赋值就可以直接使用,因为有默认值
    }

    public void drink() {
        int j;
        // System.out.println(j); // 局部变量没有默认值,所以需要手动赋值,再使用
        System.out.println(name);
        // System.out.println(i); // i 是 eat 方法的局部变量, 在 drink 中使用不了
    }
}

第五章 练习

需求:定义一个类 MyDate,属性有 year、month、day;再定义一个类Citizen(公民类),属性有name(String类型)、birthday(MyDate类型)、idCard(String),为这三个属性赋值,然后将值取出来

// MyDate 类
public class MyDate {
    int year;
    int month;
    int day;
}
// Citizen 类
public class Citizen {
    // 姓名
    String name;
    /*
    生日 MyDate 类型
    MyDate 属于自定义类型(引用数据类型)
    这种类型要操作之前,必须要赋值
    怎么赋值?需要 new 对象赋值
     */
    MyDate birthday = new MyDate(); // 默认值 null
    // 身份证
    String idCard;
}
// 测试类
public class Demo01Exercise {
    public static void main(String[] args) {
        Citizen citizen = new Citizen();
        citizen.name = "张三";
        /*
        citizen.birthday 获取的是 MyDate 对象
        再去点year获取的是MyDate对象中的year
        链式调用
         */
        citizen.birthday.year = 2000;
        citizen.birthday.month = 2;
        citizen.birthday.day = 28;
        citizen.idCard = "522321199103253718";

        System.out.println(citizen.name+","+citizen.birthday.year+"-"+citizen.birthday.month+"-"+citizen.birthday.day+","+citizen.idCard);
    }
}

给自定义类型(引用数据类型)赋值,需要new对象(String类型比较特殊,可以直接等号赋值)

第六章 总结

img

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫林残忆168

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值