Java内部类


@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)

你可能感兴趣的:(java,Java,SE)