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;标签:name,构造方法,age,面向对象,Student,public,String From: https://www.cnblogs.com/linzel/p/18062979
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() + "生日快乐!");
}
}
}