第十章:内部类

可以将一个类的定义放在另一个类的定义内部,这就是内部类。

1.创建内部类

package com.myboy.innerclass;
public class TestA {
class B{
private String g;
public B(String arg){
this.g=arg;
}
public String getG(){
return g;
}
}
public static void main(String[] args) {
TestA tA=new TestA();
System.out.println(tA.ship("zhuluzhenshuai"));
}
private String ship(String g) {
B b=new B(g);//内部类的对象引用
return b.getG();
}
}

2.链接到外部类

当生成一个内部类对象的时候,此对象就与他创建外部类对象有关系。内部类可以访问外部类所有成员而不需要条件。内部类对象还有外部类对象所有的访问权限。(注:容器中的相关类中的迭代器)
package com.myboy.innerclass;
//有点参照ArrayList的写法,迭代器设计模式
interface Selector {
boolean end();

Object Current();// Obeject 真的没有优势了

void next();
}
public class Sequence {
private Object[] items;
private int next = 0;

public Sequence(int size) {
items = new Object[size];
}

public void add(Object x) {
if (next < items.length)
items[next++] = x;
}
private class SequenceSelector implements Selector {
private int i = 0;

public boolean end() {
return i == items.length;
}

public Object Current() {
return items[i];
}

public void next() {
if (i < items.length)
i++;
}

}
public Selector selector() {
return new SequenceSelector();
}
public static void main(String[] args) {
Sequence sequence = new Sequence(10);
for (int i = 0; i < 10; i++)
sequence.add(Integer.toString(i));
Selector selector = sequence.selector();
while (!selector.end()) {//内部对象引用,能调用所有的基类的成员
System.out.println(selector.Current());//都能引用
selector.next();
}
}
}
内部类对象只能与外部类对象相关联的情况下才能被创建(内部类非static时),在创建内部类是,需要可以引用到外部类对象,如果编译器访问不到这个引用,就会报错。

3. 使用.this和new

当需要对生成的外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this。这样产生的引用自动的具有正确的类型。
当要告知某些其他对象,去创建某某个内部类的对象,要实现这个,必须在new表示式中提供对其他外部类对象的引用( 除非是静态内部类,让其自动初始化),这是需要使用.new语法
package com.myboy.innerclass;
public class DotThis {
public void f(){
System.out.println("DotThis.f()");
}
public class Inner{
public DotThis outer(){
return DotThis.this;// .this的用法,直接引用到外部
}
}
public Inner inner(){
return new Inner();
}
public static void main(String[] args){
DotThis dt=new DotThis();
DotThis.Inner dti=dt.inner();
DotThis.Inner dtii=dt.new Inner();//创建了内部类对象,同时也创建了内部类和外部类之间的引用
dti.outer().f();//out: DotThis.f()
}
}

4. 内部类和向上转型(感觉错的,没意义)

当内部类向上转型为其基类,尤其是转型为一个接口的时候,内部类就有用武之地了。(从实现了某个接口的对象,得到了对此接口的引用,与向上转型为这个对象的基类,实际上效果是一样的。)
内部类中有访问权限,这个因为此内部类--某个接口的实现---能够完全不可见,并且不可用,只能通过基类的或接口的引用才能访问到。(内部类的实现完全被隐藏(解耦))

5. 方法和作用域之间的内部类

在方法域和其他域直接的创建的内部类,大众编程风格,根本不会这么写

6.匿名内部类(内部类的特殊写法)(后续学习设计模式的时候在追踪)

package com.myboy.innerclass;
abstract class Person{
abstract void eat();//此处的研究,内部类的作用。提供一个抽象方法
}
public class Test5 {
public static void main(String[] args) {
Person p=new Person(){
public void eat(){
System.out.println("zhulueat");
}
};
}
}
注:在学习设计模式的时候,工厂模式如何用匿名内部类去写。
内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外层类是否已经继承了某个(接口的)实
现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角
度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值