最近老师推荐看传说中的
Thinging in java
果然 很传说书上有看到些地方不大理解 希望大家能给出自己的看法关于static我只知道 这是属于类 不属于对象 并且可以用类名直接点 如Math.random()方法书中这样写到:static 方法可以创建或使用与其类型相同的被命名对象,因此static方法常常拿来做"牧羊人"的角色,
负责看护其隶属同一类型的实例群。请问:这句话应该怎么理解 希望能用大概的代码表达一下。

解决方案 »

  1.   

    Like any method, a static method can create or use named objects of its type, so a static method is often used as a “shepherd” for a flock of instances of its own type.以为是翻译的问题,找到英文版的原话看了一下,还是没完全理解,结合上下文也还是没理解。
    我建议你先放弃理解这一段话,static的变量和方法毕竟不是那么难以理解,
      

  2.   

    所谓singleton 设计模式就是这个意思class OnlyOneInstance
    {
      static OnlyOneInstance INS = new OnlyOneInstance();  private OnlyOneInstance()
     {
     }
    }实例群也很好理解class HumanKind
    {
      public HumanKind MAN = new HumanKind("1");
      public HumanKind WOMAN = new HumanKind("0");
      private HumanKind(String kind)
     { 
     }
    }}
      

  3.   

    猜测 static 可能是用在了某种设计模式
    谁能解释下 
    因此static方法常常拿来做"牧羊人"的角色,
    负责看护其隶属同一类型的实例群。

    有什么设计模式是利用的这个static 方法可以创建或使用与其类型相同的被命名对象可能是说的单例模式
    但与后边那句话的联系貌似不大啊class Type{

    private static Type instance = null;

    public static synchronized Type getInstance(){
    if(instance == null){
    instance = new Type();
    }
    return instance;
    }
    }
      

  4.   

    类因为是所有(同类)对象的模板,且Java中对象的所有方法代码都在类中,且所有对象都持有对自己类的引用,这些因素让我们可以将类不仅作为类型的抽象,而且可以作为对象的集合的代表者,即内涵和外延一致化。越说越不明白了吧。Java中可以将静态方法的特殊性用作一些设计模式的实现手段(记得设计模式是跨语言的)
    单根是一个
    扩展而言,工厂方法都可以用静态方法做
    建立在本类所有对象集合上的统计方法(如,计算对象个数)都可以用静态方法做
      

  5.   

    转:
    问题:static方法可以创建或使用与其它类型相同的被命名对象,因此,static方法常常拿来做‘牧羊人’的角色,负责看护与其隶属同一类型的实例群。”   回答:
      其实作者的意思是说,按照GOF(模式四人帮)的观点,单实例工厂类的生产方法,应该是static的。  关于‘牧羊人’的意思是指,在面向对象的语言里,最高级首先是元类,元类(meta class)下面是类,类下面才是对象。对于虚拟机来说,类是元类的对象,static方法是类的方法,而不是对象的方法。  所以,对象就相当于“羊”,类就相当于“羊圈”盛放和标示“羊”,拿出来一只羊,就要问问,你是哪个羊圈里的?  static方法相当于“羊圈里的狗”,专门来管理羊。  而元类才是幕后的‘牧羊人’。  thinking作者本科是读物里的,后来才转过来读软件工程(那时候学的是c),可能是半路出家的原因,对面向对象的机制,在理解上有出入。
      

  6.   

    楼主先看一个比较简单的java语法书籍 ,在看Think in java吧
      

  7.   

    static 写在类是这种static {} 就是每次载入对象时 最先调用
      

  8.   

    I am coming!learn from u!
      

  9.   

    我也正在看 java编程思想 我的总结是 static是一个类型不是一个对象,而类型是可以创建对象,就相当于牧羊人可以放养一样,这里的羊就是对象啊,是不是解释的很通俗易懂啊  哇咔咔
      

  10.   

    楼主有空看下  深入java虚拟机 这本书static声明的方法 被成为 类方法 是属于类的,不是某个具体对象, 在class文件加载的时候初始化static方法和static块(如果我没记错的话)
    所以可以直接使用   Math.random() 调用.   理解上面的就可以了
      

  11.   

    楼主有空看下  深入java虚拟机 这本书static声明的方法 被成为 类方法 是属于类的,不是某个具体对象, 在class文件加载的时候初始化static方法和static块(如果我没记错的话)
    所以可以直接使用   Math.random() 调用.   理解上面的就可以了
      

  12.   

    static 标记的是静态方法或者是静态属性,即一个类中不需要实例改类即可以访问的方法或属性。
    public class Test{
    public static string str="Hi.";
     public static string testStatic()
    {
    return "Hello world";
    }
    }
    //调用不需要生成实例
    System.out.println(Test.str);
    System.out.println(Test.testStatic());另外在非静态方法中不能调用静态方法和属性的。
      

  13.   

    我看的是PDF版的
    第二章 77页
      

  14.   

    没有实例不大清晰。。元类-->类(羊圈)[static方法(狗)]-->对象(羊)狗来管理 羊
    工厂 生产 对象
      

  15.   

    public class Test {

    static List<Test> testList = new ArrayList<Test>() ;
    public int index;
    public Test(){
    testList.add(this);
    index = testList.size()-1;
    }

        public static void main(String[]args) {
         for (int i = 0; i < 10;i++){
         new Test();
         }
         for (Test t:testList){
         System.out.println(t.index);
         }
        }
    }
    这意思?
      

  16.   

    程序运行是在内存中运行,内存分为以下几种:堆,栈、静态存储区、常量存储区、寄存器(可能还有)
    堆内存,调运速度最慢,调用时没有必要指定大小,可以根据所需动态分布,Java中所有对象存于堆内存;
    栈内存,调运速度快于堆内存,调运时需要分配大小,比如C语言中定义一个整形变量,它给你分配好了这个变量的大小;
    静态存储区存储static申明的变量,引用等
    常量存储区只存储常量;
    寄存器,调运速度最快,不易控制,寄存器只用于程序编译
    所以static实质上就是一个Java里关键字,被他申明的变量,或引用在整个内存中都可见
    感觉越说越乱,写段代码
    import java.util.List;public class TestStaticInThread {

    private static final int MAX = 2;

    private static List<String> lists = new ArrayList<String>();

    public TestStaticInThread() {
    new Thread(new Runnable(){
    public void run() {
    System.out.println(MAX);
    for(int i = 0 ; i < 10 ; i ++) {
    lists.add("str-" + i);
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }}).start();
    new Thread(new Runnable(){
    public void run() {
    for(int i = 0 ; i < 10 ; i ++) {
    System.out.println(lists);
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }}).start();
    } public static void main(String[] args) {
    new TestStaticInThread();
    }}这段代码运行结果
    2
    [str-0]
    [str-0, str-1]
    [str-0, str-1, str-2]
    [str-0, str-1, str-2, str-3]
    [str-0, str-1, str-2, str-3, str-4]
    [str-0, str-1, str-2, str-3, str-4, str-5]
    [str-0, str-1, str-2, str-3, str-4, str-5, str-6]
    [str-0, str-1, str-2, str-3, str-4, str-5, str-6, str-7]
    [str-0, str-1, str-2, str-3, str-4, str-5, str-6, str-7, str-8]
    [str-0, str-1, str-2, str-3, str-4, str-5, str-6, str-7, str-8, str-9]
      

  17.   

    上图运行结果可以看到,在同一进程的不同线程之间可以共享static变量
      

  18.   

    问题:static方法可以创建或使用与其它类型相同的被命名对象,因此,static方法常常拿来做‘牧羊人’的角色,负责看护与其隶属同一类型的实例群。”Java code    回答:  其实作者的意思是说,按照GOF(模式四人帮)的观点,单实例工厂类的生产方法,应该是static的。   关于‘牧羊人’的意思是指,在面向对象的语言里,最高级首先是元类,元类(meta class)下面是类,类下面才是对象。对于虚拟机来说,类是元类的对象,static方法是类的方法,而不是对象的方法。   所以,对象就相当于“羊”,类就相当于“羊圈”盛放和标示“羊”,拿出来一只羊,就要问问,你是哪个羊圈里的?   static方法相当于“羊圈里的狗”,专门来管理羊。   而元类才是幕后的‘牧羊人’。   thinking作者本科是读物里的,后来才转过来读软件工程(那时候学的是c),可能是半路出家的原因,对面向对象的机制,在理解上有出入。
      

  19.   

    这个意思要说明的就是一个问题:那就是用是static修饰的成员变量或者方法是属于一个类的,而不是属于某一个实例对象的。
    别把问题看的太复杂了,还有就是用static修饰的变量存储在计算机的位置是ROM,因为这样,所以他和其他的变量有不一样的特性。希望我这段话能给你点帮助。
      

  20.   

    我只清楚static修饰的方法不需实例化就可调用,而且是先于其它非静态的。
      

  21.   

    static方法或者变量。比如,在整个工程中都可以通过 Class.param;的形式访问存取,其实很方便,相当于整个工程项目的全局变量和全局的方法,不需要通过new Class()后访问Class中的static变量或者方法。