Thinking in java自读笔记:内部类

首先推荐一篇内部类讲解详细的博客地址:https://www.cnblogs.com/dolphin0520/p/3811445.html

一.内部类的四种类型

  • 成员内部类
  • 局部内部类
  • 匿名内部类
  • 静态内部类

(一)成员内部类是最普通的内部类,直接在一个外部类里面定义一个成员类(即内部类)。

class OutClass
{
    class InnerClass
    {
        private int i;
        public InnerClass(int i)
        {
            i=this.i;
        }
        public int getI() {
            return i;
        }
    }
    public InnerClass Get()
    {
        return new InnerClass(10);
    }
}

成员内部类的初始化方式一般有2种:

  • 定义一个外部类的对象,然后用外部类的对象new一个内部类对象。
    OutClass out=new OutClass();
    OutClass.InnerClass inner=out.new InnerClass(10);
  • 在外部类里面定义一个方法new一个内部类对象。
    OutClass.InnerClass inner=out.Get();

注意点:内部类如果与外部类有相同的方法和字段,则内部类会覆盖外部类的方法和字段,要访问外部类的方法和字段要用:外部类.this.方法和外部类.this.字段来访问。成员内部类可以无条件访问外部类的成语或字段,但外部类访问成员内部类只有通过内部类的对象来访问。成员内部类因为像外部类的一个成员,因此具备四种访问权限,具体访问权限可以理解为一个成员变量。
(二)局部内部类
局部内部类是定义在一个方法内部或者一个作用域里面的类,和成员类相比较的话,可以把成员类比较为一个外部类的成员,局部类则是一个作用域的临时成员,因此不能设置访问权限。

class OutClass
{
    int i;
    public OutClass Get()
    {
        class InnerClass extends OutClass
        {
            int num;
            public InnerClass(int num)
            {
                this.num=num;
            }
        }
        return new InnerClass(10);
    }
}

在该测试代码中,返回的内部类上溯造型成一个外部类对象。
(三)匿名内部类
匿名内部类一般继承与抽象类或者接口,重写其中的方法供回调使用,在写事件的监听与维护方面十分方便。

public class Test {
    public static void main(String[] args)
    {
        OutClass out=new OutClass();
        IPrint ip=out.Get();
        ip.print();
    }
}
interface IPrint
{
    void print();
}
class OutClass
{
    public IPrint Get()
    {
        return new IPrint() {
            @Override
            public void print() {
                System.out.println("测试");
            }
        };
    }
}

(四)静态内部类
静态内部类可以不依赖于一个外部类对象,可以直接理解为一个外部类的静态成员变量,用外部类.内部类的形式访问。

public class Test {
    public static void main(String[] args) {
        System.out.println(new OutClass.Inner());
    }
}
class OutClass
{
    int i;
    public static class Inner
    {
        public static int num=5;
        public Inner()
        {
            System.out.println("------")
        }
    }
}

总结除了匿名内部类以外,成员内部类,局部内部类以及静态内部类都可以理解为一个类的类成员,局部变量以及静态成员,作为成员,因此保留着成员的特性,如访问权限等,可以和普通的成员访问一样访问它们,但作为类,它们又拥有类的特性,因此可以把这3种内部类看作为成员与类的结合体,同时拥有着成员与类的特性。

猜你喜欢

转载自blog.csdn.net/qq_27368993/article/details/82663641
今日推荐