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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 焦志鹏 中级黑马   /  2012-10-17 17:44  /  2159 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一直在想static应该是什么是时候用,实际项目中有什么情况是用静态就能达到优化的效果呢?

下面是我自己总结的一些关于static的理解,还请高手补充:

1、static可以理解为全局
       
2、只想调用一个方法,但是不想创建一个对象时,可以用static方法。  ———— 类名调用
                通常将一些公用的函数库做成static类和方法

3、被static修饰的成员变量和成员方法独立于该类的任何对象。
   也就是说它不依赖类特定的实例,被类的所有实例共享
   
4、静态方法只能访问静态的成员和变量,但静态方法、静态变量却可以被非静态成员函数调用;
         不能与this super同用(不涉及实例)
         
5、用static函数调用被声明为private的构造函数
       
        private Soup(){}
       
        public static Soup makeSout()
        {
                return new Soup();
        }

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

6 个回复

倒序浏览
补充:
什么时候使用static关键字:

1 静态变量,当对象中出现共享数据时,该数据被static修饰,

2 静态函数,当功能内部没有访问到非static数据似乎,那么该功能可以定义成static

注意:
1 静态方法中不可以有this、super关键字,因为静态优先于对象存在,所以静态方法中不可以有this、super

2 非静态内部类中不可以声明static成员

3 在静态内部类中,可以定义static方法,但static方法方法只能引用外部类中的静态成员


评分

参与人数 2技术分 +1 黑马币 +6 收起 理由
焦志鹏 + 6 求海贼合集种子~
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
5、用static函数调用被声明为private的构造函数
        
        private Soup(){}
        
        public static Soup makeSout()
        {
                return new Soup();
        }
这个函数可以调用上面的构造函数吗???当static 加载到内存中构造函数是不是还没存在在对内存中?
回复 使用道具 举报
楼主啊,那个海贼的种子吧,我没有,我劝你别看了,那种动漫看着就上瘾,我好不容易才看完的,深有体会!现在是冲击黑马的关键时刻,别想了!海贼一直处于更新中.........等十年后带着孩子一起再看吧!!!
回复 使用道具 举报
用static修饰符修饰的属性是仅属于类的静态属性。
最本质特点:它们是类的属性,不属于任何一个类的具体对象。它不保存在某个对象的内存区间中,而是保存在类的内存区域的公共存储单元。换句话说,对于该类的任何一个具体对象而言,静态属性是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值;同样任何一个类的对象去修改它时,也都是在对同一个内存单元进行操作。
类的静态属性是该类各个对象的共享变量,便于实现一个类不同对象之间的通信。
       static关键字用作成员变量、方法、块和内部类的修饰符。

       ◆static修饰的成员变量叫做类变量(静态变量)
        ◆static修饰的方法叫做类方法(静态方法)

        静态变量是属于整个类的,它们对于这个类的所有对象来说是惟一的。直接通过类名引用。
实例变量只有在生成实例对象之后才存在,才可以被引用。
也把静态变量称为类变量,非静态变量称为实例变量。

class TestStatic{
    static int number=0;    //静态变量
    int number1=0;   //实例变量
    TestStatic(){
        System.out.println(++TestStatic.number);
    }
    public static void main(String []args){
        TestStatic t;
        for(int i=1;i<5;i++){
           t=new TestStatic();
            System.out.println(++t.number1);
}}}   



回复 使用道具 举报
本帖最后由 安显杰 于 2012-10-26 16:58 编辑


  一个静态对象属于一个类,但它不属于实例对象,也不是实例对象状态的一部分.每一个静态变量只存在一份.静态变量通常称为类变量(class variable).在实际中,经常需要这样的一个变量,它被一个类的所有实例对象所共享,如果它同时又是公有的,那么它就可以被这个类的任意访问者所使用.静态变量存在于类的作用域之内.通常声明为private.java中许多时候会用到public static final 这样的变量。
      静态变量可以被位于同一个作用域内的任意方或静态方法访问,访问时使用变量名称即可。如果在类作用域以外访问类,则要使用一个含有类名的表达式访问静态变量,例如:
   Integer.MAX_VALUE,  其中MAX_VALUE是在类库中声明过的。

静态方法)
      静态方法或类方法属于一个而不是属于某个实例对象实现的一部分。可以直接通过类来调用这种方法,而并不是只能由某个特定的实例对象调用。静态的方法不能用abstract声明,而且无论是否明确地指定实际上都是final型的。
   静态方法的声明格式:
   modifiers static typeName methodName (parameterList){
   statementSequence
   }
   modifiers(可以从public,protect,private中选择一个),后面可以加上final,nativc,synchronized中的一个或几个的组合。
   static main是静态方法的一个特殊用法,用static main 方法来建立程序的初始状态,创建一组初始对象,并进行合理的方法调用,使得程序能够继续执行下去,static main方法使用String数组型参数包含了用户在运行时给出的任意命令行参数。


静态初始化器)
   静态初始初始化器(static initializer)时一个语句序列,在装入一个类时执行它。我们用它来初始化静态变量,并且苦于完成一个类所需的其他初始化工作。静态变量可以被直接初始化,但是要进行更复杂的初始化,就需要静态初始化器。它提供了一种与实例变量初始化类似的机制。形式:
   static{ statementSequence}
回复 使用道具 举报
这是static的用法
public class nine {
  public STATIC void A(int x, int y) {
    for (int i = 0; i < x; i++) {
      for (int j = 0; j < y; j++) {
        System.out.print("*");
      }
      System.out.println();
    }
    System.out.println();
  }

  public static void main(String args[]){
       A(3,6);
       A(4,6);
       A(6,10);

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