java编程思想读书笔记-第八章 接口和内部类

本文深入探讨了Java中接口的概念及使用方式,并介绍了内部类的特点和应用场景,包括如何通过内部类访问封装类的方法与字段。

第八章 接口和内部类

 接口可以强转至多个基类。

 

 import java.util.*;

interface CanFight {

void fight();

}

interface CanSwim {

void swim();

}

interface CanFly {

void fly();

}

class ActionCharacter {

public void fight() {}

}

class Hero extends ActionCharacter

implements CanFight, CanSwim, CanFly {

public void swim() {}

public void fly() {}

}

public class Adventure {

static void t(CanFight x) { x.fight(); }

static void u(CanSwim x) { x.swim(); }

static void v(CanFly x) { x.fly(); }

static void w(ActionCharacter x) { x.fight(); }

public static void main(String[] args) {

Hero h = new Hero();

t(h); // Treat it as a CanFight

u(h); // Treat it as a CanSwim

v(h); // Treat it as a CanFly

w(h); // Treat it as an ActionCharacter

}

} ///:~

 

1.不同的接口合并到一起,使用相同的方法,请尽量避免。

2.接口中的方法自动具有static和final属性

3.嵌套接口(内部接口)存在。

4.内部类:要解决一个复杂问题,创建类为自己的程序方案提供辅助,但同时不愿意将它公开。

 

8.2.2方法和作用域中的内部类

public Contents cont() {
return new Contents() {
private int i = 11;
public int value() { return i; }
};
}

 

匿名内部类使用了一个在其外部定义的对象,为什么编译器要求其参数引用是final呢?

JVM中每个进程都会有多个根,每个static变量,方法参数,局部变量,当然这都是指引用类型.基础类型是不能作为根的,根其实就是一个存储地址.垃圾回收器在工作时先从根开始遍历它引用的对象并标记它们,如此递归到最末梢,所有根都遍历后,没有被标记到的对象说明没有被引用,那么就是可以被回收的对象(有些对象有finalized方法,虽然没有引用,但JVM中有一个专门的队列引用它们直到finalized方法被执行后才从该队列中移除成为真正没有引用的对象,可以回收,这个与本主题讨论的无关,包括代的划分等以后再说明).这看起来很好.

但是在内部类的回调方法中,s既不可能是静态变量,也不是方法中的临时变量,也不是方法参数,它不可能作为根,在内部类中也没有变量引用它,它的根在内部类外部的那个方法中,如果这时外面变量s重指向其它对象,则回调方法中的这个对象s就失去了引用,可能被回收,而由于内部类回调方法大多数在其它线程中执行,可能还要在回收后还会继续访问它.这将是什么结果?

而使用final修饰符不仅会保持对象的引用不会改变,而且编译器还会持续维护这个对象在回调方法中的生命周期.所以这才是final变量和final参数的根本意义.

 

内部类可以从封装类访问方法与字段(包括private)。

内部类必须拥有对封装类的特定对象的一个引用 而封装类的作用就是创建这个内部类随后,当我们引用封装类的一个成员时 就利用那个隐藏的引用来选择那个成员。

 8.2.5 静态内部类

不能访问外部资源

 

 8.2.10 内部类标识符

 WithInner$Inner.class

封装类名+$+内部类名。匿名则生成数字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值