static变量和方法,不需要创建对象。static变量和方法不以该类是否实例化而存在。比如Integer.parseInt()这样的方法。也许方法你能理解,那变量一样。static变量还有这个特性,不管你创建了多少实例,这些实例的static变量用的是同样的地址。可以做以下试验: class A{ static int i=1; int count=3; } public class Test{ public static void main(String args[]) { A testA1 = new A(); A testA2 = new A(); System.out.println("TestOne:"testA1.i+"!"+testA2.i+"!"+A.i); // System.out.println("Test:"testA1.count+"!"+testA2.count+"!"+A.count); //应该会报错的! testA1.i = 520; System.out.println("TestTwo:"testA1.i+"!"+testA2.i+"!"+A.i+"!"); // testA1.count = 1313; System.out.println("Test:"testA1.count+"!"+testA2.count+"!");
看TIJ最好搭配看Inside C++ Object Model
比较容易知其所以然
在TIJ中谈这个地方也比较详细,
在java中一般用户定义的类系统分配的内存在堆中(heap),
而static的变量分配的内存在静态内存区,
这个是不同的,
zhonghua2003(爱我中华)说的很对。
static 是静态类型的,注意这点就可以了
static成员=类,
非static成员=具体对象;
你可以通过类来访问static成员;like this:
Integer.valueOf("1");
也可以象这样:
new Integer.valueOf("1");
但后者其实只是一种语法上的计巧;
每个具体对象并不能看见该类的static成员,因为它只属于类;这种情况下仍是通过其类来访问的。
static 的意义:
1。该声明变量是类变量而不是实例变量。
2。static声明的静态类变量是在第一次创建类或者第一次直接引用时进行初始化的,
而且只初始化一次。
3。static 和static final的区别。static在初始化后还可以修改值。
-->照它这么说,B.i这种形式会创建B的对象,对吗?如果对,(那有对象就有该对象的this指针),但访问static成员和方法是直接访问的,不是通过对象的,请解释一下好吗?A:
在这个程序中没有创建类B,类B中的静态变量在程序运行前(类加载器)创建,
所以a1对象(类B中的静态变量)先创建
然后才是Test创建
然后才是Test.main
class A{
static int i=1;
int count=3;
}
public class Test{
public static void main(String args[])
{
A testA1 = new A();
A testA2 = new A();
System.out.println("TestOne:"testA1.i+"!"+testA2.i+"!"+A.i); //
System.out.println("Test:"testA1.count+"!"+testA2.count+"!"+A.count); //应该会报错的!
testA1.i = 520;
System.out.println("TestTwo:"testA1.i+"!"+testA2.i+"!"+A.i+"!"); //
testA1.count = 1313;
System.out.println("Test:"testA1.count+"!"+testA2.count+"!");
}
}最主要要多做试验,牛人都是这样出来的
应该明白了吧,
所谓的创建对象和不创建对象的区别就是
如果是non-static的函数,如果此对象没有new一个出来,(注意是在heap中)
则在内存中就不存在这个函数的入口,
所以你没有办法执行它,
而static类型的就会在静态存储区当中存在。
这就是最跟本的区别。