黑马程序员技术交流社区
标题:
谁能解释一下static的用法和静态代码块的用法
[打印本页]
作者:
沙漠里的小鱼
时间:
2013-1-27 21:45
标题:
谁能解释一下static的用法和静态代码块的用法
谁能解释一下static的用法和静态代码块的用法 还有参数的传递的用法 最好带例子 谢谢
作者:
郭孟涛
时间:
2013-1-27 21:55
1. 静态方法
通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法
声明为static的方法有以下几条限制:
· 它们仅能调用其他的static 方法。
· 它们只能访问static数据。
· 它们不能以任何方式引用this 或super。
class Simple {
static void go() {
System.out.println("Welcome");
}
}
public class Cal {
public static void main(String[] args) {
Simple.go();
}
}
调用一个静态方法就是“类名.方法名”,静态方法的使用很简单如上所示。一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。
2. 静态变量
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了
class Value {
static int c = 0;
static void inc() {
c++;
}
}
public class Count2 {
public static void prt(String s) {
System.out.print(s);
}
public static void main(String[] args) {
Value v1, v2;
v1 = new Value();
v2 = new Value();
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
v1.inc();
prt(" v1.c=" + v1.c + " v2.c=" + v2.c);
}
}
结果为:v1.c=0 v2.c=0 v1.c=1 v2.c=1
由此可以证明它们共享一块存储区。static变量有点类似于C中的全局变量的概念。
值得探讨的是静态变量的初始化问题。
如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块:
class Value3 {
static int c = 0;
Value3() {
c = 15;
}
Value3(int i) {
c = i;
}
static void inc() {
c++;
}
}
public class Count {
public static void prt(String s) {
System.out.println(s);
}
Value3 v = new Value3(10);
static Value3 v1, v2;
static {//此即为static块
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
v1 = new Value3(27);
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
v2 = new Value3(15);
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
}
public static void main(String[] args) {
Count ct = new Count();
prt("ct.c=" + ct.v.c);
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
v1.inc();
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
prt("ct.c=" + ct.v.c);
}
}
结果为:v1.c=0 v2.c=0
v1.c=27 v2.c=27
v1.c=15 v2.c=15
ct.c=10
v1.c=10 v2.c=10
v1.c=11 v2.c=11
ct.c=11
这个程序展示了静态初始化的各种特性。如果你初次接触Java,结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。
3.静态类
通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。
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");
}
}
}
结果为:InnerCls
复制代码
作者:
张世钦
时间:
2013-1-27 22:54
本帖最后由 zhangshisk 于 2013-1-27 22:55 编辑
static的用法:用来修饰成员的修饰符,使该成员随着类的加载而加载,生命周期和类一样.可以直接用:类名.成员属性(或成员函数) 进行调用.
静态代码块的用法:用来对类进行初始化,调用类的时候静态代码块最先执行.
以下代码体现了static和静态代码块的用法.
class testStatic
{
public static void main(String[] args)
{ /*这里是为了体现出static代码块的运行优先级.结果为:
静态代码块
构造代码块
构造函数*/
test a = new test();
//static属性的类名调用
System.out.println(test.name);
//static函数的类名调用
test.print();
}
}
class test
{
static String name = "静态属性";
static{
System.out.println("静态代码块");
}
test(){
System.out.println("构造函数");
}
{
System.out.println("构造代码块");
}
public static void print()
{
System.out.println("静态方法");
}
}
复制代码
作者:
廖成
时间:
2013-1-27 23:12
static
关键字既可以修饰变量,也可以修饰方法。被
static
修饰的变量(方法)只会在内存中保存一份,不同变量间共享这份数据,这样做得好处是可以节省内存空间。例如下面的代码:
class Person
{
String name;
static String country = "CN";
public static void show()
{
System.out.println(country);
}
}
复制代码
上面的代码定义了一个类,对于该类的每一个对象,其
country
变量([url=]第4行[/url])的值都是“CN”,所有的对象共享一份
country
数据。
被
static
关键字修饰的变量(方法)除了可以被对象调用外,还可以直接通过类名调用,例如:
System.out.println(Person.country);
Persion.show();
复制代码
在类中,被
static
修饰的变量成为类变量,没有被
static
修饰的变量称为实例变量。这两种变量有以下几点区别:
存放位置不同。实例变量存放在堆内存中。
生命周期不同。在类加载以后,类变量就存在于内存中。而实例变量只有在对象创 建后在存在,即类变量的生命周期长于实例变量。
使用
static
的注意事项:
1. 静态方法只能访问静态成员(包括静态方法和静态变量)。
class Person
{
String name;
static String country = "CN";
public static void show()
{
System.out.println(name + country); (ref:illegal)
}
}
复制代码
[url=]第8行[/url]错误,因为
name
是实例变量,不能被静态方法调用。因为静态方 法先于实例变量而存在。
2. 静态方法中不可以引用
this
,
super
关键字。因为
this
,
super
是对对 象的引用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2