Java内部类

来源:互联网 发布:武功 知乎 编辑:程序博客网 时间:2024/06/07 02:40

@Author:云都小生


内部类概述


定义在一个类里面,或者一个方法里面的类,叫做内部类。内部类一般可以分为四类:成员内部类,静态内部类、局部内部类和匿名内部类

使用内部类的原因(好处),通常有三种:

1. 内部类可以使用外部类的数据;

2. 对同一个包的其他类、方法实现隐藏;

3. 定义一个回调函数时不需要编写大量的代码。



内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。


成员内部类


public class Test{        int num = 1;        class Test1        {            int num;            void print()            {                System.out.print(num);            }            void set(int num)            {                this.num = Test.this.num;            }        }   }

Test1是Test的一个内部类,它可以访问Test里面的属性,也可以使用Test类中的其他方法。换句话说,它拥有了访问外围类的属性、方法的权限,无论是否是private,对内部类来说都是可视可访问的。

num相对于Test1是一个外部私有属性,但是Test1作为内部类是可以访问这个属性的。

public class Test{       public static void main(String[] args)    {        Test test = new Test();        Test.Test1 t1 = test.new Test1();        t1.printName("云都小生");    }    public class Test1    {        public void printName(String name)        {            System.out.println(name);        }    }}  

创建成员内部类对象的一般形式为: 外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()


静态内部类


静态内部类其实跟私有内部类类似,只不过,这个类前面加了一个修饰符static,它不能再访问外部类的非静态属性。

public class Test{        static int num = 1;        int data = 0;        static class Test1        {            int num;            void print()            {                System.out.print(num);                System.out.print(data);            }            void set(int num)            {                this.num = Test.this.num;            }        }}

上面这个代码会出错,因为Test1是一个内部静态类,没办法访问外部非静态的属性。创建静态内部类对象的一般形式为: 外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()


局部内部类


局部内部类是存在于方法里面的类,这个类只能使用该外围方法里面的final修饰的常量。

public class Test{       int data2 = 1;    public void Test1(){           final int data1=0;           class Demo{                    void print()                 {                     System.out.println(data1);                     System.out.println(data2);                     Test2();                 }           }       }       public void Test2()    {        System.out.println("Test");    }}

这个例子可能会有点复杂,这个内部类Demo有一个方法,可以访问它外围方法的常量,但是它可以访问外围类的所有属性和方法。


匿名内部类



在编写事件监听代码时,经常用到的就是匿名内部类,由于比较少用,只整理一下简单的语法。

ClassName className = new ClassName(){    public void run()    {        System.out.println("Test");    }}类名 对象 = new 类名(参数列表){    代码块···}

以上就是匿名类的定义与创建。匿名类在定义类的同时就创建它的对象,能访问它外部方法的final属性,也能访问外部类的所有属性、方法。

2017/9/28 16:08:02 @Author:云都小生(Cloudking)

原创粉丝点击