一、概述
1、面向对象和面向过程的总结
- 解决简单问题可以使用面向过程;
- 解决复杂问题:宏观上面向对象,微观上面向过程;
2、面向对象思考方式
- 遇到复杂问题,先从问题中找名词,然后确立这些名词哪些可以作为类;
- 再根据问题需求确定的类的属性和方法,确定类之间的关系;
3、面向对象具有三大特征:封装性、继承性和多态性
二、类和对象
1、对象的本质
- 对象说白了也是一种数据结构,将数据和数据的行为放到了一起;
- 在内存上,对象就是一个内存块,存放了相关的数据集合;
- 对象的本质就一种数据的组织方式;
2、类和对象的关系
- 对象是具体的事物;类是对对象的抽象;
- 类可以看成一类对象的模板,对象可以看成该类的一个具体实例;
- 类是用于描述同一类型的对象的一个抽象概念,类中定义了这一类对象所应具有的共同的属性和方法;
3、类
(1)类的成员:属性field、方法method、构造器constructor
(2)属性(field、成员变量)
- 属性是该类(实例)的包含数据和静态特征;
- 分为静态成员(static)和非静态成员;
- 成员变量默认初始化,可以直接使用;
(3)方法
- 方法是该类(实例)行为特征和功能实现;
- UML类图
(4)构造器constructor
- 是一种特殊的方法,用于对象的初始化;
- 方法名和类名一致,可以有参数,也可以有修饰符;
- 有返回值,但不能定义返回值类型;
- 通过new关键词来调用;
- 构造器也可以重载;
4、面向对象的内存分析
- Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area;
(1)栈的特点如下:
- 方法执行入栈,执行完后弹栈;
- JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等);
- 栈属于线程私有,不能线程间共享;
- 栈的存储特性是 先进后出,后进先出 ;
- 栈是一个连续的内存空间,速度快;
(2)堆的特点如下:
- 堆用于存储创建好的对象和数组;
- JVM只有一个堆,被所有线程共享;
- 堆是一个不连续的内存空间,分配灵活,速度慢;
- 堆中的常量池;
(3)方法区(静态区)特点如下:
- 一个方法区,所有线程共享;
- 方法区实际也是堆,用来存放程序中永远是不变或唯一的内容(字节码对象、静态成员、字符串常量等);
(4)内存分析:
5、垃圾回收机制(Garbage Collection)
(1)内存管理:
- Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放;
- new 则分配内存空间,对象的引用赋值为 null 则释放空间;
(2)回收原理
- 发现无用对象,回收相应的空间;
(3)回收算法
- 引用计数法,无法识别循环引用;
- 引用可达法(根搜索算法);
(4)通用的分代垃圾回收机制
- 年轻代(Minor GC清理年轻代区域)
- 年老代(Major GC清理老年代区域)
- 持久代(Full GC清理年轻代和年老代区域)
- Full GC 成本高,影响系统性能
- 调用System.gc(),只是通知JVM,并不是运行垃圾回收器
(5)开发中容易造成内存泄露的操作
- 创建大量无用对象
- 静态集合类的使用
- 各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭
- 监听器的使用
6、this 和 static 关键字
(1)对象创建的过程
- 分配对象空间,初始化成员变量;
- 执行属性值的显示初始化;
- 执行构造方法;
- 返回对象的地址给相关的变量;
(2)this
- this的本质就是 创建好的对象的地址 ;
this用法:
- 用来区分成员变量和局部变量;
- 普通方法中,this总是指向调用该方法的对象;
- 构造方法中,this总是指向正要初始化的对象;
- 在构造方法中使用 this()关键字调用重载的构造方法,并且必须位于构造方法的第一句;
- this不能用于static方法中;
(3)static
- 类中的变量和方法可以加 static 来修饰;
- static修饰的成员变量和方法,从属于类;
- 普通变量和方法从属于对象的;
- 静态成员的调用:类名/对象.成员;
- 静态不能调用非静态,反之可以;
7、静态代码块
(1)静态代码块和构造器的区别
- 构造方法用于对象的初始化;
- 静态初始化块用于类的初始化操作;
- 静态代码块先于构造器执行;
- 静态代码块和构造器的执行顺序都是从 object 类向下执行;
8、参数传值机制
- Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”;
- 基本类型和引用类型的传参;
9、包(package)
(1)包的概念:类似于文件夹,用来进行分类管理的;
(2)com.gao和com.gao.car,这两个包没有包含关系,是两个完全独立的包,只是逻辑上看起来后者是前者的一部分;
(3)类的导入
-
默认导入java.lang包下所有的类,这些类可以直接使用;
-
如果导入两个同名的类,只能用 包名+类名 来区分:
(4)静态导入(import static)用于导入指定类的静态属性,导入后可以直接使用静态属性。