`

java为什么非静态内部类里面不能有静态成员

    博客分类:
  • java
阅读更多

      内部类的对象脱离了其 外围类的对象 就不会存在, 静态变量 的作用就是 让该类的所有对象共享一个状态。 这个类的所有对象都可以获取和修改这个状态。如果仅仅是这个目的,就可以推出这个状态也是所有外部对象所共享的状态,因此这个定义就可以提升至 外围类中定义,没有必要在内部类中定义,因此在JAVA中不允许在内部类中声明 静态变量,但是可以允许其继承父类的 静态变量,因为父类可能有很多子类,这些子类不一定是用作内部类。

      你可以想象一下如何去指向这个静态成员。非静态内部类是通过外部类的this指针指向的。那么对于非静态内部类的动态成员,可以通过两个this指针确定位置。但是如果允许静态成员会出现什么情况?首先,静态成员是不能通过任何this指针的,但是为了确定这个成员,必须确定这个成员所在的类实例。但是这个实例必须通过一个this指针确定。这在语法以及处理上都会造成很大的麻烦。所以非静态内部类总是由一个外部的对象生成,既然与对象相关,就没有静态的字段和方法。

        内部类的用途就是 利用外围类对象的资源做事。

 

我在论坛中看到其他一个关于这个问题的分析(摘抄如下):

因为这会产生歧义。

比如

class   Outer   {
    int   outerX;
    Inner   inner1   =   new   Inner();
    Inner   inner2   =   new   Inner();
    class   Inner   {
        int   innerX;
    }
}

Outer   outer1   =   new   Outer();
Outer   outer2   =   new   Outer();

假如innerX是static的,那么这个static的含义是
1:仅是同一outer实例下的不同inner实例共享:
outer1.inner1.innerX=outer1.inner2.innerX,And  
outer2.inner1.innerX=outer2.inner2.innerX,But
outer1.inner1.innerX!=outer2.inner1.innerX,Hence
outer1.inner2.innerX!=outer2.inner2.innerX

 

这个分析是错误的,因为:

outer1.inner1.getClass() ==outer2.inner1.getClass()返回true;

所以, 假如innerX是static的,同一个类调用其静态属性获取的值是指向同一个内存位置的。

 

答案:

2:   所有outer实例的inner实例都共享:
outer1.inner1.innerX=outer1.inner2.innerX,And  
outer2.inner1.innerX=outer2.inner2.innerX,And
outer1.inner1.innerX=outer2.inner1.innerX,Hence
outer1.inner2.innerX=outer2.inner2.innerX


分享到:
评论
2 楼 yanjianpengit 2016-06-30  
[b][/b]   
1 楼 crab1 2012-04-25  
看了之后还是不懂、、、、

相关推荐

    java静态内部类(嵌套类)

    2. **不能访问外部类的非静态成员**:由于静态内部类与外部类的静态属性和方法处于相同的静态上下文中,因此静态内部类无法访问外部类的非静态成员变量或方法。 3. **命名空间独立**:静态内部类有自己的命名空间,...

    深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    这种类的声明前面带有`static`关键字,与普通的内部类(非静态内部类)有所不同,它们在使用和行为上存在显著的差异。 首先,让我们来探讨一下静态内部类与非静态内部类的主要区别: 1. **引用关系**: - 静态...

    java 静态内部类的使用规范

    Java语言中的静态内部类,也称为嵌套类,是内部类的一种特殊形式,它与非静态内部类(也称为成员内部类)相比有着独特的特点和使用场景。在深入探讨其使用规范之前,我们先理解静态内部类的基本概念。 静态内部类不...

    Java 深入理解嵌套类和内部类

    在静态嵌套类内部,不能访问外部类的非静态成员变量,这是由 Java 语法中“静态方法不能直接访问非静态成员”所限定。若想访问外部类的变量,必须通过其他方法解决。由於这个原因,静态嵌套类使用很少。 三、非静态...

    静态内部类

    根据内部类是否声明为static,它们被分为非静态内部类(也称为成员内部类)和静态内部类。 #### 二、静态内部类的特点 静态内部类具有以下特点: 1. **独立性**:静态内部类与外部类之间没有依赖关系,即使外部类...

    java代码笔记2010-06-01:Java内部类 静态内部类 局部内部类 明明内部类;StringBuffer reverse的使用;

    内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态内部类与普通的成员内部类不同,它不持有对外部类的引用。因此,可以像其他静态成员一样,...

    浅谈内部类与静态内部类的应用

    与普通成员内部类不同,静态内部类不持有对外部类的引用,因此不能直接访问外部类的非静态成员。静态内部类需要通过外部类名.静态内部类名的方式来创建对象,这与访问任何其他静态成员的方式相同。这种特性使得静态...

    从零开始学JAVA第12章_内部类.ppt

    非静态内部类是指定义在另一个类的非静态成员中的类。非静态内部类可以访问外部类的成员变量和成员方法,同时也可以被外部类访问。在外部类中访问内部类可以使用内部类对象来调用内部类的成员变量和成员方法。在外部...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...

    java 成员内部类的使用规范

    非静态内部类可以直接访问外部类的实例变量和方法,而静态内部类不能直接访问,需要通过外部类的实例来访问。 2. **声明与实例化**: - 非静态内部类的声明是在外部类的定义内,无需static修饰。实例化时需要外部...

    Java语法总结 - 内部类

    静态嵌套类不能访问外部类的非静态成员变量和方法,但是可以访问外部类的静态成员变量和方法。 方法内部类 方法内部类是指定义在外部类的方法中的内部类。方法内部类可以访问外部类的所有成员变量和方法,包括私有...

    java内部类详解

    - 静态内部类和成员内部类在内存管理上有差异,静态内部类不会引起外部类的实例化,而成员内部类会。 - 匿名内部类不能包含任何静态声明,因为它们没有名称。 总的来说,Java 内部类是强大且灵活的工具,有助于构建...

    Java中的静态内部类详解及代码示例

    静态内部类与其它内部类的区别在于非静态内部类在编译完成之后会隐含地保存一个引用,该引用是指向创建它的外部类,但是静态内部类却没有。静态内部类只是嵌套在外部类中,因此也被称为嵌套内部类。 静态内部类的...

    内部类的相关知识-静态内部类,匿名内部类……

    非静态内部类不能包含任何静态成员(如静态变量、静态方法等),因为它们依赖于外部类的实例。如果尝试在非静态内部类中声明静态成员,将会导致编译错误。 ```java public class InnerNoStatic { private class ...

    Java SE 静态内部类的使用(csdn)————程序.pdf

    Java SE中的静态内部类是一种特殊的内部类,它与非静态内部类(也称为成员内部类)有着显著的区别。静态内部类并不需要外部类的实例来创建它的对象,而是可以直接通过类名进行实例化,就像普通的类一样。在给定的...

    java 匿名内部类的使用规范

    - **非静态成员**:匿名内部类拥有对外部类的隐式引用,可以访问外部类的非静态成员,但必须通过`OuterClass.this`来明确指出。 3. **局部变量的final限制** 如果匿名内部类需要访问局部变量,那么这个局部变量...

    JAVA内部类总结

    1. **访问权限**:静态成员内部类不能直接访问外部类的非静态成员,但可以访问外部类的所有静态成员。 2. **实例化**:静态成员内部类可以直接通过“外部类.静态内部类”来创建对象实例,无需先创建外部类的对象。...

    java内部类总结(含概念和实例)

    * 静态内部类不能访问外部类的非静态成员 匿名内部类的特点: * 匿名内部类是指没有名字的内部类 * 匿名内部类通常用在创建实例时使用 * 匿名内部类可以访问外部类的所有成员 在 Java 中,内部类是一种非常重要的...

    内部类的理解Java系列2021.pdf

    - 在Java中,非静态内部类内部不能声明静态字段或方法。这是因为非静态内部类需要依赖外部类的实例,而静态字段和方法属于类级别,与实例无关。 - 静态内部类可以在内部声明静态字段或方法,但这样做并没有太大的...

    JAVA 内部类 PPT

    - **静态内部类**:静态内部类与实例内部类的区别在于,静态内部类不依赖于外部类的实例,可以直接通过类名创建对象。它可以直接访问外部类的静态成员,但访问实例成员需通过外部类的实例。 - **局部内部类**:...

Global site tag (gtag.js) - Google Analytics