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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

为什么看视频觉得讲的很乱,脑袋里没有印象,谁能通俗的讲一下?还有static有什么用?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

10 个回复

倒序浏览
static关键字:
特点:
随着类的加载而加载
优先于对象存在
被所有对象所共享
可以直接被类名调用
使用注意:
静态方法只能访问静态成员
但是非静态成员可以访问静态成员;
静态方法中不可以使用this,super关键字
主方法(main)是静态的
public static void main(String[] agrs){}

评分

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

查看全部评分

回复 使用道具 举报
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。

只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。

static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
人饮水,需要饮水机,而人有很多,不可能都有一台饮水机,所以饮水机是被共享的,而static也是同样的道理,它是被所有的当前类的对象所共享的

评分

参与人数 1黑马币 +3 收起 理由
FFF + 3 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 刘旭升 于 2013-12-30 08:55 编辑

前面的人帮你多层次的说了STATIC,我就说下单例模式。
单例模式:解析一下字面,单-->一,独一,仅。                 例-->在Java就是单例的意思,也成为对象。
                 单例模式-->只有一个对象的模式。对象作用就是调用创建该对象类中的成员变量和方法的。(这个可能罗嗦了,但是你必须要在 名词 和 Java实意 之间建立一种联系,不然别人问你什么是单例,你就会反映不过来,虽然你也知道什么 昨天听松老师讲反射,他说反射和汉语含义没什么关系,这时真的很需要自己建立联系,有的同学没在意过但是记得也很好,其实那是因为他大脑默认建立过了联系(就是习惯)这点自己回想一下就晓得了--->我的小结)
单例作用:避免使用者建立对象来使用功能。
所以1、需要单例自己来建立一个私有的对象,
然后2、建立一个共有方法 目的返回本类对象

(返回的是引用,我自己理解为虎符,谁拥有虎符谁就可以调兵遣将,哪个对象有引用哪个对象就可以实用方法和成员变量)。
  private single(){}                                        //②私有构造函数,使得类外不可用该类创建对象。
  private static Single s=new Single();                //①私有并静态的本类对象
  public static single getInstance(){        
  return s;
  }                                                                //③建立一个公有且静态的返回本类对象的方法。

结合毕老师的代码,你在仔细看看,思考思考。

评分

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

查看全部评分

回复 使用道具 举报
楼上都说的很清楚了,我只能给你一段代码和注释,自己好好琢磨
  1. public class Test6 {

  2.         //声明一个静态实例变量,赋初值为空
  3.         private static Test6 test6 = null;
  4.         //私有化构造函数,让其他类不能实例化该类,实现单例
  5.         private Test6(){
  6.                
  7.         }
  8.         //返回唯一实例,如果实例不存在则初始化,否则返回已经存在的实例
  9.         //同步该方法,避免一个线程进了if(test6==null)判断条件,资源马上被回收,
  10.         //又由另一个线程执行,又进了if(test6==null),这样则会创建多个实例。
  11.         public static Test6 getInstance(){
  12.                 synchronized (Test6.class) {
  13.                         if(test6==null){
  14.                                 test6 = new Test6();
  15.                         }
  16.                 }
  17.                 return test6;
  18.         }
  19. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
public class StaticModifier{      //static 修饰的属性称为静态属性     static int i=10;     int j=20;                      //static 修饰的方法称为静态方法           public static int add(int a,int b){                           return a+b;                   }                      public int add2(int a,int b) {                           return a+b;                   }                      public static void main(String args[]){                                      //访问静态方法和属性时,不用产生一个新的对象,直接通过类名就可以调用了。                   System.out.println("静态属性的值为=="+StaticModifier.i);   //结果是 20                   System.out.println("静态方法的返回值是=="+StaticModifier.add(5,6));  //结果是11                                      //访问非静态的属性和方法时,需要先new一个新的对象出来,通过对象来调用。                   StaticModifier sm=new StaticModifier();                   System.out.println("成员变量的值为:"+sm.j);  //结果也是 20                   System.out.println("非静态方法的返回值是:"+sm.add2(5,6));  //结果也是11,           } }

评分

参与人数 1黑马币 +3 收起 理由
FFF + 3 排版不好、只能鼓励了。

查看全部评分

回复 使用道具 举报
public class StaticModifier{

    //static 修饰的属性称为静态属性
    static int i=10;
    int j=20;
          
          //static 修饰的方法称为静态方法
          public static int add(int a,int b){
                          return a+b;       
          }
          
          public int add2(int a,int b) {
                          return a+b;       
          }
          
          public static void main(String args[]){
                 
                  //访问静态方法和属性时,不用产生一个新的对象,直接通过类名就可以调用了。
                  System.out.println("静态属性的值为=="+StaticModifier.i);   //结果是 20
                  System.out.println("静态方法的返回值是=="+StaticModifier.add(5,6));  //结果是11
                 
                  //访问非静态的属性和方法时,需要先new一个新的对象出来,通过对象来调用。
                  StaticModifier sm=new StaticModifier();
                  System.out.println("成员变量的值为:"+sm.j);  //结果也是 20
                  System.out.println("非静态方法的返回值是:"+sm.add2(5,6));  //结果也是11,
          }
}

评分

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

查看全部评分

回复 使用道具 举报
Zenith 中级黑马 2013-12-31 00:05:47
9#
简单的说下我的理解   希望对你理解有些许帮助.首先,Static   是静态的意思.是当所有方法共享一个属性时,将该属性定义为static后则每创建对象就可以享有.例如你创建一个Person类中定义了3个Student对象,那么每个对象有自己的特有属性,也有共有属性,学生都有国籍   那么当我们把学生定义国籍时就把这个属性抽取出来,然后再输出student.country时.就会自动显示 .
回复 使用道具 举报
Zenith 中级黑马 2013-12-31 00:09:36
10#
我还没说完  按下Enter  就挂了
当static修饰方法时,方法既可以用对象调用,又可以用类型调用.
静态优先于对象存在
静态只能访问静态

这些你自己去写个代码验证下就明白了    看别人的总结   记住了也会忘记    自己敲出来的总结    想忘也会有点痕迹的     勤练  共勉

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 +1鼓励分。

查看全部评分

回复 使用道具 举报
初始化,比起构造方法他更方便,能在里面像一般写程序那样书写你想利用或表达的逻辑,比如,一般情况下构造方法里你是不能调用一般非静态类的方法的,而静态代码块里可以持有某一类的引用而使用一般的方法,这样大大简化了代码,而又起到了初始化的效果。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马