内部类
成员内部类
将一个类直接定义在类的里面,作为成员,与属性或方法层次一次
成员内部类可以与正常类一样 使用不同的修饰符去修饰
好处1.省略了一个.java文件
好处2.成员内部类可以访问外部类的所有成员 包括私有的
若想要在内部类中通过对象.调用外部类成员 外部类.this.外部类成员
内部类存在后 源代码进行编译 产生一个字节码 Demo$InnerDemo.class
局部内部类
将一个类定义在方法/块里面,作为成员的内部结构,与临时的局部变量一个层次
局部内部类像是一个局部变量一样,不能用public protected privtae及staic只能用abstract或final
局部内部类命名规则Demo$InnerTestMethod
局部内部类使用的变量只能用final修饰
匿名内部类
成员匿名内部类<br>
局部匿名内部类
public interface Test{
public void test();
}
Test t = new Test{
public void test(){
}
} ;
通常接口或抽象类的具体子类这样写
开发中为了省略一个类文件 上诉写法比较常见
匿名内部类很特殊 只有类体 没有类的所有结构(修饰符 名字 继承 实现)
不能用任何修饰符来修饰 匿名内部类也没有任何构造方法
静态内部类
成员静态内部类
不需要外部类对象,通过正常的方式直接创建内部类
静态元素不能访问非静态成员(自己类和外部类)
枚举类enum
一个类中的对象 认为个数有限且固定的,可以将每一个对象一一列举出来
1.试一试若没有枚举类型的时候如何动手设计(静态常量 单例模式)Day(类 当做描述星期七个对象)
private 构造方法
public static final 属性 = new
//构造方法私有
private Day(){}
//所有对象都是属性
public static final Day monday = new Day();
2.JDK1.5版本后可以直接定义enmu类型
我们自己定义的enmu类型直接默认继承enmu(java.lang包)
我们自己定义的enmu类型不能再写extrends但是可以实现
Enum类型
有两个属性
name------->枚举对象的名字 name()获取name的属性
ordinal------>枚举对象在罗列中的顺序 类似index 也从0开始 ordinal获取序列号
常用的方法
valueof() 通过给定的name获取对应的枚举对象
values() 获取全部的枚举对象---->返回一个数组 Day[]
compaerTo() 可以比较两个枚举对象 int
toString() 由于这个方法没有final修饰 可以覆盖(重写)
3.我们也可以在enum中描述自己的一些属性或方法
必须在enum类中第一行 描述一下枚举的样子 最后需要分号结束;
可以定义自己的属性
类创建过程中 帮我们创建枚举类型的对象
需要给枚举型提供对应样子的构造方法 方法只能private修饰 可以重载
内存机制问题
栈内存----->Person p = new Person();----->堆内存 方法区----类模板
栈内存----->创建开始 用完立即回收 StackoverflowError
方法区----->类 常量 静态 只有一份回收不了
堆内存----->new创建的对象 Garbage Collection 垃圾回收器
Runtime类之中提供了几个管理内存的方法
maxMemory
totalMemory
freeMemory
堆内存溢出错误OutOfMemoryError
Object类中有一个finalize方法 如果重写也能看见对象回收
GC系统提供的一个线程 回收算法