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.嵌套类

 

 

 

 

posted @ 2021-04-28 00:59  tzy_QaQ  阅读(18)  评论(0)    收藏  举报