目录
一.内部类:
1.概念:
2.内部类的分类:
(1)定义在外部类的局部位置上(通常在方法体中):
1. 局部内部类(有类名)
2.匿名内部类(无类名-重点!!!)
3.匿名内部类的细节:
(2)定义在外部类的成员位置:
3.成员内部类(不用static修饰)
4.静态内部类(使用static修饰)
二.枚举:
1.定义:
2.自定义枚举:
3.使用关键字enum来实现枚举:
4.enum关键字实现枚举的注意事项:
5.enum方法介绍:
三.注解:
(1)注解细节:
(2)元注解:
1.Retention:
2.Target:
3.Document:
4.Inherited:
一.内部类:
1.概念:
一个类的内部又完整的嵌套另一个类,被嵌套的类称为内部类,嵌套其他类的类称为外部类,类的五大成员包括属性、方法、构造器、代码块、内部类。内部类的最大特点就是可以直接访问私有熟悉,并且可以体现类与类之间的包含关系。
2.内部类的分类:
(1)定义在外部类的局部位置上(通常在方法体中):
1. 局部内部类(有类名)
- 可以直接访问外部类的所有成员,包括私有的,作用域位于定义它的方法或代码块中。
 - 不能添加访问修饰符,因为它是局部变量,局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量可以使用final修饰。
 - 局部内部类可以直接访问外部类的成员,外部其他类不能访问局部内部类。
 - 如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员则可以使用【外部类名.this.成员】去访问。
 
class Outer{
   private int n1 = 100;
   private void m2(){
      System.out.println("Outer m2()");
   }
   public void m1(){
      final class Inner {
          private int n1 = 200;
          public void f1(){
             System.out.println("Inner"+n1);//就近原则输出200
             System.out.println("Outer"+Outer.this.n1);//输出100
             m2();
          }
      }
   }
}
 
2.匿名内部类(无类名-重点!!!)
- 本质:匿名内部类是无名字的内部类,同时是一个对象。
 - 基本语法:new 类或接口(参数列表){类体};
 
3.匿名内部类的细节:
- 可以访问外部类的所有成员,包括私有的
 - 不能添加访问修饰符,因为它是一个局部变量。
 - 作用域:仅仅在定义它的方法或代码块中
 - 如果外部类和匿名内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员则可以使用【外部类名.this.成员】去访问。
 
class Outer04{
    private int n1 =10;
    public void method() {
        //tiger的编译类型是接口IA,运行类型是匿名内部类。
        //匿名内部类使用一次就不能再使用
        // class Outer04$1 implements IA{
        //public void cry() {
        //System.out.println("老虎叫");
        //}
        //}
        IA tiger = new IA() {
            @Override
            public void cry() {
                System.out.println("老虎叫");
            }
        };
        tiger.cry();
        Father father = new Father("jack");//father1编译类型Father,运行类型Father
        Father father1 = new Father("jack"){//创建匿名内部类,father1编译类型Father,运行类型Outer04$2
            //参数Jack会传递给构造器
            @Override
            public void test() {
                System.out.println("匿名内部类重写test()方法");
            }
        };
        System.out.println("father对象的运行类型"+father1.getClass());//Outer04$2
        father1.test();
        new Father("tom"){//匿名内部类返回对象,可直接调用方法
            @Override
            public void test() {
                super.test();//Father类中的test方法
                System.out.println("重写匿名内部类2");
            }
        }.test();//匿名内部类返回对象,可直接调用方法
}
}
interface IA {
    public void cry();}
class Father {
    public Father(String name){ }
    public void test(){
    System.out.println("Father类中的test方法");}
} 
(2)定义在外部类的成员位置:
3.成员内部类(不用static修饰)
(1)概念:定义在外部类的成员位置,并且没有static修饰。
(2)细节:
- 可以直接访问外部类的所有成员,包含私有的,可以添加任意访问修饰符。外部类也可以直接访问内部类中的成员。
 - 作用域:和外部类的其他成员一样,为外部类的整体。
 - 如果外部类和成员内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员则可以使用【外部类名.this.成员】去访问。
 - 外部类访问内部类的三种方法:
 
public class InnerClassExercise01 {
    public static void main(String[] args) { 
       Outer08 outer08 = new Outer08;
       outer08.t1();
       //相当于把new Inner08()当做outer08成员(第一种方法得到Inner08的对象实例)
       Outer08.Inner08 inner08 = outer08.new Inner08();(第二种方法)
       Outer08.Inner08 inner08Instance = outer08.getInner08Instance();
       Outer08.m1();
       Outer08.Inner10 inner100 = new Outer.Inner10();//静态内部类可以通过类名直接访问(方法一)
       Outer08.Inner10 inner101 = outer08.getInner10();
       Outer08.Inner10 inner102 = Outer08.getInner10();
       inner10.say();
       
    } 
}
class Outer08{
      private int n1=10;
      class inner08{//成员内部类
      public double sal =99.8;
      public void say(){
             System.out.println("n1="+n1); 
      }
      }
     //第二种方法得到Inner08的实例
      public Inner08 getInner08Instance(){
             return new Inner08();
      }     
      public void t1(){
             Inner08 inner = new Inner08();
             Inner08.say();
      }
       static class Inner10{//静态内部类
              public void say(){
              System.put.println(name);
              say();
              }
       }
       public void m1(){
             Inner08 inner10 = new Inner10();
             Inner10.say();
      }
       public Inner10   getInner10(){
              return new Inner10();  
}
      
       
4.静态内部类(使用static修饰)
(1)概念:定义在外部类的成员位置,并且有static修饰。
(2)细节:
- 可以访问外部类的所有静态成员,包含私有的,但是不能直接访问非静态成员。
 - 可以添加任意修饰符,作用域为整个整体。
 - 如果外部类和静态内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员则可以使用【外部类名.成员】去访问。
 
二.枚举:
1.定义:
枚举是一组常亮的集合,属于一种特殊的类,里面只包含一组有限的特定的对象。
2.自定义枚举:
- 将构造器私有化
 - 删除set相关方法,防止属性被修改
 - 在season内部,直接创建固定的对象
 

3.使用关键字enum来实现枚举:

- 使用关键字enum来替代class
 - 常量名(实参列表)
 - 如果有多个常量对象,使用 ,间隔即可
 - 如果使用enum来实现枚举要求将定义的常量对象写在前面。
 
4.enum关键字实现枚举的注意事项:
- 当使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类。
 - 如果使用无参构造器创建枚举对象时,则无参构造器可以省略括号--()。
 - 当有多个枚举对象时,使用 ,间隔,最后用一个分号结尾。
 - 枚举对象必须放在枚举类的行首。
 - 使用enum关键字后,就不能再继承其他类了,enum会隐式继承Enum。
 - 枚举类和普通类一样可以实现接口。
 
5.enum方法介绍:

(1)values :返回当前枚举类中所有的常量
Season[] values = Season.values();
for(Season season:values){//增强for循环
   System.out.println(season);
} 
(2)valuesof:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则异常
根据你输入的"AUTUMN"到Season的枚举对象去查找,找到了就返回,没找到就报错。
Season autumn1 = Season.valuesof("AUTUMN");
System.out.println("autumn1="+autumn1);//autumn1=Season{name='秋天',desc='温暖'}
System.out.println(autumn == autumn1);//true 
(3)compareTo:比较两个枚举变量的编号(Season.AUTUMN--枚举对象)
三.注解:
(1)注解细节:
- 注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
 - 修饰注解的注解称为元注解。
 - SuppressWarnings的作用范围是和你放置的位置有关
 

(2)元注解:

1.Retention:

![]()
2.Target:
![]()
3.Document:
![]()
4.Inherited:



















