Java学习笔记:0
关于Java内部类
1.啥是内部类?
一个定义在别的类中的类
2.创建内部类
(1)把类的定义放在外部类里即可
(2)一个常见的用法是外部类里有一个方法,该方法返回指向内部类的引用
(3)如果想在外部类里创建一个内部类对象,直接使用”new 构造方法“即可
(4)如果在外部类外面,内部类名为“外部类名.内部类名"
3.链接外部类
(1)内部类最特别之处在于:当我们生成一个内部类对象时,他可以访问其外部类对象的所以成员
这必须要求一件事,就是内部类里隐式的存了一个外部类对象的引用
这又可以推断出一件事,内部类对象是基于外部类对象的,也就是说得先有外部类对象,才能生成内部类对象(非static 内部类)
由此引出了.new 与.this
(2).new与.this
通过“外部类名.this”我们可以得到外部类对象的引用
当我们有一个外部类对象时,我们想创建一个基于他的内部类对象时,使用“外部类对象.new 内部类构造方法”即可
(注意:我们不能在没有外部类对象的情况下创建非static内部类对象,这时因为内部类必须链接到外部类上)
例如:outerClass.innerClass myinner=new outerClass().new innerClass
等价于:outerClass myouter=new outerClass();outerClass.innerClass myinner=myouter.new innerClass;
4.内部类与向上转型
我们可以通过private内部类实现一个接口,这样做的好处是此接口的实现完全不可见,我们只能通过一个方法得到此接口的引用
(可以对比下直接在外部类里实现接口)
到此为止,我们展示的都是内部类的平凡用法,接下来我们会讲解一些内部类的复杂用法
例如:匿名类,嵌套类,定义在方法中的类(局部内部类)-->任意作用域里的类
5.匿名内部类
(1)直接给一个例子:
// innerclasses/Parcel7.java
// Returning an instance of an anonymous inner class
public class Parcel7 {
public Contents contents() {
return new Contents() { // Insert class definition
private int i = 11;
@Override
public int value() { return i; }
}; // Semicolon required
}
public static void main(String[] args) {
Parcel7 p = new Parcel7();
Contents c = p.contents();
}
}
我们可以看到,contents方法把返回值与定义结合在了一起,这得到了一个什么呢?
没错,我们在创建Contents类的对象时定义并创建了一个继承自Contents类的匿名类的对象(注意Contents可以是类,抽象类,接口)
(2)在定义内部类时,如果我们要使用一个外部类对象,编译器要求这个对象必须是final的,或者“effectively final”即虽然不加final 关键字,但是不能对其做修改
(3)匿名类的限制:不能重载初始化方法了,并且和正规继承相比,匿名类要么继承类,要么继承接口,并且都只能继承一个。
6.嵌套类

浙公网安备 33010602011771号