• 接口中可以定义默认(default)方法.
  • 在局部内部类和匿名内部类中,访问它所在方法的局部变量可以省略final修饰.

接口中可以定义默认(default)方法

  1. /**
  2. * 接口中可以定义默认(default)方法
  3. */
  4. interface TestInter{
  5. /**
  6. * 接口中可以定义有方法体的方法,如果是非静态,必须用default修饰
  7. */
  8. public default void print(){
  9. System.out.println("hello world!");
  10. }
  11. /**
  12. * 如果是静态的就不需要default修饰了
  13. */
  14. public static void test(){
  15. System.out.println("interface TestInter: public static void test()");
  16. }
  17. }
  18. class TestClass implements TestInter {
  19. }
  1. @Test
  2. public void demo1(){
  3. TestClass test = new TestClass();
  4. test.print();
  5. TestInter.test();
  6. }

内部类访问局部变量时的final修饰

在局部内部类和匿名内部类中,访问它所在方法的局部变量可以省略final修饰

关于在局部内部类和匿名内部类中,访问它所在方法的局部变量时的问题 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么? 因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失, 那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了, 如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用**

  1. @Test
  2. public void demo2(){
  3. /**
  4. * JDK1.8之前必需要加final
  5. * JDK1.8起可以省略final
  6. */
  7. //final int var = 1;
  8. int var = 1;
  9. class Inner{
  10. public void fun(){
  11. //虽然可以省略final,但是还是不能修改,可以认为它会默认加上final关键字
  12. //var = 2;
  13. System.out.println(var);
  14. }
  15. }
  16. Inner inner = new Inner();
  17. inner.fun();
  18. }