JavaSE学习笔记Day07

JavaSEDay07 总结笔记 01-面向对象介绍

  • 面向对象是一种编程思想
    • 指导以什么形式组织代码
    • 指导以什么思路解决问题
  • 问题 : 为什么要学这种思想呢 ?
因为这套思想来源于生活, 生活中解决问题时, 就是一个个的对象在一起打交道从而将问题解决 所以希望自己写代码的时候, 也能使用这套思想, 代码的编写就会更加简单.- 举例: 1. 解决产生随机数的问题 ---> Random对象 2. 解决键盘录入的问题---> Scanner对象 3. 封装学生的信息 ---> Student对象 ...- Java讲究万物皆对象

  • 面向对象学什么 ?
    • 学习自己如何设计对象
    • 学习已有的对象如何使用 (API阶段)
02-类和对象
  • 前提 : Java中想要创建对象, 必须要先有类的存在
  • 类 : 是一组相关属性和行为的集合, 将其看做为是对象的设计图
  • 对象 : 根据类(设计图)创建出来的实体.
  • 关系 :
    • 依赖关系 : 需要根据类创建对象
    • 数量关系 : 一对多的关系, 根据一个类创建出多个对象
  • 类的组成 :
类是设计图, 设计图的本质是对事物进行描述属性(名词) :成员变量: 跟之前定义变量的格式一样, 只不过位置发生了改变, 类中方法外.行为(动词) : 成员方法: 跟之前定义方法的格式一样, 只不过去掉了static关键字.

class Student {String name; int age; public void eat(){ ... }}

  • 注意 : 当类写好了之后, 需要在测试类中创建对象再使用
class Test { public static void main(String[] args){ // 创建对象格式: 类名 对象名 = new 类名(); Student stu = new Student(); System.out.println(stu); // 地址值 :com.itheima.oop.Student@233ac4a// 成员变量没有赋值, 直接使用 // 使用成员变量格式: 对象名.变量名; System.out.println(stu.name); // null System.out.println(stu.age); // 0stu.name = "张三"; stu.age = 23; System.out.println(stu.name); // 张三 System.out.println(stu.age); // 23// 使用成员方法格式: 对象名.方法名(实际参数); stu.eat(); } }

03-对象内存图
  • 单个对象内存图
    JavaSE学习笔记Day07
    文章图片

  • 【JavaSE学习笔记Day07】两个对象内存图
    JavaSE学习笔记Day07
    文章图片

04-成员变量和局部变量的区别
1. 类中编写位置不同成员变量: 方法外 局部变量: 方法中2. 初始化值不同成员变量: 有默认初始化值 局部变量: 没有默认初始化值, 使用之前必须赋值才能使用3. 内存位置不同成员变量: 堆内存 局部变量: 栈内存4. 生命周期不同成员变量: 随着对象的创建而存在, 随着对象的消失而消失 局部变量: 随着方法的调用而存在, 随着方法的弹栈而消失5. 作用域 都在自己所属的大括中有效

05-this关键字
  • 现象 : 当成员变量和局部变量重名了, 在没有任何标识的情况下, Java会根据就近原则, 优先使用局部变量
class Student { int num = 10; public void show(){ int num = 20; System.out.pritnln(num); } }Student stu = new Student(); stu.show(); // 20Java会根据就近原则, 优先使用局部变量

  • 问题 : 非要使用成员变量, 怎么区分 ?
  • 回答 : 使用this关键字
class Student { int num = 10; public void show(){ int num = 20; System.out.pritnln(this.num); } }Student stu = new Student(); stu.show(); // 10

  • 结论 : this调用本类成员 (变量, 方法)
this.本类成员变量 this.本类成员方法(); -----------------------------省略this的规则: 1. 调用成员方法, 没有前提条件, this.可以直接省略 2. 调用成员变量, 需要保证没有重名, this.才可以省略

  • this 介绍 : 代表当前类对象的引用 (地址) 谁来调用我, 我就代表谁
p1.show(); ----> this ---> p1的地址 p2.show(); ----> this ---> p2的地址

06-构造方法
  • 构造方法 | 构造器 : 创建对象的时候, 要执行的方法
  • 格式 :
1. 方法名与类名相同, 大小写也需要一致 2. 没有返回值类型, 连void都没有 3. 没有具体的返回值 (不能通过retrun带回结果数据) - 细节: 可以 return;

  • 构造方法的执行时机 :
1. 创建对象的时候, 被系统调用执行 2. 每创建一次对象, 就会执行一次构造方法.

  • 构造方法的作用 :
本质作用: 创建对象 结合执行时机: 在创建对象的时候, 给成员变量赋值Student stu = new Student("张三", 23); 思考过程: 构造方法在创建对象的时候, 一定会执行, 你就别闲着了, 帮我干点活 - 给成员变量初始化

  • 注意事项 :
1. 如果一个类, 没写构造方法, 系统会提供一个 [默认的] [无参数的] 构造方法 2. 如果手动编写过构造方法, 系统将不会再提供那个默认的无参构造了建议: 无参, 带参构造方法, 都手动给出.3. 构造方法不允许对象名.的形式调用

07-封装 (重点)
  • 介绍 : 隐藏实现细节, 仅对外暴露公共的访问方式
  • 封装在代码中常见的体现 :
使用封装前:String id = "001"; String name = "张三"; int age = 23; String tel = "156xxxxxxxx"; String address = "北京"; 操作的, 是5个零散的数据.-------------------------------------------------使用封装后:class User { private String id; private String name; private int age; private String tel; private String address; // 生成空参带参构造, setXxx和getXxx }User u1 = new User("001","张三",23,"156xxxxxxxx","北京"); 操作的, 是一个整体的对象感受: 原本是零散的数据, 现在被封装成一个整体了.结论: 将属性抽取到类中, 是对数据进行的封装.

程序员A :public void pirntArray(int[] arr){ ... 遍历打印数组的代码 ... }程序员B :只需要关心方法能干什么, 以及方法怎么用即可, 至于内部的逻辑实现, 无需关注程序员A, 将遍历打印数组的代码逻辑, 封装到了方法中.结论: 将代码抽取到方法中, 是对代码功能进行的封装.

08-权限修饰符
  • private : 同一个类中
  • (default) : 同一个类中, 同一个包中
  • protected : 在一个项目中,不可以有相同的两个包名,也就是说,包名不能和项目中其他的包名重复,这里不但包括自定义包名也包括项目所引用的类库的包名
  • public : 任意位置访问
09-标准 JavaBean (必掌握)
  • 成员变量 private 私有化
  • 提供空参, 带参构造方法
  • 针对于私有的成员变量, 提供对应的setXxx和getXxx方法.
package com.itheima.test; /* 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()); // 建议: 一般来说, 带参构造创建做初始化, 后期如果涉及到修改, 使用setXxx// 注意: getXxx方法, 是获取到真实的数据. for(int i = 1; i <= stu2.getAge(); i++){ System.out.println(stu2.getName() + "生日快乐"); } } }

    推荐阅读