前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中嵌套类用法

Java中嵌套类用法

作者头像
程序你好
发布2018-09-29 11:20:57
2.1K0
发布2018-09-29 11:20:57
举报
文章被收录于专栏:程序你好

在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),并且可以像外部类的其他非静态成员那样直接引用它们。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序你好 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Syntax
  • Static Nested Classes(静态嵌套类)
  • Inner Classes(内部类)
  • 静态类和内部类(非静态嵌套类)的区别:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档