面向对象(封装)

day07 总结笔记

01-面向对象介绍

  • 面向对象并非是一个技术, 而是一种编程的思想

    • 这种思想可以指导我们以什么思路解决问题, 以什么思路来组织代码

  • 问题 : 为什么要学习这种思想 ?

因为这套思想, 来源于生活, 生活中解决问题, 就是一系列的对象, 在一起打交道, 从而将问题解决.
所以我们希望写代码解决问题的时候, 也能按照生活中的这种思想
这样的话, 编程就会更加贴切于生活, 程序也会更加便于让人理解.
   
举例1: 解决随机数的问题 ---> Random对象
举例2: 解决键盘录入的问题 ---> Scanner对象
举例3: 封装学生数据 ---> Student对象
  • 面向对象我们学什么 ?

    • 学习自己如何设计对象

    • 学习已有的对象如何使用 (API章节)

  • 万物皆对象

    • 生活中的任何一种事物, 都可以通过代码, 将其描述为对象

     

02-类和对象

  • 前提 : Java中想要创建对象, 必须现有类的存在

  • 类的介绍 :

    • 一组相关属性和行为的集合, 将其理解为是对象的一张设计图

  • 对象的介绍 :

    • 对象是根据类 (设计图), 创建出来的实体

  • 类和对象的关系 :

    • 依赖关系 : 需要根据类, 创建对象

    • 数量关系 : 根据一个类, 可以创建出多个对象

  • 类的组成 :

属性 : 在代码中使用成员变量表示, 成员变量跟之前定义变量的格式一样, 只不过位置发生了改变 (类中方法外)

行为 : 在代码中使用成员方法表示, 成员方法跟之前定义方法的格式一样, 只不过去掉了 static 关键字
  • 类的设计

    • 知道什么设计为属性, 什么设计为行为

- 描述事物的一些[名词], 设计为属性
- 描述事物的一些[动词], 设计为行为

举例1: 我有一个{学生}叫做<张三>, 今年<23岁>, <180的身高>, 平时没什么特殊爱好, 就喜欢(吃饭)和(学习).
举例2: 前阵子我买了一台<白色>的<海尔>{洗衣机}, 花了<1999块钱>, (洗衣服)和(甩干)确实方便.
public class Student {
// 属性: 姓名, 年龄
String name;
int age;

// 行为: 吃饭, 学习
public void eat(){
System.out.println("吃饭");
}

public void study(){
System.out.println("学习");
}
}
  • 对象的创建和使用

    • 思路 : 当对象创建完毕后, 调用内部的成员, 都是拿着对象名 . 出来的

创建对象的格式 : 类名 对象名 = new 类名();

Student stu = new Student();
System.out.println(stu); // com.itheima.oop.Student@233ac477

使用对象成员变量的格式 : 对象名.变量名;

stu.name = "张三";
stu.age = 23;

System.out.println(stu.name);
System.out.println(stu.age);

使用对象成员方法的格式 : 对象名.方法名();

stu.eat();
stu.study();
  • 细节补充 :

1. 我们在定义类的时候, 成员变量通常不赋值.
(等对象创建完毕后, 再给成员变量赋值)

2. 成员变量没有赋值, 也可以直接使用, 使用的是默认值

 

03-对象的内存图

  • 务必打开 ppt 将内部流程梳理清楚

    • 目标 : 今后编写了创建对象的代码, 脑海中就要有堆的内存图

    Student stu = new Student();

     

04-成员变量和局部变量的区别

  • 类中位置不同 :

    • 成员变量 : 方法外

    • 局部变量 : 方法内

  • 初始化值不同 :

    • 成员变量 : 有默认初始化值

    • 局部变量 : 没有默认初始化值, 使用之前必须完成赋值

  • 内存位置不同 :

    • 成员变量 : 堆内存

    • 局部变量 : 栈内存

  • 生命周期不同 :

    • 成员变量 : 随着对象的创建而存在, 随着对象的消失而消失

    • 局部变量 : 随着方法的调用而存在, 随着方法的运行结束而消失

  • 作用域 :

    • 都在自己所属的大括号中有效

     

05-this 关键字

  • 情况 : 当局部变量和成员变量重名

    • Java会根据就近原则, 优先使用局部变量

  • 问题 : 非要使用成员变量, 怎么办 ?

  • 回答 : 使用this关键字进行区分

class Student {
int num = 10;

public void show(){
int num = 20;
System.out.println(num); // 20
System.out.println(this.num); // 10
}
}
  • this可以解决的问题 : 区分局部变量和成员变量的重名问题

  • this的作用 :

this可以调用自己本类的成员

this.本类成员变量;
this.本类成员方法();
-------------------------------------------------

省略规则 :

this.本类成员方法() : this.可以直接省略
this.本类成员变量 : 如果局部变量和成员变量没有重名, this.可以省略不写
class Student {
int num = 10;

public void show(){
System.out.println(this.num); // 10
this.print();
}

public void print(){
...
}
}

 

06-构造方法

  • 介绍 : 构造方法又名构造器

    • 构建, 创造一个对象要调用的方法

    • 简单记 : 构造方法就是用于创建对象的方法

  • 格式 :

1. 方法名与类名相同, 大小写也要一致
2. 没有返回值类型, 连 void 都没有
3. 没有具体的返回值 (不能通过 return 语句带回结果数据)
public class Student {
public Student(){
System.out.println("我是Student类的空参数构造方法");
}
}
  • 构造方法的执行时机 :

    • 在创建对象的时候, 被调用执行

    • 每创建一次对象, 就会执行一次构造方法

  • 构造方法的作用 :

    • 本质作用 : 用来创建对象

    • 结合执行时机 : 在创建对象的时候, 给成员变量初始化

public class Student {

String name;
int age;

public Student(String name, int age){
this.name = name;
this.age = age;
}
}


Student stu = new Student("张三", 23);
  • 构造方法的注意事项 :

    • 如果一个类中没写构造方法, 系统将会给出一个 [默认的] [无参数的] 构造方法

    • 如果手动编写了构造方法, 系统就不会给出那个默认的无参构造了

      • 建议 : 无参构造, 带参构造, 全部手动给出.

    • 构造方法不允许手动调用

      • stu.Student(); 错误调用

       

07-封装思想 (很重要)

  • 面向对象有三大特征 :

    • 封装

    • 继承

    • 多态

  • 封装思想介绍 :

    • 隐藏实现细节, 仅对外暴露公共的访问方式

      • 结合插线板理解

  • 封装在代码中常见的体现 :

    • 将属性抽取到类中, 是对数据做了封装

    使用封装前 : 维护一个用户信息, 定义了5个变量, 数据过于零散

    String id = "001";
    String name = "张三";
    int age = 23;
    String tel = "156****1234";
    String address = "北京";

    ----------------------------------------------------------

    使用封装后 : 5个零散的数据, 就被封装到了一个整体的对象中

    public class User {
    String id;
    String name;
    int age;
    String tel;
    String address;

    // 假设我写了带参数构造方法
    }

    User u1 = new User("001","张三",23,"156****1234", "北京");
    User u2 = new User("002","李四",23,"156****1244", "北京");
    • 将代码抽取到方法中, 是对代码功能进行了封装

    程序员A : 编写了一个遍历打印数组的方法

    public void printArray(int[] arr){
    ...
    }


    程序员B : 无需关心方法内部实现, 只要知道怎么调用即可.


    以上过程, 就是程序员A, 将遍历打印数组这个功能代码, 封装到了printArray方法中.

     

08-权限修饰符

  • private : 同一个类中

  • (default) : 同一个类中, 同一个包中

  • protected : 就业班

  • public : 任意位置

 

09-标准 JavaBean (必掌握)

  • 所有成员变量 private 私有

  • 提供空参\带参构造方法

  • 对于私有的成员变量, 提供对应的setXxx和getXxx方法

package com.itheima.test;

/*
标准 JavaBean :

1. 成员变量全部private私有

2. 提供空参\带参构造方法

3. 提供对应的setXxx和getXxx方法
*/
public class Student {
private String name;
private int age;

public Student() {

}

public Student(String name, int age) {
this.name = name;
this.age = age;
}

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;
}

}
package com.itheima.test;

public class StudentTest {
public static void main(String[] args) {
// 1. 空参构造创建对象, 通过setXxx方法完成赋值
Student stu1 = new Student();
stu1.setName("张三");
stu1.setAge(23);
System.out.println(stu1.getName() + "---" + stu1.getAge());

// 2. 带参构造方法创建对象, 在创建的时候直接赋值
Student stu2 = new Student("李四", 24);
System.out.println(stu2.getName() + "---" + stu2.getAge());

// 重点强调: getXxx方法, 能够得到的是真实的数据, 使用方式, 不要局限在打印语句上
for(int i = 1; i <= stu2.getAge(); i++){
System.out.println("祝福" + stu2.getName() + "生日快乐!");
}

}
}
 
posted @   灵泽pro  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示