JavaSE基础 (十八)

内部类

成员内部类

将一个类直接定义在类的里面,作为成员,与属性或方法层次一次
成员内部类可以与正常类一样 使用不同的修饰符去修饰
好处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系统提供的一个线程  回收算法