第四章 Java面向对象编程基础
4.1 面向过程和面向对象思想
1,面向对象分为:
面向对象的分析OOA,面向对象的设计OOD,面向对象的编程OOD。
面向对象宏观把握,从整体上分析整个系统,
具体部分微观操作的实现还是面向过程的思想解决。
面向对象和面向过程相辅相成。
2,面向对象和面向过程思想总结:
.都是解决问题的思考方式,都是代码组织的方式 。
.解决简单问题,面向过程。
.解决复杂问题,宏观上面向对象,微观上面向过程。
3,面向对象的思考方式
遇到复杂问题,
找名词-->确立名词类-->根据问题需求确定类的属性和方法-->确定类之间的关系。
面向对象思想的三大特征:封装(功能+数据),继承,多态。
可维护性高,耦合度低。
面向过程思想:功能封装
4.2 对象的进化史
对象也是一种数据结构,他将数据和数据行为放在一起。
内存上对象就是一个内存块,存放了相关的数据集合。
对象的本质就是一种数据的组织方式。
4.3 对象和类的概念
1,类(图纸)是对对象(建筑)的抽象
类class,对象Objiect/实列instance
总结:
对象是具体的事物,类是对对象的抽象。
类可看成是一类对象的模板,对象可看成是该类的一个具体实例。
类是用于描述同一类对象的一个抽象概念,
类中定义了这一类对象共同具有的属性和方法。
4.4 类和对象初步
4.4.1 第一个类的定义
1,类的定义方式
//每一个源文件必须有且仅有一个public class,类名和文件名保存一致。
public class car{
}
class Type{//一个Java文件可以同时定义多个class
}
class Engine{
}
三种常见类成员:
属性field,方法method,构造器constructor
//编写简单学生类
public class SxtStu{
//属性(成员变量)
int id;
String name;
int age;
//方法
void study(){
System.out.println("我正在学习")
}
//构造器
SxtStu(){
}
}
4.4.2 属性field
静态特征,属性用于类或类对象包含的数据。作用范围是整个类体,
在定义成员变量时可以对其初始化,不对其初始化时由Java自动初始化。
整型 0,浮点型 0.0,字符型 '\u0000',布尔 false,引用类型 null.
属性定义格式:
[修饰符] 属性类型 属性名 = [默认值];
4.4.3 方法
定义格式
[修饰符] 方法返回类型 方法名(形参列表){
//n条语句;
}
4.4.4 一个典型类的定义和UML图
4.5 面向对象的内存分析
Java虚拟机内存分为三个区域:栈stack,堆heap,方法区methodarea.
栈的特点:
.栈描述的是方法执行的内存模型,每个方法被创建是都会创建一个栈帧(存储局部变量,操作数,方法出口等)。
.Jvm为每一个线程创建一个栈,用于存放该线程执行方法的信息(实际参数,局部变量等)。
.栈属于局部私有,不能实现线程间的共享。
.栈的存储特性:后进先出
.栈由系统自动分配,运算速度快。
.栈是一个连续的内存空间。
堆的特点:
.用于存储好的对象和数组。
.jvm只有一个堆,被所有线程共享。
.堆是一个不连续的内存空间,分配灵活,运算速度慢。
方法区(静态区)特点:
.jvm只有一个方法区,被所有线程共享。
.方法区实际也是堆,只是准,专门用来存储类,常量的相关信息。
.用来存储程序中永远不变或唯一的内容(eg:Class对象,静态变量,字符串常量)
4.6 对象的使用及内存分析
.同一类的每个对象有不同的成员变量存储空间。
.同一类的每个对象共享该类的方法。
4.7 构造器(构造方法constructor)
.创建对象时被自动调用的特殊方法,用于对象的初始化。
.构造器的名称要与类的名称一致。
.java通过new关键字来调用构造器,从而返回该类的实列,他是一个特殊的方法。
.不能定义返回值类型,不能使用return返回某个值。
.如果没有定义构造器,编译器会自动定义一个无参的构造函数。
已定义编译器不自动添加。
.
构造器格式:
[修饰符] 类名(参数列表){
//n条语句;
}
创建一个对象步骤:
1.分配对象空间,并将对象成员变量初始化为0或空。
2.执行属性值的显示初始化。
3.执行构造函数。
4.返回对象的地址给相关变量。
4.8 构造器的重载
1.构造器也是方法,可以重载。
如果方法构造中形式参数与属性名相同,需要使用this关键字区分属性与形参。
4.9 垃圾回收机制(Garbage Collection)
4.9.1 垃圾回收的原理和算法
1,内存管理
对象空间的分配:使用new关键字创建对象即可。
对象空间的释放:将对象赋值为null即可。
2,垃圾回收过程
发现无用对象
回收无用对象占用的内存空间。
3,垃圾回收算法
.引用计数:算法简单,但是循环引用的无用对象无法识别。
.引用可达法(根搜索算法):
寻找对应引用节点,找到这个节点后继续寻找这个节点的引用节点。
当所有引用节点寻找完毕后,剩余节点被人为无用节点。
4.9.2 通用的分代垃圾回收机制(略)
1,通过对象的生命周期不同,采取不同的回收算法。
对象分为:年轻代,年老代,持久代
4.9.3 JVM调优和Full Gc(略)
4.9.4 开发中容易造成内存泄漏的操作
1,创建大量无用对象
2,静态集合类的使用
HashMap,List,Vector等。
3,各种连接对象未关闭
I/O流对象,数据库连接对象,网络连接对象等。
4,监听器的使用
释放对象时没有删除相应的监听器。
程序员无权调用垃圾回收器
程序员可以使用System.gc()方法通知jvm。这回申请FullGc,成本高,影响系统性能。
finalize方法,可以释放对象或资源。少用。
4.10 this关键字
this本质就是“创建好的对象的地址”,在构造器中可以使用this关键字代表“当前对象”
this最常见的用法:
1.在程序中产生二义性处,使用this指代当前对象。
普通方法中this总是指向调用该方法的对象。
构造器中this总是指向正要初始化的对象。
2. 使用this关键字调用重载的构造器,避免相同的初始化代码。
但只能在构造器中第一句使用。
3.this不能使用在static方法中。
4.11 static关键字
1,类中使用static声明的变量为静态成员变量,也称类变量。
类变量声明周期与类相同,在整个应用程序执行期间都有效。
2,特点
1,static方法中不可直接访问非static的成员。
2,类变量是该类的公用变量,属于类,被该类的所有实例共享,在类被载入时显示初始化。
3,对于该类的所有对象来说,static成员变量只有一份,被该类的所有对象共享。
4,一般用“类名.类属性/方法”来调用,也可以通过对象引用或类名访问静态成员。
4.12 静态初始化块
1,构造器用于对象的初始化。
静态初始化块用于类的初始化操作,在静态初始化块中不能直接访问非static成员。
4.13 参数传值机制
Java方法中所有参数都是“值传递”,即”传递的时值的复印件“
1,基本数据类型参数的传值
传递值的副本,副本改变不会影响原件
2,引用数据类型参数的传值
传递地址的副本,但是副本和原参数都是指向同一个地址,
改变副本指向地址对象的值,也就意味着原参数指向对象的值发生了改变。
4.14 包
包是Java管理类的机制,解决类重名问题,实现对类的有效管理。
4.14.1 package
1,使用要点
他通常是类的第一句非注释语句
包名用,域名倒着写即可,再加上模板名,这样便于内部管理类
2,写项目时都要加包,不要使用默认包。
4.14.2 jdk中常用的包
略
4.14.3 导入类
要使用其他包的类,使用import导入,从而可以在本类中通过类名来调用需要的类。
如果导入两个同名类,只能用报名+类名来调用相关类
格式:java.util.Date date = new java.util.DAte();
4.14.4 静态导入 static import
JDK1.5后增加的功能,作用:导入指定类的静态属性。