四、面向对象基础
1、面向过程和面向对象
2、对象的进化史
3、对象和类的概念
(1)第一个类的定义
(2)属性 (field)
属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
(3)方法
用于定义该类或该类实例的行为特征和功能实现。
(4)一个典型类的定义和UML图
4、面向对象的内存分析
Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。
5、构造方法
构造器也叫构造方法(constructor),用于对象的初始化。
6、构造方法的重载
7、垃圾回收机制
Java引入了垃圾回收机制,令C++程序员最头疼的内存管理问题迎刃而解。Java程序员可以将更多的精力放到业务逻辑上而不是内存管理工作上,大大的提高了开发效率。
(1)原理和算法
任何一种垃圾回收算法一般要做两件基本事情:
1. 发现无用的对象
2. 回收无用对象占用的内存空间。
1. 引用计数法 2. 引用可达法(根搜索算法)
(2)通用的分代垃圾回收机制
垃圾回收过程:
1、新创建的对象,绝大多数都会存储在Eden中;
2、当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉, 然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区
3、当Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,同时将Eden区中的不能清空的对象,也复制到S1中,保证Eden和S1,均被清空。
4、重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中,
5、当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)
(3)JVM调优和Full GC
在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:
1.年老代(Tenured)被写满
2.持久代(Perm)被写满
3.System.gc()被显式调用(程序建议GC启动,不是调用GC)
4.上一次GC之后Heap的各域分配策略动态变化
(4)开发中容易造成内存泄露的操作
创建大量无用对象;静态集合类的使用;各种连接对象(IO流对象、数据库连接对象、网络连接对象);未关闭监听器的使用
8、this关键字
this的本质就是“创建好的对象的地址”。
this最常的用法:
1. 在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
2. 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
3. this不能用于static方法中。
9、static关键字
static修饰的成员变量和方法,从属于类。普通变量和方法从属于对象的。
10、静态初始化块
用于类的初始化操作!在静态初始化块中不能直接访问非static成员。
静态初始化块执行顺序(学完继承再看这里):
1. 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。
2. 构造方法执行顺序和上面顺序一样!
11、参数传值机制
Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。 也就是说,我们得到的是“原参数的复印件,而不是原件”。因此,复印件改变不会影响原件。
引用类型指的是“对象的地址”。
12、包
13、package
要点:1. 通常是类的第一句非注释性语句。
2. 包名:域名倒着写即可,再加上模块名,便于内部管理类。
使用:
(1)JDK中的主要包
(2)导入类import
如果我们要使用其他包的类,需要使用import导入,从而可以在本类中直接通过类名来调用,否则就需要书写类的完整包名和类名。import后,便于编写代码,提高可维护性。
要点:1. Java会默认导入java.lang包下所有的类,因此这些类我们可以直接使用。
2. 如果导入两个同名的类,只能用包名+类名来显示调用相关类:
java.util.Date date=new java.util.Date();
(3)静态导入
使用: