面向对象
- Java类及类的成员:属性、方法、构造器;代码块、内部类。
- 面向对象的三大特征:封装性、继承性、多态性、(抽象性)。
- 其它关键字:this、super、static、final、abstract、interface、package、import等。
面向对象(OOP)与面向过程(POP)
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
面向对象分析方法的思路和步骤:
- 根据问题需要,选择问题所针对的现实世界中的实体。
- 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
- 把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
- 将类实例化成计算机世界中的对象,对象是计算机世界中解决问题的最终工具。
java语言的基本元素:类和对象
万事万物皆对象,类(Class)和对象(Object)是面向对象的核心概念。类是对一类事物的描述,是抽象的、概念上的定义。对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。对象是由类new出来的,派生出来的。面向对象程序设计的重点是类的设计,类的设计其实就是类的成员的设计。
常见的类的成员有属性(对应类中的成员变量),行为(对应类中的成员方法)。
- Field = 属性 = 成员变量= 域、字段
- Method = 成员方法 = 函数
- 创建类的对象 = 类的实例化 = 实例化类
1 | class Person{ |
类的创建
- 定义类(考虑修饰符、类名)
- 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
- 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
1 | //类的语法格式 |
说明:修饰符public:类可以被任意访问,类的正文要用{ }括起来
1 | //举例 |
对象的创建和使用
使用类名 对象名 = new 类名()创建对象,使用“object name.object member”的方式访问对象成员。类和对象的使用(面向对象思想落地的实现)如下:
- 创建类,设计类的成员
- 创建类的对象
- 通过“object.field”或“object.method”调用对象的结构
1 | //举例:计算圆的面积 |
如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性(非static),且互不干扰。如果修改一个对象的属性a,则不影响另外一个对象属性a的值。
- 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。
(例外:static方法访问非static,编译不通过。) - 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
内存解析
编译完源程序(.java)以后,生成一个或多个字节码(.class)文件。使用JVM中类的加载器和解释器对生成的字节码文件进行解释运行,意味着需要将字节码文件对应的类加载到内存中,涉及到内存解析。
JVM分为五个区域:虚拟机栈、本地方法栈、方法区、堆、程序计数器。虚拟机栈、本地方法栈、程序计数器为线程私有,方法区和堆为线程共享区。上图中已经用颜色区分,红色表示“通行”,蓝色表示停一停(需等待)。JVM不同区域的占用内存大小不同,一般情况下堆最大,程序计数器较小。
- 堆内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在堆分配内存。在java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配,对象的非static属性加载在堆中。
- 通常所说的栈是指虚拟机栈,虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char 、 short 、 int 、 long 、float 、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址), 方法执行完自动释放。
- 方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
匿名对象
不定义对象的句柄,直接调用这个对象的方法,这样的对象叫做匿名对象。如:new Person().shout();
- 我们经常将匿名对象作为实参传递给一个方法调用。
- 匿名对象只能调用一次,如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
类成员
Java类的成员有5类:属性、方法、构造器;代码块、内部类。
属性
语法格式:修饰符 数据类型 属性名 = 初始化值 ;说明:第一,常用的权限修饰符有:private、缺省、protected、public;其他修饰符:static、final (暂不考虑);第二, 数据类型可以是任何基本数据类型(如int、boolean)或任何引用数据类型;第三,属性名属于标识符,符合命名规则和规范即可。
1 | //举例 |
在方法体外,类体内声明的变量称为成员变量。在方法体内部声明的变量称为局部变量。两者的相同点:
- 定义变量的格式:数据类型 变量名 = 变量值
- 先声明,后使用
- 变量都有其对应的作用域
成员变量和局部变量的区别 | 成员变量 | 局部变量 |
---|---|---|
声明的位置 | 直接声明在类的{}中 | 方法内、方法形参、代码块内、构造器形参、 构造器内 |
修饰符 | private 、 public 、缺省、protected、 static 、 final 等 | 不能用权限修饰符修饰,可以用 final 修饰 |
初始化值 | 有默认初始化值 | 没有默认初始化值,必须显式赋值,方可使用 |
内存加载位置 | 堆空间(非static)或静态域内 | 栈空间 |
两者在初始化值上的区别:相同的是都有生命周期,不同的是局部变量没有默认初始化值,意味着在调用局部变量之前,除形参外均需显式赋值。特别地:形参在调用时赋值即可。
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型,如昨天所学的数组。成员变量的默认初始化值和数组的默认初始化值是相同的。
成员变量类型 | 默认初始化值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 |
char | 0或’\u0000’ |
boolean | false |
引用数据类型 | null |
方法
方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。将功能封装成方法是为了实现代码复用,简化代码。java中的方法不能独立存在,所有的方法必须定义在类中。
1 | //方法的语法格式 |
其中修饰符为public,缺省,private,protected等,static、final、abstract 可用来修饰方法。
return关键字
return使用在方法体中,用于结束方法,或者针对于返回值类型的方法,使用”return 数据”方法返回所要的数据。注意:return关键字后面不可以声明执行语句。
- 如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时需要使用return关键字来返回指定类型的变量或常量:“return 数据”。
- 如果方法没有返回值,则返回值类型用关键字void表示。通常没有返回值的方法中,就不需要使用return。如果使用,只能“return;”,仅用来结束方法。
方法中只能调用方法或属性,不可以在方法内部定义方法。按照是否有形参及返回值对方法进行分类:
方法分类 | 无返回值 | 有返回值 |
---|---|---|
无形参 | void 方法名(){} | 返回值类型 方法名(){} |
有形参 | void 方法名(形参列表){} | 返回值类型 方法名(形参列表){} |
1 | //举例 |
对象数组的内存解析
引用类型的变量,只可能存储两类值:null 或 地址值(含变量的类型)
理解“万事万物皆对象”
- 在Java语言范畴中,都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构。
- 涉及Java与前端html、后端数据库交互时,前后端的结构在Java层面交互时都体现为类、对象。