java中类和方法都不允许嵌套定义_嵌套类(Nested Classes)

274b22f281f2c971aaa8915efe4a5357.png

概述

Java允许在一个类的内部定义一个类,这样的类称为嵌套类。例:

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

嵌套类分为两类:静态和非静态。 用static 修饰的嵌套类称为静态嵌套类,未使用static修饰的嵌套类称为内部类。

class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
    class InnerClass {
        ...
    }
}

嵌套类是其所在类的成员。非静态嵌套类(内部类)可以访问所在类的其他成员(包括用private修饰的)。 静态嵌套类不能访问所在类的其他成员。嵌套类可以拥有private, public, protected, or package private等访问权限。 (外部类只能有public 或 package private两种访问权限)

使用内部类的原因

  1. 将仅在一处使用的类整合到使用该类的类中:若一个类仅对某个类有用,则直接将其嵌入该类中,让两个类耦合不失为一种合理的选择。使用这种嵌入式的“帮助类”可以使代码包的结构更简介。
  2. 增强封装:假设有两个外部类,A和B。B需要访问A类的私有成员。只有将B类封装进A类时,B类才能访问A类中声明的私有成员。与此同时,B类也与其所在类以外的类隔绝开来。
  3. 增强代码的可读性和可维护性: 当某个类只有在一个类中才会用到时,可以将其封装进该顶层类中。

静态嵌套类

静态嵌套类与其外部类类本身相关联。和静态方法一样,静态嵌套类不能直接引用其所在类的实例变量和实例方法。

Note: A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.
注意:静态嵌套类访问其所在的外部类(和其他类)中的实例成员时访问方式和其他任何顶层类别无二致。实际上,从行为方式上来看,静态内部类就是为了打包方便而被封装进另一个顶层类中的一个顶层类。

使用内部类的外部类类名访问静态嵌套类: OuterClass.StaticNestedClass 创建静态嵌套类: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

内部类

内部类与其外部类的实例相关联,可直接引用该实例的实例变量和实例方法。内部类本身不能定义静态成员。内部类的实例只能存在于其外部类的实例中。 创建内部类的实例时必须先创建其外部类的实例。之后可按下面的格式创建: OuterClass.InnerClass innerObject = outerObject.new InnerClass();

存在两种特殊的内部类:

Local Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)​docs.oracle.com Anonymous Classes​docs.oracle.com

遮蔽(Shadowing)

若在某个具体作用域(例如内部类或方法签名)中定义的变量的变量名(例如成员变量或参数名)与外部类的作用域中定义的相同,则较小作用域中定义的变量会遮蔽较大作用域中定义的变量。因此不能仅凭变量名本身引用该变量。 例:

public class ShadowTest {

    public int x = 0;

    class FirstLevel {

        public int x = 1;

        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);
            System.out.println("this.x = " + this.x);
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
        }
    }

    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}

输出如下:

x = 23
this.x = 1
ShadowTest.this.x = 0

总结

  • 优先级 --> 方法签名中的变量> 内部类的成员变量 > 外部类的成员变量
  • 访问方式 --> varibaleName this.variableName OuterClass.this.variableName

下一篇:Polymorphism(多态)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin中的嵌套Nested Classes)和内部(Inner Classes)是非常相似的概念,但有一些细微的区别。以下是对它们的一些基本介绍: 1. **嵌套Nested Classes)**:在Kotlin中,嵌套是一种,它包含在另一个的内部。它可以是静态的(static)、非静态的(inner)或者局部的(local)。嵌套可以从任何访问它的外部访问字段、方法、构造器和嵌套。这允许一个的数据可以在嵌套中被更细粒度地访问和控制。 ```kotlin class OuterClass { class NestedClass { // code inside } } ``` 2. **内部(Inner Classes)**:内部定义在另一个内部的。它可以直接访问外部的所有成员,包括字段、方法、构造器和嵌套。内部可以包含自己的构造函数,并且可以访问外部的私有成员。内部可以嵌套在其他内部中,形成一个复杂的层次结构。 ```kotlin class OuterClass { inner class InnerClass { // code inside } } ``` 总的来说,内部在实现接口、继承某个或封装内部数据结构时特别有用。另一方面,嵌套提供了一种更灵活的方式来访问外部的数据和方法,即使外部在不同的包或模块中。 需要注意的是,尽管Kotlin中的嵌套和内部非常相似,但在某些情况下,使用嵌套的语法可能更清晰和直观。例如,使用嵌套可以更清楚地表示一个嵌套结构,而内部则更适合实现接口或封装内部数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值