java内部类的浅谈(错误之处还请见谅!)

在java中,内部类是指在一个外部类的内部再定义一个类(即类中的类)。类名不需要和文件夹相同。

  内部类分为: a:成员内部类,b:局部内部类,c:静态内部类,d:匿名内部类 。

  a:成员内部类:成员内部类是最普通的内部类,它的定义为位于另一个类的内部。就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问

class Outter {
    private int age = 20;
      
    class Inner {
        private int age = 21;
        public void print() {
            int age = 22;
            System.out.println("局部变量:" + age);
            System.out.println("内部类变量:" + this.age);
            System.out.println("外部类变量:" + Outter.this.age);
        }
    }
}
  
public class test1 {
    public static void main(String[] args) {
        Outter out = new Outter();
        Outter.Inner in = out.new Inner();
        in.print();
    }
}
输出的结果:
局部变量:22
内部类变量:21
外部类变量:20

可以看出:成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。我是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的

b:局部内部类

局部内部类是定义在一个方法里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内。

class Outter {
    private int age = 12;
    public void Print(final int x) {   
        class Inner {
            public void inPrint() {
                System.out.println(x);
                System.out.println(age);
            }
        }
        new Inner().inPrint();
    }   

}
  
public class test1 {
    public static void main(String[] args) {
        Outter out = new Outter();
        out.Print(10);
    }
}

输出的结果:
10
12

以上的代码中我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法。如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义。换句话说,在方法中定义的内部类只能访问方法中final类型的局部变量,这是因为在方法中定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期,由于局部变量被设置为final,所以不能再内部类中改变局部变量的值。

c:静态内部类

静态内部类就是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系,即不需要创建外部类,也不需要创建内部类。

 

d:匿名内部类 。

匿名内部类其实是局部内部类的一种,就是内部类的简化写法。前提条件是  存在一个类或者接口(匿名内部类必须和某个类或者接口发生关系);本质是一个继承了该类或者实现了该接口的子类匿名对象。

匿名内部类是不能有访问修饰符和static修饰符的。

匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限。

 

posted on 2018-07-22 19:41  三冬暖  阅读(152)  评论(0编辑  收藏  举报