第八章:接口与内部类

第八章 接口与内部类

接口和内部类为我们提供了一种用来组织和控制系统中对象的更加精致的方法。

1.接口

概念:

Interface关键字创建的,其内部可以有方法声明,但无具体实现(只有形式),接口可以包含字段,但是字段被隐式为static和final的,在接口中所有的方法和字段都显式的声明成public,即使不声明成public,默认的也是public的。

如果要使用这个接口,则通过implements关键字,并且需要实现接口中所有的方法,接口也是可以进行继承(extends),添加新的方法声明,形成新的接口来扩展接口。

使用接口的原因:

1.为了能够向上转型为多个基类型。2.为了防止客户端程序员对接口创建对象。

群组常量:

由于放入接口中的任何字段都自动是static和final的,所以可以利用接口来存储常量组,但是不能是“空final”,但是可以被非常量表达式初始化,例如:在接口中写int randomint=rand.nextInt(10),是可以的。

接口的嵌套:

接口可以嵌套在类或其他接口中,在类中嵌套接口就像非嵌套接口一样,可以拥有public和包访问权限,两种可视性。都可以实现为public、包访问权限和private的类。

当实现某个接口时,并不需要实现嵌套在其内部的任何接口。

2.内部类

概念:

将一个类的定义放在另一个类的定义内部,称之为内部类,能将一些逻辑相关的类组织在一起。

如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须就像在main( )方法中那样,具体地指明这个对象的类型:OutClassName.InnerClassName。

内部类与向上转型:

当内部类向上转型为基类或者转型为一个接口的时候,我们可以利用指向接口的引用来调用该类,就能够很方便的隐藏其细节。这里需要记住,接口的所有成员自动被设置为public的。

普通的(非内部的)类,不能声明为private或protected;它们只可以被赋予public或者包访问权限。

使用内部类的理由:

1.实现某类型的接口,可以创建并返回对其的引用。2.要解决一个问题,需要一个类来协助,但又不想这个类是公共可用的。

局部内部类:

在方法的作用域内创建了一个类称之为局部内部类,局部内部类,在外面是无法直接访问的,需要访问这个方法,通过这个方法创建局部内部类的对象才能访问到,而且其对象并不会因为方法访问结束就消失。

匿名内部类:

内部类无类名,类似于下图所示:

        return new Contents(){

             private int i=11;

public int value(){

return i;

}

};

这种语法是指:创建一个继承自Contents的匿名类的对象。通过new表达式返回的引用被自动向上转型为对Contents的引用。

在匿名内部类末尾的分号,并不是用来标记此内部类结束的,而是用来标记的是表达式的结束,这个匿名内部类正好在表达式里面。

如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。

链接到外部类:

当生成一个内部类的对象时,此对象与制造它的外围对象就有了一种联系,它能访问其外围对象的所有成员,而不需要任何特殊条件,此外,内部类还拥有其外围类的所有元素的访问权。

在一个普通的(非static)内部类中,通过一个特殊的this引用可以链接到其外围类对象。嵌套类中就没有这个特殊的this引用。

内部类是如何对外围类所有成员的访问权?

当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会保存一个指向那个外围类对象的引用,所以内部类的对象只能在与其外围类的对象关联的情况下才能被创建。构建内部类对象时,需要一个指向其外围类对象的引用。

嵌套类

如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static。这通常称为嵌套类。

嵌套类的意义:

要创建一个嵌套类的对象,并不需要其外围类的对象;不能从嵌套类的对象中访问非静态的外围类对象。

内部类不能有static数据和static字段,也不能包含嵌套类。

内部类的创建:

如果想要直接创建内部类的对象,不能想当然地认为只需加上外围类的名字,就可以按照通常的样子生成内部类的对象,而是必须使用此外围类的对象来创建其内部类的对象:

A.B c=p.new B( );其中A是外围类,B是内部类,p是外围类对象的引用,除非已经有了外围类的一个对象,否则不可能生成内部类的对象。

内部类可以被覆盖吗?

当继承了某个外部类时,内部类并没有什么特殊的变化,这两个内部类是完全独立的实体,各自在自己的命名空间内。

局部内部类:

在代码块中创建的内部类,局部内部类不能有访问说明符,因为他不是外围类的一部分,但是它可以访问当前块内的常量以及外围类的所有成员,使用局部内部类而不适用匿名内部类的唯一理由是:需要不止一个该内部类的对象。

使用内部类的理由:

1.每一个内部类都能独立地继承一个接口实现,从而实现了java中没有的“多重继承”

2.如果拥有的是抽象的类或具体的类,而不是接口,那就只能使用内部类才能实现多重继承。

3.内部类可以有很多实例,每一个实例都有自己的状态信息,与外围类对象信息相互独立。

4.内部类是一个独立的个体,多个内部类能够实现同一个接口。

原文地址:https://www.cnblogs.com/xiaobaidashu/p/12125451.html