面向对象
1. 面向对象和面向过程思想的总结:
a. 都是解决问题的思维方式,都是代码组织的方式;
b. 面向过程是一种 “执行者思维”,解决简单问题可以使用面向过程;
c. 面向对象是一种 “设计者思维”,解决复杂、需要协作的问题可以使用面向对象;
d. 面向对象离不开面向过程:宏观上同多面向对象进行整体设计,微观上执行和处理数据,仍然是面向过程。
- 类和对象的关系
a. 类可以堪称一类对象的模版,对象可以看成该类的一个具体实例;
b. 类是用于描述同一类型的对象的一个抽象的概念,类中定义了这一类对象所应具有的共同的属性、方法。
3. 类的定义
三种成员: 属性 field 、方法 method、 构造器 constructor
a. 属性(成员变量)用于定义该类或该类对象包含的数据或者说静态特征
b. 方法 用于定义该类或该类实例的行为特征和功能实现;
public class SxtStu {
int id; int age; String name;
public void study() {
System.out.println("正在学习");
}
public void kickball() {
System.out.println("正在踢球");
}
}
c. 构造方法 (构造器):
创建对象的四步:
-
分配对象空间,并将对象成员变量初始化为0或空;
-
执行属性值得显式初始化
-
执行构造方法
-
返回对象的地址给相关的变量。
声明格式
[修饰符] 类名(形参列表){
// n条语句
}
d. 构造器要点:
1 构造器通过new关键字调用
2 构造器虽然有返回值,但是不能定于返回值类型 (返回值的类型肯定是本类),不能在构造器里使用return返回某个值
3 如果我们没有定义构造器,则编辑器会自动定义一个无参的构造方法; 4 构造器的方法名必须和类名一致
-
构造方法的重载
public class User { int id; String name; String pwd; public User(){} public User(int _id) { id = _id; } public User(int _id,String _name) { id = _id; name = _name; } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public static void main(String[] args) { User u = new User(); } }
内存模型:
Java 虚拟机的内存可以分为三个区域: 栈stack 、堆heap、方法区 method area。 虚拟机栈的特点如下:
-
栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈(存储局部变量、操作数、方法出口等);
-
JVM 为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等);
-
栈属于线程私有,不能实现线程间的共享;
-
栈的存储特性是 “先进后出,后进先出”
-
栈是由系统自动分配,速度快,栈是一个连续的内存空间;
堆的特点如下:
1. 堆用于存储创建好的对象和数组 (数组也是对象);
-
JVM只有一个堆,被所有线称共享;
-
堆是一个不连续的内存空间分配灵活,速度慢;
-
堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。
方法区(也是堆)特点如下:
- 方法区是JAVA 虚拟机规范,可以有不同的实现
a. JDK7以前是“永久代”;
b. JDK7 部分去除“永久代”,静态变量、字符串常量池都挪到了堆内存中
c. JDK8 是“元数据空间” 和堆结合起来
-
JVM只有方法区,被所有线程共享;
-
方法区实际也是堆,只是用于存储类、常量相关的信息
-
用来存放程序永远是不变或唯一的内容。(类信息,静态变量、字符串常量等);
-
常量池主要存放常量:如文本字符串、final 常量值。
java中方法所有参数都是“值传递”;
-
基本数据类型参数的传值:传递的是值的副本,副本改变不会影响原件;
-
引用类型参数的传值: 传递的是值的副本。但是引用类型指的是 “对象的地址”。
因此,副本和原参数指向了同一个地址,改变 副本指向地址对象的值,也意味着原参数指向对象的值也会发生改变.
垃圾回收机制 (Garbage Collection)
-
内存管理:Java 的内存管理很大程度就是:堆中对象的管理,其中包括对象空间的分配和释放 对象空间的分配: 使用new 关键字创建对象即可 对象空间的释放: 将对象赋值 null 即可 。
-
垃圾回收过程
任何一种垃圾回收算法一般要做两件基本事情:
1 发现无用对象;
2 回收无用对象占用的内存空间 垃圾回收机制保证可以将 “无用的对象”进行回收 无用的对象指的是 没有任何变量引用该对象。 Java的垃圾回收器通过相关算法发现无用对象,并进行清楚和整理;
3. 垃圾回收的相关算法
1, 引用计数法: 堆中的每个对象都对应一个引用计数器,当有引用指向这个对象时,引用计数器加1,当指向该对象的引用失效时(引用变为null),引用计数器减1,最后如果对象的引用计数器的值为0时,优点时算法简单,缺点是“循环引用的无用对象” 无法识别;
2, 引用可达法 (根搜索算法) 程序把所有的引用关系看作一张图 从一个节点GC ROOT 开始,寻找对应的引用节点,找到这个节点以后们继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用的节点,即无用节点。
4. 分代垃圾回收机制
1, Minor GC : 用于清理年轻代区域。Eden区满了就会触发一次Minor GC。清理无用对象,将有用对象赋值到 “Survivor1” 、“Survivor2”区中。
2, Major GC: 用于清理老年代区域
3, Full GC: 用于清理年轻代、年老代区域。 成本高,会对系统性能产生影响;
内存泄漏:指堆内存由于某种原因程序未释放, 造成内存浪费,导致运行速度减慢甚至系统崩溃等。
-
创建大量无用对象
-
静态集合类的使用: 像HashMap、Vector、List等的使用最容有出现内存泄漏,这些静态变量的声明周期和应用程序一致,所有的对象也不能被释放。
-
各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭;
-
监听器使用不当;
其他要点
-
程序员无权调用垃圾回收器;
-
程序员可以调用System.gc(), 该方法只是通知JVM,并不是运行垃圾回收器。尽量少用,会申请Full GC,成本高、影响系统性能
-
Object对象的finalize方法,是java提供给程序员来释放对象或资源的方法名,但是尽量少用。
this 关键字
this 当前对象本身;本质就是 “当前对象的地址”
用法:
-
普通方法中,this总是只想调用该方法的对象 ;
-
构造方法中,this 总是指向正要初始化的对象。
-
this() 调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用没并且必须位于构造方法的第一位;
-
this 不能用于static方法中;
static 关键字: 属于类 静态变量(类变量)、静态方法(类方法):static声明的属性或方法 .
静态变量/静态方法生命周期和类相同,在整个执行期间都有效:特点如下:
-
为该类的公用变量,属于类,被该类的所有实例共享,在类载入时被初始化;
-
static 成员变量只有一份;
-
在静态方法中不能直接访问非static 的成员;
-
一般用 “类名.类属性/方法”来调用;
静态初始化块 : 构造方法用于对象的普通属性初始化。
1 静态初始化块,用于类的初始化,初始化静态属性。
2 在静态初始化快中不能直接访问非static 成员。
注意_:静态初始化开执行顺序 > 1. 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化快,直到类的静态初始化块为止。 > 2. 构造方法执行顺序和上面顺序一样。_
变量的分类和作用域
局部变量(方法)、成员变量(对象)、静态变量(类)
包机制
-
包(package)相当于文件夹对于文件的作用,用于管理类、用于解决类的重名问题;
-
使用要点:
a.通常是类的第一句非注释性语句;
b. 包名:域名倒着写即可,便于内部管理类 > 例如: com.oracle.test ... >
注意: 写项目时都要加包,不要使用默认包;
导入类 import :
静态导入: 其作用是用于导入指定类的静态属性和静态方法,这样我们可以直接使用静态属性和静态方法 ;
java import static java.lang.Math.* ; // 导入Math类的所有静态属性 import static
java.lang.Math.PI ; // 导入Math 类的PI属性