类和对象概述
面向过程与面向对象区别、类和对象的概念、对象的创建和使用、对象的内存解析的简要介绍。
Author: Msuenb
Date: 2023-02-07
面向过程与面向对象
面向过程和面向对象都是一种编程思想,基于不同的思想会产生不同的程序设计方法。
-
面向过程程序设计思想(Process Oriented Programing),简称POP
面向过程,强调的是功能行为,以函数为组织单位,考虑怎么做。
-
面向对象程序设计思想(Object Oriented Programing),简称OOP
面向对象,将功能封装到对象中,强调具备了对象的功能,以类为组织单位,考虑谁来做。
面向过程:
- 优点是性能比面向对象高,因为类调用时需要实例化,开销比较大。
- 缺点是没有面向对象易维护、易复用、易扩展。可维护性差,不易修改。
面向过程:
- 优点是易维护、易复用、易扩展。
- 缺点是性能比面向过程低。
类和对象
-
类是具有相同特性的事物的抽象描述,是一组相关属性和行为的集合。
-
属性:该事物的状态信息。对应成员变量
-
行为:对事物的状态信息做什么操作,或基于事物的状态信息能做声明。对应成员方法
-
-
对象是一类事物的一个具体的个体。即对象是类的一个实例,必然具备该类事物的属性和行为。
- 例如,类:人,对象:麻花藤。
-
类与对象的关系
-
类是对一类事物的描述,是抽象的;对象是一类事物的实例,是具体的。
-
类是对象的模板,对象是类的实体。
-
-
类的成员
类的成员有属性、方法、构造器、代码块、内部类。详见 类的成员
类和对象的创建和使用
-
类的定义格式
【修饰符】 class 类名 { }
示例:
public class Student { }
-
对象的创建
new 类名(); // 创建匿名对象 只能使用一次 类名 对象名 = new 类名(); // 创建有名字的对象 可以反复使用
示例:
public class Test { public static void main(String[] args) { new Student(); // 创建Student类的匿名对象 Student stu = new Student(); Student[] stu = new Student[5]; // 创建Student对象数组 } }
-
属性和方法的声明
【修饰符】 class 类名 { 【修饰符】 数据类型 成员变量名; // 属性 【修饰符】 返回值类型 方法名(【形参列表】) 【throws 异常列表】 { 方法体代码 } }
声明方法的位置:必须声明在类中 方法外,即不能在一个方法中直接定义另一个方法。
错误示例
类 { 方法1() { 方法2() { } // 错误 } }
-
对象的使用演示
public class Student { public String name; public int age; public void learn() { System.out.println("learning"); } }
使用
对象.对象成员
的方式访问对象成员(包括属性和方法)public class Test { public static void main(String[] args) { // 创建对象 Student stu = new Student(); stu.name = "Tom"; // 访问对象属性 stu.age = 18; stu.learn(); // 访问对象方法 } }
对象的内存解析
内存是用于暂存 CPU 中的运算数据,以及与硬盘等外部存储设备交换的数据。
JVM
的内存划分
Java 虚拟机要运行程序,必须对内存空间进行分配和管理。为了提高效率,就对空间进行了不同区域的划分,每一片区域都有特定的处理数据的方式和内存管理的方式。
区域名称 | 作用 |
---|---|
程序计数器 | 程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址 |
本地方法栈 | 当程序中调用了native的本地方法时,本地方法执行期间的内存区域 |
方法区 | 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 |
堆内存 | 存储对象(包括数组对象),new来创建的,都存储在堆内存。 |
虚拟机栈 | 用于存储正在执行的每个Java方法的局部变量表等。 局部变量表存放了编译期可知长度的各种基本数据类型、对象引用,方法执行完,自动释放。 |
针对上面的代码,画出对象stu
的内存图。在使用new Student()
建对象时,会加载Student
类的信息(属性信息,方法信息)到方法区。