Java中嵌套类用法

2018-09-29 11:20:57 浏览数 (1)

在Java中,可以在另一个类中定义一个类。这些类称为嵌套类。它们使您能够对只在一个地方使用的类进行逻辑分组。因此,这增加了封装的使用,并创建了更具可读性和可维护性的代码。

嵌套类的作用域由其封闭类的作用域限定。因此,在上面的例子中,类NestedClass并不独立于类的 OuterClass外部类而存在。

嵌套类可以访问嵌套类的成员,包括私有成员。然而,反之则不然,即封闭类不能访问嵌套类的成员。

嵌套类也是其封闭类的成员。

作为其封闭类的成员,嵌套类可以声明为 private, public, protected, or package private (default)(私有、公共、受保护或包私有(默认))。

嵌套类分为两类:

1、静态嵌套类(static nested class):声明为静态的嵌套类称为静态嵌套类。

2、内部类(inner class):内部类是非静态嵌套类。

Syntax

代码语言:javascript复制
class OuterClass
代码语言:javascript复制
{
代码语言:javascript复制
...
代码语言:javascript复制
    class NestedClass
代码语言:javascript复制
    {
代码语言:javascript复制
        ...
代码语言:javascript复制
    }
代码语言:javascript复制
}

Static Nested Classes(静态嵌套类)

代码语言:javascript复制
OuterClass.StaticNestedClass nestedObject =
代码语言:javascript复制
     new OuterClass.StaticNestedClass();
代码语言:javascript复制
// Java program to demonstrate accessing
代码语言:javascript复制
// a static nested class
代码语言:javascript复制
代码语言:javascript复制
// outer class
代码语言:javascript复制
class OuterClass
代码语言:javascript复制
{
代码语言:javascript复制
    // static member
代码语言:javascript复制
    static int outer_x = 10;
代码语言:javascript复制
代码语言:javascript复制
    // instance(non-static) member
代码语言:javascript复制
    int outer_y = 20;
代码语言:javascript复制
代码语言:javascript复制
    // private member
代码语言:javascript复制
    private static int outer_private = 30;
代码语言:javascript复制
代码语言:javascript复制
    // static nested class
代码语言:javascript复制
    static class StaticNestedClass
代码语言:javascript复制
    {
代码语言:javascript复制
        void display()
代码语言:javascript复制
        {
代码语言:javascript复制
            // can access static member of outer class
代码语言:javascript复制
            System.out.println("outer_x = "   outer_x);
代码语言:javascript复制
代码语言:javascript复制
            // can access display private static member of outer class
代码语言:javascript复制
            System.out.println("outer_private = "   outer_private);
代码语言:javascript复制
代码语言:javascript复制
            // The following statement will give compilation error
代码语言:javascript复制
            // as static nested class cannot directly access non-static membera
代码语言:javascript复制
            // System.out.println("outer_y = "   outer_y);
代码语言:javascript复制
代码语言:javascript复制
        }
代码语言:javascript复制
    }
代码语言:javascript复制
}
代码语言:javascript复制
代码语言:javascript复制
// Driver class
代码语言:javascript复制
public class StaticNestedClassDemo
代码语言:javascript复制
{
代码语言:javascript复制
    public static void main(String[] args)
代码语言:javascript复制
    {
代码语言:javascript复制
        // accessing a static nested class
代码语言:javascript复制
        OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
代码语言:javascript复制
代码语言:javascript复制
        nestedObject.display();
代码语言:javascript复制
代码语言:javascript复制
    }
代码语言:javascript复制
}

Output:

代码语言:javascript复制
outer_x = 10
代码语言:javascript复制
outer_private = 30

Inner Classes(内部类)

要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:

代码语言:javascript复制
OuterClass.InnerClass innerObject = outerObject.new InnerClass();

There are two special kinds of inner classes :

代码语言:javascript复制
// Java program to demonstrate accessing
代码语言:javascript复制
// a inner class
代码语言:javascript复制
代码语言:javascript复制
// outer class
代码语言:javascript复制
class OuterClass
代码语言:javascript复制
{
代码语言:javascript复制
    // static member
代码语言:javascript复制
    static int outer_x = 10;
代码语言:javascript复制
代码语言:javascript复制
    // instance(non-static) member
代码语言:javascript复制
    int outer_y = 20;
代码语言:javascript复制
代码语言:javascript复制
    // private member
代码语言:javascript复制
    private int outer_private = 30;
代码语言:javascript复制
代码语言:javascript复制
    // inner class
代码语言:javascript复制
    class InnerClass
代码语言:javascript复制
    {
代码语言:javascript复制
        void display()
代码语言:javascript复制
        {
代码语言:javascript复制
            // can access static member of outer class
代码语言:javascript复制
            System.out.println("outer_x = "   outer_x);
代码语言:javascript复制
代码语言:javascript复制
            // can also access non-static member of outer class
代码语言:javascript复制
            System.out.println("outer_y = "   outer_y);
代码语言:javascript复制
代码语言:javascript复制
            // can also access private member of outer class
代码语言:javascript复制
            System.out.println("outer_private = "   outer_private);
代码语言:javascript复制
代码语言:javascript复制
        }
代码语言:javascript复制
    }
代码语言:javascript复制
}
代码语言:javascript复制
代码语言:javascript复制
// Driver class
代码语言:javascript复制
public class InnerClassDemo
代码语言:javascript复制
{
代码语言:javascript复制
    public static void main(String[] args)
代码语言:javascript复制
    {
代码语言:javascript复制
        // accessing an inner class
代码语言:javascript复制
        OuterClass outerObject = new OuterClass();
代码语言:javascript复制
        OuterClass.InnerClass innerObject = outerObject.new InnerClass();
代码语言:javascript复制
代码语言:javascript复制
        innerObject.display();
代码语言:javascript复制
代码语言:javascript复制
    }
代码语言:javascript复制
}

Output:

代码语言:javascript复制
outer_x = 10
代码语言:javascript复制
outer_y = 20
代码语言:javascript复制
outer_private = 30

静态类和内部类(非静态嵌套类)的区别:

静态嵌套类不能直接访问封闭类的其他成员(非静态变量和方法),因为由于它是静态的,它必须通过对象访问封闭类的非静态成员。也就是说,它不能直接引用其封闭类的非静态成员。由于这个限制,静态嵌套类很少被使用。

非静态嵌套类(内部类)可以访问其外部类的所有成员(静态和非静态变量和方法,包括private),并且可以像外部类的其他非静态成员那样直接引用它们。

0 人点赞