接口和内部类
接口的定义:接口不是类,是对类的一组需求描述。
如何实现接口: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{ //静态内部类 } }