太高深了......
通俗点讲,我自己的理解呀,当然我也是菜鸟,刚学JAVA.
我觉得,像C里面的结构,其实就是一种自定义的类型本质和int,double....并无太大差别(笼统的讲).到C++ 类已经不是这样了,有了更多的内涵.再到JAVA全是类.还真不习惯.
不过,它们的老祖宗是一样的(千万别骂,我也菜).也是一种类型.当然了,有更多的功能,也有更多的内涵.
一个类型被申明时,编译程序不会做实质性的工作.只有一种非动态的,静态的东西被实实在在的申明时,编译程序将会在内存里插入标签,并为之分配一块区域.因为这个东西已经被实实在在的执行,它不在是对象的属性了.它只有是这个类本身的属性.
同理,类本身也可是动态的,也可以是静态的.道理一样.
方法也一样.
int i
只说明你一个愿望,一个想法.当i被赋值时,他才在内存中,按你的所想的int 申请空间就存储.
static int i
在你申请的时候,已经为之分配空间,并且不用赋值(至少c++里是这样),其实已经赋过了,或是自己赋的,或是语言默认的.
正如在编写一些递归的程序中,你如果想用int i来计算递归的层数时,几乎不可能,它是层数动态分配的,当然了,也可以一层一层的传回来.
而用 static int i 就可以,因为,从开始到最后它都占据在申明时所分配的空间里面.它是静态的.
INT I 是INSTANT FIELDS,不知道是不是叫对象属性。
STATIC INT I 是CLASS FIELDS,类属性,也叫静态属性。
有STATIC的属性,可以直接被类调用。
public class Box{
int long; //箱子长度
static int G= 9.8;//重力加速度
}
类属性指这个属性属于这个类,而不是具体的类的对象。任何类或者类的对象调用类属性,都指向这唯一的定义。
但是对于long,每创建一个Box box1 = new Box();就会分配一个空间给long.这个long属于box1.
Box box2 = new Box();里就新分配一个空间给box2 的 long.
其他的类调用时,可以是 box1.long和 box2.long和 box1.G和 box2.G和Box.G
这个程序展示了静态初始化的各种特性。首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。可以参考Think in Java中的讲解。
public class StaticCls{
public static void main(String[] args){
OuterCls.InnerCls oi=new OuterCls.InnerCls();
}
}
class OuterCls{
public static class InnerCls{
InnerCls(){
System.out.println("InnerCls");
}
}
}