一、面向对象介绍
1.面向过程(如C语言)
面向对象是分析解决问题所需要的步骤,而后用函数把这些步骤一一实现,使用时依次调用。面向过程是有先后顺序的。
2.面向对象:(OO)Oriented Object,java是纯面向对象的语言。
面向对象则是把解决问题的方案按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。面向对象无先后顺序。
OOA/OOD/OOP
- OOA: oriented object analysis 面向对象分析
- OOD:oriented object design 面向对象设计
- OOP:oriented object programming 面向对象编程
三者之间的关系:先进行分析,然后设计,最后编程实现。
分析:对需求中的内容进行提取、建模,把一些具有共性的提取出来,形成类。
设计:类与类之间的关系。
编程:编码实现。
二、类与对象的关系
- 类:类是一个模板,它描述一类对象的属性和行为。
一个类中所包含的内容:属性,这个类共有的性质;方法,这个类共有的行为。 - 对象:对象是类的一个实例,有状态和行为。
Exp:学生是一类群体,这类群体有其特性(属性)。
学生类的属性:有学号、学校、院系、姓名……
学生类的行为:上课、学习、写作业……
创建一个类 Student :
public class Student
{
int sid; //学号
String college; //学校
String faculty; //院系
String name; //姓名
public void inClass()
{
System.out.println("The student is in class!");
}
public void study()
{
System.out.println("The student is studying!");
}
public void homework()
{
System.out.println("The steudent is doing homework!");
}
}
编写测试用例 StudentDemo :
public class StudentDemo
{
public static void main(String[] args)
{
Student harry = new Student();
//Student harry 定义了一个变量,变量名叫做harry,这是标识符
//"Student harry"是一个Student类型的引用
//Student是一个类,也是一个自定义的数据类型名
//数据类型:一类是系统给的;一类是自定义的
//类名(类型名) + 变量名 = new 类名();
//"="右边是一个实实在在的对象
//"harry"这个变量叫做引用
//引用只是具体对象的别名,对象是具体存在的,别名叫什么不重要,只是用一个名字来称呼此对象
//对象存在于堆内存空间中。在内存中,对象只有一个名字,即其所处储存的内存空间的首地址
//要产生一个对象,使用关键字new。 new 类名();这就产生了一个对象
new Student();
//这是一个实例,此操作执行后在内存空间产生了一个对象,但无法访问,因为不知道其内存地址
//所以为了方便操作此对象,要给它起一个名字
//类名() 这是方法。因为使用它能产生对象,所以它叫构造方法
//new 是一个关键字,也是一个操作符
harry.homework();
//这是其他类中调用的,不能是private修饰的
//关于"."意思是"的"
//使用 引用.方法名() 的方式,就能对引用类型所对应类中的方法进行访问
}
}
PS:关于编译器工作的一些补充
在StudentDemo.java文件中使用Student.java,前提是两者在同一个文件下。
编译StudentDemo.java文件后生成了StudentDemo.class和Student.class两个文件
由此猜测,编译器工作:先编译StudentDemo.java文件,扫描其中内容,当发现数据类型名不是基础数据类型时,就会自动去找该类型对应的的.class文件,如果该文件不存在,则在StudentDemo.java文件所在文件夹下找该类型对应的.java文件,然后将其编译生成.class文件。
如果都找不到,则编译报错:
三、堆内存与栈内存的使用
在Java程序中,一旦遇到new关键字,new 类名();就会产生 一个对象实例,存储这个实例所需的内存空间在堆内存空间中分配。
图解:(以上述代码为例)
PS:harry是一个引用,在栈中存在,保存的是堆内存中的对象的指针。
当断掉引用后,GC会自动回收堆中对象所存的内存空间。
GC回收机制:当对象没有引用指针时,会立即回收。(对象有引用指针,但在内存中存在太久使用频率很低时,也可能会回收。)
未给对象引用名,即 new Student() 这种操作会让对象一产生就被回收。
以上。