看看这个例子:
class TestConstructor{
static int i;//class variable
int j;//instance variable
TestConstructor(int i,int j){
this.i=i;
this.j=j;
}//constructor
static void StaticFun(){
System.out.println("i is"+i);
i++;
//j++;
}//static function或class function
public void InstanceFun(){
System.out.println("i is"+i+";j is"+j);
i++;
j++;//这里可以的!
}
}
class TestInitial{
public static void main(String[] args){
TestConstructor tc=new TestConstructor(1,2);//初始化i,j
tc.StaticFun();
tc.InstanceFun();
}
}
class TestConstructor{
static int i;//class variable
int j;//instance variable
TestConstructor(int i,int j){
this.i=i;
this.j=j;
}//constructor
static void StaticFun(){
System.out.println("i is"+i);
i++;
//j++;
}//static function或class function
public void InstanceFun(){
System.out.println("i is"+i+";j is"+j);
i++;
j++;//这里可以的!
}
}
class TestInitial{
public static void main(String[] args){
TestConstructor tc=new TestConstructor(1,2);//初始化i,j
tc.StaticFun();
tc.InstanceFun();
}
}
比如你class TestConstructor的构造函数中应该是TestConstructor.i=i;
StaticFun中应该是
System.out.println("i is "+TestConstructor.i);
TestConstructor.i++;
InstanceFun()中应该是
System.out.println("i is "+TestConstructor.i+";j is "+j);
TestConstructor.i++;
j++
你好好看看书吧!呵呵~~
因为无论如何每个类都会存储一些关于类的RTTI信息,比如类名什么的
静态方法和字段都是和RTTI存储方法一样的,应为,对于所有的类实例静态的东西都只有一份
而对于静态方法,是因为上面提到的存储RTTI的地方只有一些关于静态方法的引用,所以和静态字段都是一样存储的
public TestConstructor() {
} public TestConstructor(int c) {
this.c = c; //donot initialize static variable here
} protected class InnerClass {
int value;
InnerClass(int value) {
this.value = value;
}
} protected static class StaticInnerClass {
int value;
StaticInnerClass(int value) {
this.value = value;
}
} public static void main(String[] args) {
StaticInnerClass demoClass1 = new StaticInnerClass(1); TestConstructor demoClass2 = new TestConstructor(); InnerClass demoClass3 = demoClass2.new InnerClass(1); System.out.println(TestConstructor.count + ":" + TestConstructor.param); System.out.println(demoClass2.c + ":" + demoClass2.innerC + ":" + demoClass2.sInnerC);
}
}
花费了几分钟写了一个例子,希望有所帮助,略去了所有不必要的代码
另外,由于main()在这个类中,所以它可以访问私有变量(所以我可以省去Get^^)
不过这不是一个良好的编程习惯
是不是想了解java类的内存形式,呵呵
不能有static method 是不是和不能有static data一样的原因?
原因又何在?
谢谢各位的积极参与,感激ing..
继续讨论一下吧,应该对大家都有帮助的。
解释1/跟你Wapper类(外覆类)用法有关,就好像路径不对一样;
解释2/因为inner类非静态,所以必须有他的一个实例,而通过实例调用就没必要用静态了吧
你看看,有没有参考价值~~
欢迎联系我,QQ:21445102(多数时间不在)mail:[email protected]
我想,原因可能是这个东西的需求不大,实现起来又需要额外的工作量,所以权衡利弊,sun认为不值得吧。也或许,跟java class的动态加载机制有关?static member对non-static inner class可能会有些不利的影响?
没有仔细研读过java spec,不好下结论。
你定义的嵌套类实际就是一个封闭在类中的成员,这点与其他的成员一样。一个嵌套类可以同其他类的成员一样有一个访问属性,并且按同样的方式由这个属性决定从封装类的外部的可访问能力。
public class Outside
{
//Nested class
public class Inside
{
//Details of Inside class
}
//More members of Outside class
}
这里的类Inside嵌套在类Outside中。类Inside声明为Outside类的一个公有成员,所以它可以从Outside的外面访问。显而易见,一个嵌套类应该与包含它的类有一些特殊的联系。任意的将一个类嵌到另一个类是不明智的。这里的Outside被称作顶层类(top-level class)。顶层类是一个包含嵌套类而它自己没有被嵌套到其他类中的类。
这里的嵌套类只在一个Outside型对象范围内才有意义,这是因为Inside没有声明为Outside类的静态成员。在建立一个Outside型对象之前,你不能建立任何的Inside对象。然而,在你声明一个包含嵌套类的类对象时,不需要建立嵌套类的对象,当然,被类的构造函数建立的对象除外。例如,假设我们用下列语句建立一个对象:
Outside outer = new Outside();
没有建立嵌套类的对象Inside。如果你现在希望建立一个嵌套类的对象,你就必须使用一个作为限定词的类的名字引用嵌套类。例如,已经声明了一个Outside类的对象,我们可以用下列语句建立一个Inside型的对象:
Outside.Inside inner = outer.new Inside();
这里我们已经建立了一个嵌套类的对象,它于与我们前面建立的outer对象相关联。我们正是在outer对象范围内建立一个Inside型的对象。
在Outside的非静态成员方法中,你可以使用Inside类名,而不需要任何限定,它将由编译器使用this变量自动加以限制。所以我们可以在对象Outside的方法内建立新的Inside对象:
Inside inner = new Inside();
它等价于:
this.Insie inner = this.new Inside();
所有的这些说明静态方法不能建立一个非静态嵌套的类对象。因为Inside类不是Outside类的静态成员,如果在Outside对象的范围内没有已存在的Inside对象,则引用一个不存在的对象将是错误的。由于Inside不是Outside类的一个静态数据成员,如果Outside类中的一个静态方法试图直接地建立一个Inside
型的对象,而开始并不存在一个Outside的对象,这种尝试在一个对象的合法范围外建立对象的操作将是非法的。
还有因为类Insider不是一个Outside类的静态成员,所以它不能依次返回它自己包含的任何静态数据成员,当然也不能调用它自己包含的任何静态方法。由于Inside本身不是静态的,所以它不能用静态成员来从当一个自由稳定的类(而静态方法当然也可以看作静态成员),这存在着逻辑上的矛盾。