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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qqhao01 高级黑马   /  2013-8-19 08:38  /  1768 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 qqhao01 于 2013-8-19 10:03 编辑

{:soso_e132:}在java里定义的static有什么用处啊,定义它的好处是什么,我在网上看到一篇资料说static成员是不能被其所在class创建的实例访问的。那不定义static不是更好吗?求各位大神们解惑

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

7 个回复

倒序浏览
因为static有这样的特点:
1.随着类的加载而加载
2.优先于对象存在
3.被所有对象所共享
4.可以直接被类名所调用
回复 使用道具 举报 1 0
static表示“静态”的意思,可以用来修饰成员变量和成员方法,也可以形成静态static代码块。
1、static变量
按照是否静态的对类成员变量可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量叫实例变量。
两者的区别是:
对于静态变量在内存中只有一个拷贝(可以节省内存),Java虚拟机只为静态变量分配一次内存,在加载类的过程中在方法区完成静态变量的内存分配,可以用类名直接访问(方便),当然也可以通过对象来访问(不推荐)。对于实例变量,每创建一个实例,就会为在堆区为实例变量分配一次内存,实例
变量可以在内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:
在对象之间共享值时
方便访问变量时
2、静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,
因为静态方法比对象先存在,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的。
3、static代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
利用静态代码块可以对一些static变量进行赋值,最后再看一眼这些例子,都一个static的main方法,这样JVM在运行main方法的时候可以直接调用而不用创建实例。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 赞一个!

查看全部评分

回复 使用道具 举报
其实这个你在网上搜搜肯定有很多!
static是可以修饰成员变量和成员方法的。它是随着类的加载而加载的。
此时你还没有创建该类的对象,而你要使用该类中被static修饰的方法,只能用类名调用了,这时候是不能用对象也就是实例调用的。
被static修饰的变量可以是该类所有对象共有的属性,只需要加载一次然后任意对象都可以使用,比如说在中国范围内,一个people类 ,它的国籍是中国,之后每new一个对象他都有这个属性!
回复 使用道具 举报
一:被静态修饰后的数据,被对象所共享数据,二:可以直接以类名.的方式调用;
三:当对象中出现共享数据时,可将对象中的共享数据用静态修饰;这样的好处是,将存在于对内存中的数据放到方法区中,
      被对象所共享,不必每个对象中都有一份,
四;当对象中有共享数据时,要被静态修饰,特有数据不能被修饰,
五:静态的缺点是生命周期长,访问出现局限性,静态只能访问静态。



你说的static成员是不能被其所在class创建的实例访问的???
class创建的实例共享static成员,怎么不能被访问呢??

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
把static看作特权~
随着类的加载而加载的可以看作只有有了圈子形成才会有特权,只要没有圈子有特权没用!
可以直接以类名.的方式调用
被static修饰的变量!就是有特权的人,就可以想干嘛干嘛不用守规矩(生成对象)。
类名.就是告诉是那个圈子的人!
静态方法
就是特权的具体表现!
我就是这么理解的!{:soso_e113:}
回复 使用道具 举报
继续学习,再深入点你就知道为什么要这样啦
回复 使用道具 举报
定义static变量是称为静态变量
理解静态变量必须先理解静态方法
因为静态方法可以通过类名直接调用

public class A{
   public static void print(){
      System.out.println("Hello World");
}
}

如果A类里的print方法没有带static
则调用的话必须是先创建A类的实例化对象再使用
A a=new A();
a.print();

我列举的A类里带了static 所以调用的时候直接通过类名调这个方法而无须实例化对象
A.print();

说完了static方法
我们再来看看static变量
本身来说static变量是没有特殊意义的。声明它只是为了供static方法使用.因为static方法体里所有的变量都必须是static
引用刚才的例子
public class A{
      private static String str="Hello World";
   public static void print(){
      System.out.println(str);
    }
}
因为print方法是static的,所以在它里面使用的变量必须是static
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马