一、概述

面向过程: 当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。

面向对象: 当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿。

面向对象三大特征: 即封装、继承和多态

  1. public class Demo01PrintArray {
  2. public static void main(String[] args) {
  3. int[] array = { 10, 20, 30, 40, 50, 60 };
  4. // 要求打印格式为:[10, 20, 30, 40, 50]
  5. // 使用面向过程,每一个步骤细节都要亲力亲为。
  6. System.out.print("[");
  7. for (int i = 0; i < array.length; i++) {
  8. if (i == array.length - 1) { // 如果是最后一个元素
  9. System.out.println(array[i] + "]");
  10. } else { // 如果不是最后一个元素
  11. System.out.print(array[i] + ", ");
  12. }
  13. }
  14. System.out.println("==============");
  15. // 使用面向对象
  16. // 找一个JDK给我们提供好的Arrays类,
  17. // 其中有一个toString方法,直接就能把数组变成想要的格式的字符串
  18. System.out.println(Arrays.toString(array));
  19. }
  20. }

二、类和对象

2.1 类

类 : 是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。

现实中,描述一类事物:

属性 :就是该事物的状态信息。

行为 :就是该事物能够做什么。

2.2 对象

对象 : 是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。

  • 类是对一类事物的描述,是 抽象的。
  • 对象是一类事物的实例,是 具体的。
  • 类是对象的模板,对象是类的实体 。

2.3 类的定义

  • 格式
  1. public class ClassName {
  2. //成员变量
  3. //成员方法
  4. }
  • 定义类 : 就是定义类的成员,包括成员变量和成员方法。
  • 成员变量 : 和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。
  • 成员方法 : 和以前定义方法几乎是一样的。只不过把static去掉,static的作用在面向对象后面课程中再详细讲解。
  1. public class Student {
  2. //成员变量
  3. String name//姓名
  4. int age//年龄
  5. //成员方法
  6. //学习的方法
  7. publicvoid study() {
  8. System.out.println("好好学习,天天向上");
  9. }
  10. //吃饭的方法
  11. public void eat() {
  12. System.out.println("学习饿了要吃饭");
  13. }
  14. }

2.4 使用对象

① 导包

  1. import 包名.类名

对于和当前类属于同一个包的情况,可以省略导包语句不写。

② 创建

  1. 类名 对象名 = new 类名();

③ 使用

  1. 对象名.成员变量名
  2. 对象名.成员方法名(参数)

2.5 默认值

若成员变量未赋值,则会有一个默认值,规则与数组相同。

数据类型 默认值
整数类型 0
浮点类型 0.0
字符类型 ‘\u0000’ (是不可见字符,不是空格)
布尔类型 false
引用类型 null

三、对象的内存图解

3.1 一个对象

成员方法在堆中保存的是地址值!方法依次入栈,并在调用完成后出栈。

面向对象与封装 - 图1

3.2 两个对象

面向对象与封装 - 图2

3.3 两个引用一个对象

面向对象与封装 - 图3

3.4 对象作为方法参数

面向对象与封装 - 图4

3.5 对象作为方法返回值

面向对象与封装 - 图5

四、成员变量与局部变量

区别:

① 定义的位置不同

局部变量:在方法内部

成员变量:在方法外部,直接写在类中

② 作用范围不同

局部变量:只用方法中才可以使用,出了方法便不可使用

成员变量:整个类都可以使用

③ 默认值不同

局部变量:无默认值,只有赋值了才可使用

成员变量:如果未赋值,会有默认值

④ 内存的位置不一样

局部变量:位于栈内存

成员变量:位于堆内存

⑤ 生命周期不一样

局部变量:随着方法进栈而诞生,随着方法出栈而消失。(通常情况下生命周期更短)

成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失。

五、封装性

封装就是将一些细节信息隐藏起来,对于外界不可见。

① 方法就是一种封装

② 关键字private也是一种封装

使用private修饰变量,那么本类中可以随意访问,但是超出了本类范围之外便不可直接访问,可以使用成员方法间接访问。

  • 间接访问private成员变量,就是定义一对儿Getter/Setter方法

    • 必须叫setXxx或者是getXxx命名规则。
    • 对于Getter来说,不能有参数,返回值类型和成员变量对应;
    • 对于Setter来说,不能有返回值,参数类型和成员变量对应。

注意: 对于基本类型当中的boolean值,Getter方法一定要设置成isXxx的形式,而setXxx规则不变。

六、this

  • 当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。如果需要访问本类当中的成员变量,需要使用格式:this.成员变量名
  • 谁调用的方法,谁就是this。

七、构造方法

7.1 格式

  1. public 类名称(参数类型 参数名称){
  2. 方法体
  3. }
  1. 1. 构造方法必须和类名称一致。
  2. 2. 构造方法不要写返回值类型,连void都不写。
  3. 3. 构造方法不能return一个具体的返回值。
  4. 4. 如果未编写构造方法,那么编译器会默认使用一个空的构造方法(无参数,方法体为空)。 public 类名(){}
  5. 5. 如果编写了至少一个构造方法,那么编译器将不会生成空构造方法。若使用 new 类名() 来创建对象会报错。
  6. 6. 构造方法可以重载

7.2 标准的类

一个标准的类(也叫Java Bean)应该具有以下几个部分:

  1. 1.所有成员变量都要使用private关键字修饰
  2. 2.为每一个成员变量编写一对Getter/Setter方法
  3. 3.一个无参数的构造方法
  4. 4.一个全参数的构造方法
  • 使用 alt + insert 快捷键可以生成Getter/Setter方法和构造方法。

八、static

一旦使用了static关键字,那么这样的内容不再属于对象自己,而是属于所在类,所以凡是本类的对象,共享同一份。

8.1 修饰成员变量

可以用对象名来调用,也可以直接通过类名来调用,推荐使用类名来调用。

典型用法:用于自动生成学号。

  1. public class Student {
  2. private int id; // 学号
  3. private String name; // 姓名
  4. private int age; // 年龄
  5. static String room; // 所在教室
  6. private static int idCounter = 0; // 学号计数器,每当new了一个新对象的时候,计数器++
  7. public Student() {
  8. this.id = ++idCounter;
  9. }
  10. public Student(String name, int age) {
  11. this.name = name;
  12. this.age = age;
  13. this.id = ++idCounter;
  14. }
  15. }

8.2 修饰成员方法

  • 可以用对象名来调用,也可以直接通过类名来调用,推荐使用类名来调用。

  • 对于本类中的静态方法,访问时可以省略类名。

① 静态方法只能调用静态变量和静态方法,不能访问非静态变量和静态方法(因为在内存当中先有的静态内容,后有的非静态内容)。而普通方法可以访问静态也可以访问非静态。

② 静态方法中不能用this关键字。

8.3 static的内存图解

面向对象与封装 - 图6

8.4 静态代码块

  1. public class 类名称{
  2. static{
  3. ...
  4. }
  5. }

1.当第一次使用本类时,静态代码块执行唯一的一次。

2.静态代码块比非静态代码块优先执行,所以它先于构造方法执行。

典型用法:用来一次性地对静态成员变量进行赋值。

九、匿名对象

匿名对象就是只有右边的对象,没有左边的名字和赋值运算符:

  1. new 类名().方法名();//调用
  2. new 类名().变量名;//调用

注意:匿名对象只能使用唯一的一次,下次再用不得不再创建一个新对象,如果确定一个对象只要使用一次时,就可以使用匿名对象。

匿名对象可以作为方法的参数和返回值。