一、包
package 包名; ---- 声明包 注意: 一个java文件中只能有一句package语句 , 并且必须放在java文件首行 。
import 包名; --- 导包
import java.util.*; *是一个通配符,会匹配当前包下所有的类,但不会包括子包下的类
java.lang --- 核心类库,一个java程序运行之前会先自动把这个包下所有的类加载到方法区。 不需要手动 导入。 (同包类也 不需要手动导入)
java.util --- 工具包
java.io --- 用于传输数据
java.nio --- 用于处理高并发
java.net ---- 用于网络通信
javax ---- java 扩展包
java.sql --- 数据库交互
org.* ---- 由第三方厂商和一些开源社区提供的包 。
注意: 在自定义包名时 , 不能以java 、 javax 、 org开头 , 否则jvm会去java原生类中寻找你自定义的类 , 这样是永远也找不到的 。
二、内部类
内部类是封装的第三种形式(1. 函数、2. 属性的私有化)
1. 方法内部类
定义在方法内的类。
方法内部类中不能定义静态 变量和方法,但允许定义静态常量。
方法内部类不能使用方法的变量,但能使用方法的常量。
方法内部类可以使用外部类的属性和方法。
方法内部类可以继承其他类
方法内部类调用外部类的方法 : Outer.this.m() ;
除了当前方法外 , 其他地方都不能使用这个方法内部类 。
内部类会比外部类先加载 。
2. 成员内部类
定义在类内方法外
利用外部类对象创建内部类对象
Outer.Inner in = new outer().new Inner();
不能定义静态方法和变量。 但可以定义静态常量 。
可以是用外部类的方法和属性
具有成员属性的特性: 可以被权限修饰符修饰 。
3.静态内部类
用static修饰的成员内部类
Outer.Inner in = new Outer.Inner();
可以定义静态属性和方法。
和普通类 基本没有差别
4. 匿名内部类
匿名内部类本质上就是继承了这个类/实现了这个接口
Class c/*匿名内部类创建的对象*/ = new Class(){
code;//匿名内部类的实体 。
};
有构造函数,单数不能手动定义。
定义在方法内时需要注意的与方法内部类一样
定义在方法外时,需要注意的与成员内部类一样。
匿名内类中 必须要重写 接口\类中的抽象方法 。
只要一个类可以被继承 , 就可以出现匿名内部类的形式。
构造函数可以私有化 。 只是在类外不能被继承 , 在类内可以被内部类继承 。
5. 内部接口
定义在类中或接口中的接口默认是静态的。 理解: 在类定义时不能创建对象 ,要求内部接口要能被直接访问 , 所以要求内部接口是静态的 。
接口中可以定义 类,并且默认是静态,因为接口不能创建对象。 理解: 接口不能创建对象, 所以要求内部类能直接被访问 。
三、垃圾回收机制
1. 对象存储在堆内存中 , 垃圾回收针对堆内存而言。
当调用构造方法的时候,创建对象,存在堆内存中,因为java中对每种数据类型都明确的给定了大小,所以在创建对象的时候会自动计算大小分配内存(具体的数据都是由基本数据类型组成的)。所以在内存的回收和释放的时候也是由java自己管理。
对象在堆内存中存储 , 在使用完成后不会被立即回收 ,而是在 不定时的某个时刻被垃圾回收机制(Grabage collector ---gc)回收 , 回收过程程序员不能手动控制。
2. 一个对象刚创建时是放在新生代的伊甸园区,如果这个对象在栈内存中没有引用,那么会在扫描的时候被解析,释放内存;如果经过一次扫描依然没有释放内存,会将移入新生代的幸存区,幸存区的扫描平率略低于伊甸园区;如果幸存区经过多次扫描依然没有被释放,会被放入老生代,老生代的扫描的频率远低于新生代。老生代的对象一旦被回收,可能导致程序的卡顿或崩溃。
3. 在原生的java中新生代要大于老生代 , 但是在实际开发中为了提高效率 , 往往会增大老生代 , 达到降低扫描频率的目的 。
4. 垃圾回收的线程优先级是相当相当低的 。
minor GC(Garbage Collage) 发生在新生代的回收 ---初代回收
full GC 发生在老生带的回收 ---完全回收
5. 在JDK1.6及以前 , java只把内存分为四块 : 栈 、 堆 、 本地方法栈 、 寄存器 。 而堆中又可以分为:新生代 、 老生代 、 永久带 ,JDK1.6之后 把堆中的永久带独立出来 形成方法区。 现在的内存分块: 栈 、 堆 、 方法区 、 本地方法栈 、 寄存器 。