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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xuchulong1 中级黑马   /  2012-11-7 20:04  /  2845 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

static关键字常常使用,但是突然想一下,java里面的static关键字有什么作用,为什么要有这个关键字,main()函数为什么要申明成static的???

点评

看下这个帖子:http://bbs.itheima.com/thread-8121-1-1.html  发表于 2012-11-7 20:08

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

9 个回复

正序浏览
static(静态) 关键字的作用:用于修饰成员(成员变量和成员函数);被修饰的数据属于共享数据,可以被类直接调用.

static 修饰的成员变量和成员函数称为:静态变量或类变量、静态函数。既可以由对象调用,也可以使用类来调用。如:类名.静态变量或静态函数。

static代码块也称为:静态代码块,可以用来初始化类,随着类的加载而执行,且只执行一次。

主函数是静态的,所以必须要用static关键字。
注意:1,在静态函数中,只能访问静态变量或静态函数;而在非静态函数中,既可以访问静态变量或函数,也可访问非静态变量或函数。
      2,静态方法中不能使用this和super关键字。
      3,主函数是程序的入口,static优先于对象存在,而JVM又是通过类来调用主函数的。
回复 使用道具 举报
陈军 中级黑马 2012-11-20 10:56:00
9#
其实最主要的原因还是java的类加载机制。
我的理解:
我们都知道static成员属于类,生命周期随着类。
所以Java类加载器加载类的时候,static成员就可以自动加载,所以程序入口静态main()方法就加载了。

如果main()函数是非static 。就无法加载(或者说难道你让类加载器加载的时候去建立对象?)。

我建议LZ别执拗这种问题。你学多了。自然就懂了。
或者说等以后学深了,应用深了。才去研究JVM的各种机制。
回复 使用道具 举报
本帖最后由 星星 于 2012-11-18 20:44 编辑

     static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。被static修饰的成员变量和成
员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java 虚拟机就能根据类名在运行时数据区的方法区内定找
到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对
象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
    main()函数是程序执行的入口。为了能够在程序的开始执行main方法,必须将其声明为静态,在main方法中调用的成员也必须是静态的,除非建立过相应的实例。
回复 使用道具 举报
李刚 中级黑马 2012-11-9 17:12:56
7#
1.static变量

      按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
    对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

2.static方法

      静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

3.static代码块

      static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

评分

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

查看全部评分

回复 使用道具 举报
static关键字告知编译器main函数是一个静态函数,如果main()方法没有使用static修饰符,那么编译不会出错,但是如果你执行程序将会报错,提示你main()方法不存在。因为包含main()的类并没有实例化,所以其main()方法也不会存。而使用static修饰符则表示该方法是静态的,不需要实例化即可使用。

评分

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

查看全部评分

回复 使用道具 举报
刘文飞 来自手机 中级黑马 2012-11-7 21:13:29
报纸
使用static修饰的方法和变量都具有唯一性,属于类,而不是每个对象共有。来自: Android客户端
回复 使用道具 举报
古银平 发表于 2012-11-7 20:09
看下这个帖子:http://bbs.itheima.com/thread-8121-1-1.html

看了这个帖子还是收获挺多的,以前在main()方法里要用类中得某个变量或者方法的时候就去改那个变量,改成static,也没有考虑过用这个的弊端and好处,现在比较明白了,作下小总结,也帮自己巩固下:1 声明的变量(方法)生命周期过长(这导致一定的资源浪费)      2:访问出现局限性(静态只能访问静态)其实后面这一点我们大家都知道,只是有时候不会总结吧。

那什么情况下我们要去申明静态变量:
1:某个数据需要共享
2:方法中没有对象变量的时候 且这个方法想提高复用性并且很多对象使用就可以 使用静态去修饰这个方法。(拷贝的原话,理解下就是  这个方法如果使用别的变量的时候就需要把那些变量都设置成为 static,那就造成了资源的浪费了,static的方法可以供外部使用,所以如果这个方法复用很多的话考虑设为static   满足上述两个条件,那把它设为static无疑是最好的)
回复 使用道具 举报
为什么main函数要声明成static
因为main函数时程序的入口,可以不用创建所在类的对象(节省空间),直接通过类名就能调用
Static作用:
1, 创建对象时,如果每个对象都有共同的内容,这时,为了节省内存,这些共同的内容就需要被static修饰,被所有对象所共享。
2, 静态修饰的,先于对象存在,随着类的加载而加载,随着类的消失而消失,可以减小生命周期

评分

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

查看全部评分

回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马