A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

307881191

初级黑马

  • 黑马币:7

  • 帖子:15

  • 精华:0

© 307881191 初级黑马   /  2012-7-25 09:59  /  1382 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

{:3_65:}   

5 个回复

倒序浏览
有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。

声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制:
·
它们仅能调用其他的static 方法。
·
它们只能访问static数据。
·
它们不能以任何方式引用this 或super.
如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块:
class UseStatic {
static int a = 3;
static int b;

static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
}

static {
System.out.println("Static block initialized.");
b = a * 4;
}
public static void main(String args[]) {
meth(42);
}
}
一旦UseStatic 类被装载,所有的static语句被运行。首先,a被设置为3,接着static 块执行(打印一条消息),最后,b被初始化为a*4 或12。然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变量a和b,以及局部变量x 。

注意:在一个static 方法中引用任何实例变量都是非法的。

下面是该程序的输出:

Static block initialized.
x = 42
a = 3
b = 12
在定义它们的类的外面,static 方法和变量能独立于任何对象而被使用。这样,你只要在类的名字后面加点号运算符即可。例如,如果你希望从类外面调用一个static方法,你可以使用下面通用的格式:

classname.method( )

这里,classname 是类的名字,在该类中定义static方法。可以看到,这种格式与通过对象引用变量调用非static方法的格式类似。一个static变量可以以同样的格式来访问——类名加点号运算符。这就是Java 如何实现全局功能和全局变量的一个控制版本。

static成员是不能被其所在class创建的实例访问的。

如果不加static修饰的成员是对象成员,也就是归每个对象所有的。

加static修饰的成员是类成员,就是可以由一个类直接调用,为所有对象共有的





回复 使用道具 举报
http://bbs.itheima.com/forum.php?mod=viewthread&tid=3820  
这个帖子里面介绍的很全面,很详细
回复 使用道具 举报
static是静态修饰符。静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间。
static用来修饰成员变量和成员方法,也可以形成静态static代码块。
static不依赖于任何类的实例对象,所以静态变量和静态方法都可以通过类名.变量名,类名.方法名调用。
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,它不在任何的方法体内,虚拟机加载类时会执行这些静态代码块。
如果static代码块有多个,虚拟机会按它们在类中出现的先后顺序依次执行,每个代码块只会被执行一次
回复 使用道具 举报
以前做的总结:
        首先、它是一个修饰符,只能修饰成员(成员变量和成员函数)
        被static修饰的成员变量的数据,可以被所有的对象们共享。
        被静态修饰的成员多了一种调用方式,就是除了被对象调用以外,还可以被类名直接调用,类名.静态成员。
        静态之所可以被类名调用,那是因为静态成员是随着类的加载而加载进内存的。非静态的特点随着对象的加载而加载。
        静态优先于对象加载进内存,所以不能访问对象的内容,但是对象可以访问它的内容。
        被静态修饰的成员为共有数据,对象里面自身村存储的是特有数据。
        Eg:饮水机是共有的,但是喝水的杯子是特有的。       
静态的使用注意事项:
        静态成员函数只能访问类中的静态成员,不能访问非静态的。非静态方法可以访问静态方法。
        静态方法中不可能定义this spuer关键字,因为This代表的是对象,但是静态加载的时候都没有对象存在。
        主函数是静态的。
        实现代码:
        Eg:class MainDemo
           {
                int x=4;
                public static void main(String[] args)//String[] args=new String[0];
                //public : 因为主函数是被JVM调用、权限必须足够大。
                //static :       
                //void :没有返回值。不用返回值给JVM;
                //main:比较特殊,jVM只能识别它,
                //(String[] args):参数列表,数组类型。arguments
                {
       
                        sop(args);//[Ljava.lang.String;@c17614 输出的数组实体地址。
                        //new MainDemo().show();//创建一个对象即可。
                }
       
                public static void main()//是可以存在的,重载。
                {
                       
                }
                void show()
                {
                        sop(x);
                }
           }
           编译失败:
                被修饰后的成员具备以下特点:
        class Person
        {
                String name;
                static String country='CN';//每个对象都有国籍,都相同我们可以单独拿出来。
       
       
                static void show()
                //如果被静态修饰。name是不能被访问的。
                //函数被静态修饰只能访问被静态修饰的成员,非静态成员不能访问。       
                {
                        Sop(country+name);//country之前省略了Person类,Person.country
       
                }
        }
        class StaticDemo
        {
                public static void main(String[] args)
                {
                        Person p=new Person();
                        p.name="zhangsan";
                        p.show();
       
                        Person p=new Person();
                        p.name="lisi";
                        p.show();
       
                        System.out.println(Person.country);被类名直接调用。
       
                        Person.show();
                        //直接调用show方法,说明自始至终在堆内存中没有name这个成员。
                        //当show方法进行输出语句的时候访问conutry和name,但是name
                        //是没有的,访问不到。
                }
        }
       
        成员变量和静态变量的区别:
        成员变量只能被对象所调用,静态成员变量除了可以被对象调用还可以被类名调用
        成员变量也称为对象变量或者实列变量。因为成员变量是被对象使用的变量。静态变量也称为类变量。
        成员变量是随着对象的出现而出现,随着对象的回收而消失。静态变量随着类的加载而加载,随着类的消失而消失。

一个代码中一个静态都不写是可以的,不写静态是因为静态的生命周期特别长,但是我们要考虑到代码的严谨性是需要写一些静态的。
什么时候使用静态?
        成员变量:如果该变量的数据值每个对象都一样。就将其静态修饰,否则就是非静态。
        成员函数:如果功能中没有访问到对象中的特有数据,那么就需要将该函数定义成静态,因为创建对象调用除了浪费堆内存空间没有意义。
        实现代码:
        Class Demo
        {
        Ststic int num=5;
        String name;
        Static Strng country="CN";
       
        Void show()
        {
        Sop(this..name);
        }
        Static void show2()//为什么要静态修饰?
        //因为这个方法在对象在堆内存创建的时候,被调用到了,但是至于它的执行语句并没有访问到任何对象中的属性,只是执行一个输出语句,如果不加static,当对象创建的时候再堆内存进行分配空间,默认初始化,以及分配地址值,这系列动作却没有任何指向引用它,它在堆内存中就相当于垃圾。这样做就没有任何意义了,所以我们用static来修饰它。
        {
        Sop("show run");
        }
        Static void show3()//因为访问到了静态成员变量num;
        {
        Sop(num);
        }
        }
回复 使用道具 举报
  Static:
  想要将对象中的相同数据进行对象的共享,就可可以对该数据进行修饰。该修饰符就是static。
  Static关键
  被static修饰的成员变量,被所有对象共享。
  随着的类的加载而加载,随着类的消失而消失。
  优先于对象存在。
  静态成员可以直接被类名所调用。
特有数据:存储在对象中的数据是。
Statiac的使用注意事项:
1.静态方法只能调用静态成员,不能调用非静态成员。
  非静态方法可以调用静态成员,也可以调用非静态成员。
在静态方法中不允许出现this,super关键字。
  This代表对象,而静态方法执行时还没有对象呢!
主函数是静态的。
静态是有访问局限性的,只能访问静态的内容。

调用成员有两种方式,一个是对象,一个是类()必须要保证被调用的是静态成员。
静态成员变量和非静态成员变量的区别?
1
非静态成员变量又称为实例变量。
静态成员变量又称为类变量,
2
非静态成员变量,随着对象的创建而存在,随着对象的消失而消失。
静态成员变量,随着类的加载而存在,随着类的消失而消失。
3.
非静态变量存在于对象堆内存中。
静态变量存在于方法区中。
4
非静态变量只能被对象所调用。
静态变量可以被类名调用,也可以被对象调用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马