接口和内部类

接口的定义:接口不是类,是对类的一组需求描述。

如何实现接口:1.将类声明为实现给定的接口(implements)

       2.对接口中的所有方法进行定义(实现)

接口的特性:1)接口变量必须引用实现了接口的类对象

      2)可以使用 instanceof 检查一个对象是否实现了某个接口

      3)与可以建立类的继承关系一样,接口也可以被扩展

        例如:public interface Powerd  extends Moveable

      4)接口中不能包含 实例域 和 静态方法,但可以包含常量。

      5)接口中的方法 自动被设置为 public,接口中的域 将自动被设置为 public static final 

接口和抽象类的异同:抽象类只能扩展于一个类,即一个类只能继承于一个类;然而,一个类可以实现多个接口。

-----------------------------------------------------------------------------------------------------------------------------------------

内部类:定义在另一个类中的类。

写法

public class OuterClass{
  
  private int var1;
  
  public class InnerClass{
    
        //an inner class,内部类
  }
}

使用内部类的原因:

  1)内部类 方法 可以访问 该类 定义所在作用域中的数据,包括私有的数据。

  2)内部类可以对同一个包中的其他类隐藏起来,换句话说,同一个包中的其他类 是 看不到 内部类的。

  3)当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。

 创建内部类,并不代表:包含 内部类的外围类的对象,都有一个内部类的对象实例域。而是 内部类的对象 包含一个 指向了创建它的外部类对象的隐式引用

通过查询编译后的代码,java 编译器会将 内部类编译成 一个类文件,名称组成: 外围类$内部类.class。在类文件中,会多一个 final 的实例域 this$0。而在外部类的类文件中会多一个 access$0 静态方法。

1)当某个对象只在某个方法中创建一次,那么就可以定义局部内部类

  1)创建局部内部类,不能使用 public 或 private 访问修饰符 进行声明

  2)作用域 只现定于 声明此类所在的块中

  3)相比于其他内部类:局部内部类 可以访问 局部变量(必须被声明为 final

  写法

public class OuterClass{
  
  private int var1;
  
  
  public void method1(){

    //do something
  
     public class InnerClass{
        //当前的 InnerClass 就是一个局部内部类,其作用域就是当前生命的块中,也就是这个方法内
     }
  }
}

2)当只创建某个类的对象时,那么就可以考虑创建 匿名内部类

  超类的写法:

public class SuperType(){
 
  private String var;
  
  public SuperType(String var){
      this.var = var;
  }
}

public void method(SuperType superType){
   //do something
}

method(new SuperType(var){//匿名内部类的参数,只能通过父类传递进去
   //innser class methods and data
});

  接口的写法

  

new Interface (){//匿名内部类的实现接口,不能带有参数,因为接口没有构造函数。
    //innser class methods and data
}

3)当需要把一个类隐藏在另外一个类的内部时,并不需要内部类引用外部类对象,这个时候就可以通过静态内部类来实现。

  

class OuterClass{
  
  public static class StaticClass{
        //静态内部类
   }
}
Read the fucking manual and source code
原文地址:https://www.cnblogs.com/qxynotebook/p/7119119.html