java 内部类为啥不能static

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 内部类为啥不能static相关的知识,希望对你有一定的参考价值。

java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?
如:
public class InnerClassDemo
int x;
class A
static int a = 0;//这样写是不合法的.
static final int b=0;//这样写是合法的


java类加载顺序,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量int a 初始化,那么必须先执行加载外部类,再加载内部类,最后初始化静态变量 a ,问题就出在加载内部类上面,我们可以把内部类看成外部类的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载内部类必须在实例化外部类之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。
(有点绕,呵呵)
而java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。
参考技术A

谁说的内部类不能用static修饰。

/**
 * @serial include
 */
private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable

    private static final long serialVersionUID = -2764017481108945198L;
    private final E[] a;

    ArrayList(E[] array) 
        if (array==null)
            throw new NullPointerException();
        a = array;
    

    public int size() 
        return a.length;
    

    public Object[] toArray() 
        return a.clone();
    

    public <T> T[] toArray(T[] a) 
        int size = size();
        if (a.length < size)
            return Arrays.copyOf(this.a, size,
                                 (Class<? extends T[]>) a.getClass());
        System.arraycopy(this.a, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    

    public E get(int index) 
        return a[index];
    

    public E set(int index, E element) 
        E oldValue = a[index];
        a[index] = element;
        return oldValue;
    

    public int indexOf(Object o) 
        if (o==null) 
            for (int i=0; i<a.length; i++)
                if (a[i]==null)
                    return i;
         else 
            for (int i=0; i<a.length; i++)
                if (o.equals(a[i]))
                    return i;
        
        return -1;
    

    public boolean contains(Object o) 
        return indexOf(o) != -1;
    

这个是jdk中的Arrays类中的一个静态内部类,这不就是用static修饰的。

java 嵌套类

如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static,这通常称为嵌套类,想要理解static应用于内部类时的含义,就必须记住,普通的内部类对象隐式地保存了一个引用,指向它的外围类对象,然而,当内部类时static时,就不是这样了,嵌套类意味着:

1)要创建嵌套类的对象,并不需要其外围类的对象

2)不能从嵌套类的对象中访问非静态的外围类对象

嵌套类与普通的内部类还有一个区别,普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类,但是嵌套类可以包含这些东西:

//: innerclasses/Parcel11.java
// Nested classes (static inner classes).
package object;
public class Parcel11 {
  private static class ParcelContents implements Contents {
    private int i = 11;
    public int value() { return i; }
  }
  protected static class ParcelDestination
  implements Destination {
    private String label;
    private ParcelDestination(String whereTo) {
      label = whereTo;
    }
    public String readLabel() { return label; }    
    // Nested classes can contain other static elements:
    public static void f() {}
    static int x = 10;
    static class AnotherLevel {
      public static void f() {}
      static int x = 10;
    }
  }
  public static Destination destination(String s) {
    return new ParcelDestination(s);
  }
  public static Contents contents() {
    return new ParcelContents();
  }
  public static void main(String[] args) {
    Contents c = contents();
    Destination d = destination("Tasmania");
  }
} ///:~

 

以上是关于java 内部类为啥不能static的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能在 Java 中将类声明为静态?

java里 class前边不加static为啥报错?

一个java内部类有几个分类?

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

java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?

Java面试题11 什么是内部类?Static Nested Class 和 Inner Class的不同。