面向对象:
一. 面向对象的编程关注于类的设计
1. 一个项目或工程, 不过多庞大, 一定是有一个一个类构成的
2. 类是抽象的, 好比是制造汽车的图纸. 二聚体的一辆一辆的车, 是根据图纸制造的, 实际上就是类的实例化
3. 类的组成成分
①. 属性 (成员变量, Field)
②. 方法 (成员方法, 函数, Method)
4. 类的初始化和内存的解析
内存划分的结构:
栈(stack): 局部变量、对象的引用名. 数组的引用名
堆(heap): new 出来的"东西" (如:对象的实体, 数组的实体), 含成员变量
方法区: 含字符串常量
静态域: 声明为 static 的变量
5. 类的关系:
① 从代码的角度:
并列关系
② 从执行、设计的角度:
关联关系、继承关系、聚合关系
二. 完成一个项目(或功能)的思路
1. 所要完成的功能对应的类的对象是否已经存在
2. 若存在, 则通过对象直接调用对应的类中的属性或方法即可
3. 若不存在, 则需要创建类的对象, 甚至说, 类都不存在, 就需要设计类
三. 面向对象编程的三条主线
1. 类及类的构成成分: 属性 方法 构造器 代码块 内部类
2. 面向对象编程的特征: 封装性 继承性 多态性 (抽象类)
3. 其他关键字: this super package import static final abstract interface ...
四. 面向对象的落地法则
1. 设计类, 并设计类的成员(成员变量&成员方法)
2. 通过类, 来创建类的对象(类的实例化)
3. 通过 "对象.属性" 或 "对象.方法" 来调用, 完成相应的功能
五. 创建对象
创建的多个对象彼此各自都拥有一套类的属性. 当对其中一个对象的属性进行修改时, 不会影响到其他对象的属性值.
进入正题
一. 类的成员之 属性(成员变量)
成员变量 & 局部变量
相同点:
1. 遵循变量声明的格式: 数据类型 变量名 = 初始值
2. 都有各自的作用域
不同点:
1. 声明的位置不同:
成员变量: 声明在类里, 方法外
局部变量: 声明在方法内, 方法的形参部分, 代码块内
2. 成员变量的修饰符有四个: public private protected 缺省
局部变量没有修饰符, 与所在的方法修饰符相同
3. 初始化值: 一定会有初始化值
成员变量: 如果在声明的时候, 不显式赋值, 那么不同数据类型会有不同的默认初始化值.
byte short int long ==> 0
float double ==> 0.0
char ==> 空格
boolean = false
引用类型变量 ==> null
局部变量: 一定要显式赋值. (局部变量没有默认初始化值)
4. 二者在内存中存储的位置不同
成员变量: 存在于堆空间中
局部变量: 存在于栈空间中
总结:
关于变量的分类:
① 按照数据类型的不同: 基本数据类型(8种) & 引用数据类型
② 按照声明的位置的不同: 成员变量 & 局部变量
类对象的属性的赋值顺序:
① 属性的默认初始化
② 属性的显式初始化
③ 通过构造器给属性初始化
④ 通过"对象.方法"的方式给属性赋值
二. 类的成员之 方法: 提供某种功能的实现
1 实例: public void eat(){}
public String getName(){}
public void setName(String name){}
格式: 权限修饰符 返回值类型(void:无返回值/具体返回值) 方法名(形参){方法体}
2. 关于返回值类型: void: 表示此方法不需要返回值
有返回值方法, 在方法的最后一定又return + 返回值类型对应的变量
3. 方法内可以调用本类的其他方法或属性, 但是不能在方法内再定义方法
三. 类的成员之 构造器(构造方法)
声明: 权限修饰符 类名(形参){}
作用: 1. 创建对象
2. 初始化对象的属性
使用:
1. 设计类时, 若不显式声明类的构造器的话, 程序会默认提供一个空参的构造器
2. 一旦显式的定义类的构造器, 那么默认的构造器就不再提供
3. 类的多个构造器之间构成重载
四. 类的成员之 初始化块(代码块)
1. 代码块如果有修饰符的话, 那么只能使用 static
2. 分类
① 静态代码块
Ⅰ. 随着类的加载而加载, 而且只加载一次
Ⅱ. 里面可以有输出语句
Ⅲ. 多个静态代码块之间按照顺序结构执行
Ⅳ. 静态代码块的执行要早于非静态代码块 的执行
Ⅴ. 静态代码块中只能执行静态的结构(类属性, 类方法)
② 非静态代码块
Ⅰ. 可以对类的属性(静态的 & 非静态的)进行初始化操作, 同时也可以调用本类声明的方法(静态的 & 非静态的)
Ⅱ. 里面可以有输出语句
Ⅲ. 一个类中可以有多个非静态代码块, 多个代码块之间按照顺序结构执行
Ⅳ. 每创建一个类的对象, 非静态代码块就执行一次
Ⅴ. 非静态代码块的执行要早于构造器
关于属性赋值的操作:
1. 默认初始化
2. 显式的初始化或代码块初始化(此处两个结构按照顺序执行)
3. 构造器中
4. 通过方法对对象的相应属性进行修改
五. 类的成员之 内部类
1. 相当于说 我们可以在类的内部再定义类. 外面的类: 外部类. 里面的类: 内部类
2. 内部类的分类:
成员内部类(声明再类内部且方法外的)
① 是外部类的一个成员:
Ⅰ. 可以有修饰符
Ⅱ. static final
Ⅲ. 可以调用外部类的属性方法
② 具有类的特点
Ⅰ. abstract
Ⅱ. 还可以在其内部定义属性、方法、构造器
局部内部类(声明在类的方法里)
3. 掌握三点:
① 如何创建成员内部类的对象
② 如何区分调用外部类、内部类的变量
③ 局部内部类的使用
六. 方法的重写(overwrite)
1. 前提: 有子类继承父类
2. 子类继承父类以后, 若父类的方法对子类不适用, 那么子类可以对父类的方法重写
3. 重写的规则:
① 要求子类方法的"返回值类型 方法名(参数列表)"与父类的方法一样
② 子类方法的修饰符, 不能小于父类方法的修饰符
③ 若父类方法抛出异常, 那么子类方法抛出的异常类型不能大于父类的
④ 字符类的方法必须同为static或同为非static
七. 方法的重载(overload)
要求:
1. 同一个类中
2. 方法名必须相同
3. 方法的参数列表不同(①参数个数不同 ②方法的类型不同)
补充: 方法的重载与方法的返回值类型没有关系
八. 匿名类对象: 创建的类的对象是匿名的
1. 当我们只需要使用一次调用类的对象时, 我们就可以考虑使用匿名的方式创建类的对象.
2. 特点: 创建的匿名类的对象只能够调用一次
九. 可变个数的形参的方法:
1. 格式: 对于方法的形参: 数据类型 ... 形参名
2. 可变个数的形参的方法与同名的方法之间构成重载
3. 可变个数的形参在调用时, 个数从0开始, 到无穷多个都可以
4. 使用可变多个形参的方法与方法的形参使用数组是一致的
5. 如果方法中存在可变个数的形参, 那么一定声明在参数的最后
6. 在一个方法中, 最多声明一个可变个数的参数
十. 方法的参数传递(重难点)
1. 形参: 方法生命是, 方法小括号内的参数
实参: 调用方法时, 实际传入的参数的值
2. 规则: java中的参数传递机制: 值传递机制
1. 形参是基本数据类型的: 将实参的值传递给形参的基本数据类型的变量
2. 形参是引用数据类型的: 将实参的引用类型变量的值(对应的堆空间的对象实体的首地址值)传递给形参的引用类型变量
十一. 权限修饰符
| 修饰符 | 类内部 | 同一个包 | 子类 | 任何地方 |
|---|---|---|---|---|
| private | yes | |||
| default | yes | yes | ||
| protected | yes | yes | yes | |
| public | yes | yes | yes | yes |
对于class的权限修饰符只可以用 public 和 default(缺省)
public 类可以在任意地方被访问
default 类只可以被同一个包内部的类访问