最近老师推荐看传说中的
Thinging in java
果然 很传说书上有看到些地方不大理解 希望大家能给出自己的看法关于static我只知道 这是属于类 不属于对象 并且可以用类名直接点 如Math.random()方法书中这样写到:static 方法可以创建或使用与其类型相同的被命名对象,因此static方法常常拿来做"牧羊人"的角色,
负责看护其隶属同一类型的实例群。请问:这句话应该怎么理解 希望能用大概的代码表达一下。
Thinging in java
果然 很传说书上有看到些地方不大理解 希望大家能给出自己的看法关于static我只知道 这是属于类 不属于对象 并且可以用类名直接点 如Math.random()方法书中这样写到:static 方法可以创建或使用与其类型相同的被命名对象,因此static方法常常拿来做"牧羊人"的角色,
负责看护其隶属同一类型的实例群。请问:这句话应该怎么理解 希望能用大概的代码表达一下。
我建议你先放弃理解这一段话,static的变量和方法毕竟不是那么难以理解,
{
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)
{
}
}}
谁能解释下
因此static方法常常拿来做"牧羊人"的角色,
负责看护其隶属同一类型的实例群。
有什么设计模式是利用的这个static 方法可以创建或使用与其类型相同的被命名对象可能是说的单例模式
但与后边那句话的联系貌似不大啊class Type{
private static Type instance = null;
public static synchronized Type getInstance(){
if(instance == null){
instance = new Type();
}
return instance;
}
}
单根是一个
扩展而言,工厂方法都可以用静态方法做
建立在本类所有对象集合上的统计方法(如,计算对象个数)都可以用静态方法做
问题:static方法可以创建或使用与其它类型相同的被命名对象,因此,static方法常常拿来做‘牧羊人’的角色,负责看护与其隶属同一类型的实例群。” 回答:
其实作者的意思是说,按照GOF(模式四人帮)的观点,单实例工厂类的生产方法,应该是static的。 关于‘牧羊人’的意思是指,在面向对象的语言里,最高级首先是元类,元类(meta class)下面是类,类下面才是对象。对于虚拟机来说,类是元类的对象,static方法是类的方法,而不是对象的方法。 所以,对象就相当于“羊”,类就相当于“羊圈”盛放和标示“羊”,拿出来一只羊,就要问问,你是哪个羊圈里的? static方法相当于“羊圈里的狗”,专门来管理羊。 而元类才是幕后的‘牧羊人’。 thinking作者本科是读物里的,后来才转过来读软件工程(那时候学的是c),可能是半路出家的原因,对面向对象的机制,在理解上有出入。
所以可以直接使用 Math.random() 调用. 理解上面的就可以了
所以可以直接使用 Math.random() 调用. 理解上面的就可以了
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());另外在非静态方法中不能调用静态方法和属性的。
第二章 77页
工厂 生产 对象
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);
}
}
}
这意思?
堆内存,调运速度最慢,调用时没有必要指定大小,可以根据所需动态分布,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]
别把问题看的太复杂了,还有就是用static修饰的变量存储在计算机的位置是ROM,因为这样,所以他和其他的变量有不一样的特性。希望我这段话能给你点帮助。