类和对象
一、面向对象
1、面向对象和面向过程
- 解决简单问题可以使用面向过程;
- 解决复杂问题:宏观上面向对象,微观上面向过程;
2、面向对象思考方式
- 遇到复杂问题,先从问题中找名词,然后确立这些名词哪些可以作为类
- 再根据问题需求确定该类的特征和行为,确定和其他类之间的关系
3、面向对象三大特征
- 封装性、继承性和多态性
二、类的成员
- 类可以看成一类对象的模板,对象可以看成该类的一个具体实例;
- 类中定义了这一类对象所应具有的共同的属性和方法;
1、属性
类属性(static)
- 整个类就只有一个值,该类的实例共享这一个值
- 类加载的时候自动初始化
- 用类名和实例名加点的方式都是可以访问的
实例属性
- 实例属性的初始化的时机是对象进行初始化的时候
- 一般需要通过构造器手动进行初始化
2、方法
- 方法是该类(实例)行为特征和功能实现;
- 也分为类方法(static)和实例方法
- 类方法不能用 abstract 进行修饰
参数传值机制
- 基本的数据类型是值传递,也就是传递值的副本
- 引用类型是引用传递,传递引用的副本,会受到影响的
3、构造器constructor
- 是一种特殊的方法,用于对象的初始化;
- 方法名和类名一致,可以有参数,也可以有修饰符;
- 有返回值,但不能定义返回值类型;
- 通过new关键词来调用;
- 构造器也可以重载;
4、静态代码块
- 构造方法用于对象的初始化;
- 静态初始化块用于类的初始化操作;
- 静态代码块先于构造器执行;
- 静态代码块和构造器的执行顺序都是从 object 类向下执行;
三、包(package)
1、包的作用
- 是一种源代码文件的组织方式
- 是一种命名空间管理,避免类的同名冲突
- 引入了包一级的封装和存取权限
com.gao
和com.gao.car
,这两个包没有包含关系,是两个完全独立的包,只是逻辑上看起来后者是前者的一部分;
2、类的导入
- 默认导入java.lang包下所有的类,这些类可以直接使用;
- 如果导入两个同名的类,只能用 包名+类名 来区分:
3、静态导入
- 用于导入指定类的静态属性,导入后可以直接使用静态属性
- 静态引入分为单一引入和全体引入
import static java.lang.Math.PI;
import static java.lang.Math.*;
四、修饰符
1、访问修饰符
- public 的访问的权限是最大的
- protected 除了包权限还有子类访问的权限
- default 默认就是包权限
- private 权限最小只有本类能够访问
说明
- 可以修饰类的就 public 和 默认
- 类的成员的话都是可以用的
2、其他修饰符
- transient 指明变量不需要序列化
- volatile 指明变量是一个共享变量
- abstract 指明抽象方法或者抽象类
- synchronized 指明同步方法或者同步代码块
- native 用来集成其他语言的代码
- final 修饰类变量需要马上进行显式的初始化,修饰实例变量直接显式初始化或者在构造方法里面初始化
this 关键字
- this的本质就是 创建好的对象的地址 ;
- 可以用来区分成员变量和局部变量;
- 普通方法中,this总是指向调用该方法的对象;
- 构造方法中,this总是指向正要初始化的对象;
- 在构造方法中使用 this()关键字调用重载的构造方法,并且必须位于构造方法的第一句;
- this不能用于static方法中;
面向对象内存分析
- Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area;
一、栈的特点
- 方法执行入栈,执行完后弹栈;
- JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等);
- 栈属于线程私有,不能线程间共享;
- 栈的存储特性是 先进后出,后进先出 ;
- 栈是一个连续的内存空间,速度快;
二、堆的特点
- 堆用于存储创建好的对象和数组;
- JVM只有一个堆,被所有线程共享;
- 堆是一个不连续的内存空间,分配灵活,速度慢;
- 堆中的常量池;
三、方法区特点
- 一个方法区,所有线程共享;
- 方法区实际也是堆,用来存放程序中永远是不变或唯一的内容(字节码对象、静态成员、字符串常量等);
垃圾回收机制
一、内存管理
- Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放;
- new 则分配内存空间,对象的引用赋值为 null 则释放空间;
二、回收原理
- java虚拟机的垃圾回收机制是基于复杂算法的分代垃圾回收机制
- 调用System.gc(),只是通知JVM,并不是运行垃圾回收器
关于虚拟机的垃圾回收详细可以参考博文https://blog.csdn.net/u010349644/article/details/82191822
1、关于 finalize 方法
- 在对象进行回收前会自动调用对象的 finalize() 方法,所以这个方法一般是用来进行一些资源的释放
- 但是对象回收的顺序和时机是不可预知的,所以这个方法中不要书写依赖于其他操作的代码
三、开发中容易造成内存泄露的操作
- 创建大量无用对象
- 静态集合类的使用,占用大量的内存空间且不容易被垃圾回收
- 各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭
- 监听器的使用
枚举类
- 枚举本质还是一个类
- 默认继承 java.lang.Enum 类
- 可以包含方法和变量
- 构造器的修饰符只能是默认的或者private
- 枚举类开头的常量会自动创建
public enum Planet{
EARTH(12,13),
VENUS(11,89);
private final double mass;
private final double radius;
Planet(double mass,double radius){
this.mass = mass;
this.radius = radius;
}
}
class Test{
public static void main(String[] args) {
System.out.println(Planet.EARTH instanceof Planet);
}
}