Java语言高编——内部类

来源:互联网 发布:数据分析报告案例 编辑:程序博客网 时间:2024/06/08 18:18

内部类

在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。

成员内部类

成员内部类是最普通的内部类,它的定义为位于另一个来类的内部。
代码示例:

//外部类public class{    //内部类可以拥有private访问权限、protected访问权限、public访问权限以及默认访问权限,外部类只能被public和默认访问两种权限修饰    访问修饰符 class 内部类{        //如果成员内部类用private修饰,只能在外部类的内部访问        //如果用public修饰,则任何地方都可以访问        //如果用protected修饰,则可以在同一个包下或者继承外部类的情况下访问        //如果是默认访问权限,则只能在同一个包下访问    }}

成员内部类是依附在外部类而存在的,也就是说,如果想要创建成员内部类的对象,前提是必须存在一个外部类的对象

    外部类 a = new 外部类();    外部类.内部类 b = a.new 内部类();

当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是内部类的成员。
如果需要访问外部类的属性和方法,需要使用外部类.this实现,如下

外部类.this.成员变量外部类.this.成员方法

虽然成员内部类可以无条件访问外部类的成员,而外部类想访问成员内部类是必须创建一个成员内部类的对象,再通过指向这个对象的引用来访问:

//外部类public class{    void print(){        内部类 b = new 内部类();        System.out.println(b.name);    }    public class{//内部类        String name="张三";    }}

局部内部类

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

class 外部类{    public void print(){        class 局部内部类{            void print(){                System.out.println("局部内部类");            }        }        局部内部类 a = new 局部内部类();        a.print();    }}

局部内部类就想是方法里面的一个局部变量一样,是不能由public、protected、private以及static修饰符的。

匿名内部类(最常用到)

匿名内部类是我们使用最多的方式,一般来说,都是实现一个抽象类或者实现一个接口的同时,将他的抽象方法实现,这时我们的类实际上是该抽象类或者接口的子类,只是没有命名,方法实际实现每次都不一样,不能去公用,那么一般直接可以使用匿名内部类来实现。

使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口中必须先存在才能这样使用,我们的Thread类也可以实现:

//匿名对象new Thread().start();//我们可以使用{}重写Thread类的run方法,这时会给我们产生一个Thread的子类,然后使用了new关键字创建了这个子类的对象。new Thread(){    public void run(){    }}.start();//匿名内部类创建对象是必须的,否则类生成过后,如果没有给他一个具体的实例,那么你再也无法引用这个类,因为他没有名称,只能使用一次//也可以使用该方法来创建,我们给Thread放入了一个匿名的Runnable的实现类,并且实例化了一个对象new Thread(new Runnable(){    public void run(){        }    }).start();

静态内部类(嵌套类)

静态内部类也是定义在另一个类的里面类,这个类的前面多一个static(静态的)关键字。静态内部类是不需要依赖外部类的,这一点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员。在没有外部类的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附具体的对象。

静态内部类和成员内部类的区别

  1. 静态内部类的对象,并不需要其外部类对象。即它可以不依赖于外部类实例被实例化。
  2. 不能从静态内部类的对象中访问非静态的外围对象。由于Java语法中“静态方法不能直接访问非静态成员”所限定。
  3. 外部类访问内部类的成员有些特别,不能直接访问,但是可以通过内部类实例来访问,这是因为静态内部类的所有成员和方法默认为静态的。
  4. 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
  5. 静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量。
  6. 非静态内部类的非静态成员可以通过访问外部类的非静态变量
原创粉丝点击