Java中嵌套类用法

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

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

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

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

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

嵌套类分为两类:

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

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

Syntax

class OuterClass
{
...
    class NestedClass
    {
        ...
    }
}

Static Nested Classes(静态嵌套类)

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

Output:

outer_x = 10
outer_private = 30

Inner Classes(内部类)

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

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

There are two special kinds of inner classes :

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

Output:

outer_x = 10
outer_y = 20
outer_private = 30

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

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

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

原文发布于微信公众号 - 程序你好(codinghello)

原文发表时间:2018-09-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JetpropelledSnake

Python入门之函数的形式参数与实参/参数的具体使用方法

 本篇目录:     一、 函数参数之形式参数与实参     二、 函数参数的具体使用 #1、位置参数:按照从左到右的顺序定义的参数 位置形参:...

49060
来自专栏Python

函数相关知识汇总

一.函数的定义 定义函数的规则: 1.定义:def 关键词开头,空格之后接函数名称和圆括号()。 2.参数:圆括号用来接收参数。若传入多个参数,参数之间用逗号分...

26650
来自专栏微信公众号:Java团长

Java基础03 构造器与方法重载

在Java基础02 方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization)。初始化时,对象的数据成员被赋予初始值。我们...

9510
来自专栏程序员互动联盟

【Java概念学习】--数组的初始化

一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元素的个数), Java中使用关键字new创建数组对象,...

348110
来自专栏编程

Python基础2字符串

String 字符串是Python中最常用的数据类型,可以用单引号和双引号创建字 符串,字符串是不可变的。 字符串的基本操作:Python内建序列包括(列表、元...

21490
来自专栏Jackson0714

正则表达式全部符号解释

365150
来自专栏编程理解

正则表达式(一):常用元字符

正则表达式是一种字符串模式,用来对某些规则的文本内容进行处理。利用字符串构成成的数据结构,来完成对文本内容的匹配。

25550
来自专栏塔奇克马敲代码

第6章 函数

21070
来自专栏Vamei实验室

Java基础03 构造器与方法重载

在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization)。初始化时,对象的数据成员被赋予初始值。我们可以显式初始化。如...

210100
来自专栏学海无涯

19.Swift学习之构造函数与析构函数

11730

扫码关注云+社区

领取腾讯云代金券