黑马程序员技术交流社区
标题:
关于static关键字
[打印本页]
作者:
王光保
时间:
2011-7-17 18:47
标题:
关于static关键字
大家都知道static关键字的使用,比如用static关键字声明的变量是静态变量存储在堆内存中,而被static关键字声明的方法是静态方法可以使用
类名.方法
来调用,为什么把方法定义成static类型的就可以想常量一样直接就可以这样调用?原理是什么?
作者:
匿名
时间:
2011-7-17 18:53
这个问题,我以前也问过我的同学:
他给我的解释是: 用static 创建的变量放在 一个堆里面! 在程序运行的过程之中,不会受干扰,不会轻易改变!
我想呀,这个静态方法也差不多如此, 只不过在你调用方法的时候,你取到的数据直接取的是一个引用, 也就是一个地址! 所以这个方法也可以向常量一样调用,都是使用的一个引用,在运行到方法的时候, 处理器就直接运行静态方法中的代码,运行完后,回到以前的地方,继续其他代码!
作者:
匿名
时间:
2011-7-17 23:33
楼上两位理解有误阿。
静态修饰的数据是对象共享的数据,存放在方法区的静态区中。
非静态的数据,是每一个对象特有数据。存放在对象的所属的堆内存中。
为什么可以用类名.方法来调用?因为他们根本不需要使用对象来调用,静态成员都是随着类的加载而加载的,他们先于对象存在。
作者:
匿名
时间:
2011-7-17 23:53
楼上正解,与我理解的相同。用关键字static修饰一个方法,那么这个方法随着类的加载它也会被加载了。还没等这个类创建对象,他就老早存在了,是存在于方法区中,与堆栈无关,随时可以被调用,他会随着类的消失而消失。
作者:
匿名
时间:
2011-7-18 07:54
[code]public class StaticTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person1.t = 100;
System.out.println("Person1.t="+Person1.t);
System.out.println("Person1.getTotalPerson()="+Person1.getTotalPerson());
Person1 c1 = new Person1();
Person1 c2 = new Person1();
System.out.println("c1.t="+c1.t);
System.out.println("c2.getTotalPerson()="+c2.getTotalPerson());
}
}
class Person1
{
public static int t=0;//设置了一个static静态成员t,初始化为0
public Person1()
{
t++;
}
public static int getTotalPerson()//定义了一个Static方法.
{
return t;
}
}[/code]关键字static作为修饰符标记变量或方法由整个类共享,若访问控制权限允许,可以不必创建类对象,直接用类名加“.”调用。
一旦类被使用到,首先加载的是它的静态变量,然后是静态初始化块,静态方法。
当此类要被构造一个对象的时候,或者用反射生成其对象的时候,加载其成员部分。依次为成员变量、非静态初始化块、非静态方法、最后才是构造器。
静态部分一旦被加载,就不会被销毁,直到程序结束,关闭虚拟机。
作者:
匿名
时间:
2011-7-18 09:11
就像图纸(类)和汽车(实例对象)一样,图纸封装了汽车的发动的方法,但是图纸却无法调用这个发动方法(除非用了static修饰)。原因很简单,就是在汽车(实例对象)没有NEW出来之前,这些方法根本不存在(实质是在内存没有加载这些方法)。但是用了static修饰后,这些方法就会随着类的加载而被加载,这样的方法和成员变量不属于具体的实例对象而是属于这个类所用(当然实例对象肯定可以调用这些方法或成员变量),既然类拥有方法所有权,那么就可以用这个类直接调用方法。
作者:
匿名
时间:
2011-7-18 10:40
static 定义的一些数据放在了栈里,一般放的是一些常量或者对象的引用。我认为类名.方法只是像指针一样的东西,表明这个方法的位置。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2