关于Java中静态内部类的疑问。

2025-02-25 18:37:49
推荐回答(3个)
回答1:

你好,我这样说,不知道你是否能理解:
如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static.通常称为嵌套类,当内部类是static时,意味着:
[1]要创建嵌套类的对象,并不需要其外围类的对象
[2]不能从嵌套类的对象中访问非静态的外围类对象
嵌套类与普通的内部类还有一个区别:普通内部类的字段的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类.但是在嵌套类里可以包含所有这些东西。
看明白了,就知道你的想法错在哪里了。

回答2:

package dl.java.baidu.faq;

public class StaticInnerClass {

private static int i=0,j=0;

/**
* 书上说静态内部类在使用之前不必先实例化包含它的外部类。
* 于是我猜想静态内部类是用来配合所在外部类的静态成员使用的。
* 但是又发现静态内部类可以实例化出多个对象(写了个小程序连续new静态内部类)。
* 这两方面貌似是冲突的。。。求助~~~~~~~~~谢谢~~~~~
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

while(i<=10){
a A = new a();//静态内部类可以这样实例化
A.print();
A.sayHellow();
System.out.println(A);
System.out.println("--------------");
}

a.print();

/***********
*
*new b().print(); //报错误
*静态内部类(Static Inner Class),即在内部类的前面增加了static修饰符(modifier)。
*注意,仅仅只有内部类能够被声明为static类型,通常我们声明一个普通类的时候不能使用static,否则编译出错。
*
***/

/******
* 书上说静态内部类在使用之前不必先实例化包含它的外部类
*
* 这里提到的是不必要。就是可以直接实例化内部类访问类中的静态方法方法
* 而不必要使用这种形式去实例化内部类:new StaticInnerClass().new b().print();
* 而可以直接这样实例化:a A = new a()
*
*/

new StaticInnerClass().new b().print();//非静态内部类,必须这样实例化

}

/****
*
* 那么为什么我们要使用静态的内部类呢?在什么情况下我们需要使用静态的内部类呢?
* 编译器会自动给内部类加上一个reference,指向产生它的那个外部类的对象,
* 如果不想要或者说不需要这个reference,那么我们就可以把这个内部类声明为static,
* 禁止这个reference的产生。除此之外静态类的使用与普通的静态类是一样的
* @author ZZY
*
*/
static class a{

static void print(){
System.out.println(i);
i++;
}

void sayHellow(){
System.out.println("Hellow World");
}

}

class b{
void print(){
System.out.println(j);
j++;
}
}

}

回答3:

定义静态内部类是因为内部类不需要访问到外部类的实例变量和方法,它只是隐藏在外部类里面的一个类,不依赖于外部类而存在,因此不需要外部类对象就能定义内部类对象。它仅仅是不关联于外部类实例部分而已,跟外部类静态成员无任何关系(虽然可以访问到),它本身也是一个类,当然可以创建多个对象。