参考教程

JDK8帮助文档

狂神说Java视频

面向过程VS面向对象

面向过程思想:

  • 步骤清晰简单,第一步做什么,第二步做什么……
  • 面对过程适合处理一些较为简单的问题

面向对象思想:

  • 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
  • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题

对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

面向对象概念

面向对象编程(Object-Oriented Programming,OOP)本质:以类的方式组织代码,以对象的形式封装数据。

抽象:把对象的相似点抽取出来,组成一个类

三大特性:

  • 封装
  • 继承
  • 多态

从认识论角度考虑:先有对象后有类。对象是具体的事物,类是对对象的抽象。

从代码运行角度考虑:先有类后有对象,类是对象的模板。

类与对象的关系

  • 类是一种抽象的数据类型,它是对某一类事物整体描述定义,但是并不能代表某一个具体的事物。
  • 对象是抽象概念的具体实例。

创建与初始化对象

使用new关键字创建对象:创建时除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。

1
2
3
4
5
6
7
8
9
10
11
12
//学生类
//一个类里只能存在属性和方法这两种东西
public class Student {
//属性:字段
String name;
int age;

//方法
public void study(){
System.out.println(this.name+"学生在学习");//this关键字代表当前这个类
}
}

main方法里测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Application {
//一个项目只存在一个main方法
public static void main(String[] args) {
//对抽象的类进行实例化
//类实例化后会返回一个自己的对象
//student对象就是一个Student类的具体实例
Student Messi = new Student();
Student Suarez = new Student();

Messi.name = "Messi";
Messi.age = 33;

System.out.println(Messi.age);
System.out.println(Messi.name);
System.out.println(Suarez.age);//默认0
System.out.println(Suarez.name);//默认null
}
}

构造器

类中的构造器:也叫构造方法,是在进行创建对象的时候必须要调用的,并且有以下两个特点

  • 必须和类的名字相同
  • 必须没有返回类型,也不加void

新建一个空的类:

1
2
public class Person {
}

在main方法里实例化这个类并编译:

1
2
3
4
5
public class Application {
public static void main(String[] args) {
Person person = new Person();
}
}

用IDEA打开out文件夹下面生成的Person.class文件:

1
2
3
4
5
6
7
8
9
10
11
12
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package OOP;

public class Person {
public Person() {
}
}

证明:一个类即使什么都不写,它也会存在一个方法,即为构造方法(构造器)

构造器的作用

  • 使用new实例化对象的时候,本质是在调用构造器(有参构造/无参构造)
  • 用来初始化对象的值

有参构造与无参构造

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Person {
String name;

//无参构造:可显式或隐式定义
//显式定义作用为实例化初始值
public Person(){
this.name = "Player";
}

//有参构造
//**一旦定义了有参构造,无参构造就必须显式定义**
public Person(String str){
this.name = str;
}
}

main测试:

1
2
3
4
5
6
public class Application {
public static void main(String[] args) {
Person person = new Person("Messi");
System.out.println(person.name);
}
}

注意:一旦定义了有参构造,无参构造就必须显式定义

IDEA在一个类里生成构造器的快捷键

  • Alt+insert选择Constructor,直接点OK:有参构造
  • Alt+insert选择Constructor,选“Select None”:无参构造

创建对象的内存分析

详情参考视频讲解

QQ截图20210120172145

OOP基础小结

  1. 类与对象:类是一个抽象的模板,对象是一个具体的实例
  2. 方法:定义与调用
  3. 对应的引用:相对于八大基本类型——对象为引用类型,通过引用来操作,从栈中指向堆
  4. 属性:字段(Field,成员变量),会默认初始化,定义:修饰符 属性类型 属性名 = 属性值
  5. 对象的创建和使用:
    1. 必须使用new关键字创建对象
    2. 对象的属性调用:对象名.属性
    3. 对象的方法调用:对象名.方法
  6. 类:
    1. 静态的属性——属性
    2. 动态的行为——方法