2005年12月06日


Google的秘密入口

Google的秘密入口
http://www.google.com/microsoft
微软风格的入口


http://www.google.com/mac
MAC风格的入口

http://www.google.com/linux
Linux风格的入口

http://www.google.com/bsd
FreeBSD风格的入口

Google有各种语言的版本,下面这些语言可能实在是稀罕了点儿

http://www.google.com/intl/xx-klingon/
克林冈语入口(没看过星际旅行吗?)

http://www.google.com/intl/xx-bork/
政治入口?

http://www.google.com/intl/xx-elmer/
宗教入口

http://www.google.com/intl/xx-piglatin/
小猪入口

http://www.google.com/intl/xx-hacker/
黑客专用入口

Google里还有一个小小的彩蛋游戏,大家自己去看吧!
http://www.google.com/Easter/feature_easter.html


下面是一此更有用的彩蛋
http://froogle.google.com/
作用: 通过特殊的搜索引擎,你可以在网上找到你想购物的网站位置。以及你可以很方便的搜索出同类产品的价格。

看看世界各地的商品价格,自己再买的时候心底有数多了把

http://labs.google.com/gviewer.html
作用:一个小玩具,适合那些连鼠标都懒得动的懒人。当你在google上找到了查询结果后,你可以使用google viewer让结果以自己定义的间隔时间来一条一条自动滚屏。

http://labs.google.com/cgi-bin/webquotes
作用:可以搜索出你要查询的内容在internet上被多少其他的网站引用过,可以让你知道internet上其他人对你要查询内容的观点,适合写论文和评论以及特殊用途人使用。

http://labs.google.com/glossary
作用:顾名思义了,就是一个查英语缩写语意的工具,google的词汇表

http://labs1.google.com/gvs.html
作用:给google打一个电话,说出你要查找的内容,然后google会把你要查询的结果显示出来。 给不识字的人用的。

我说的是一些很虚假的真实。

这个世界是虚幻的。我很久以前这么认为,但是缺乏有力的真据,所以就搁浅了。最近看了一下《矩阵革命》,那种虚幻的感觉又油然而生,然后看到报纸上杂乱无章的花边新闻,越来越不真实。我知道,那些都是虚假的东西,都是他们称为炒作的东西。于是再一次感到我们的世界很可能也是虚幻的 。就如我面前的显示器一样,她所呈现的东西其实只不过是表面的东西,而实际上的一些东西却在主机中发生,或者说只是内存上的数据变化。今天看到一篇新闻:

科 学: 美科学家实现6个离子的“薛定谔猫”态

科 学美国科学家最近宣布,他们成功让6个铍离子系统实现了自旋方向完全相反的宏观量子叠加态,也就是量子力学理论中的“薛定谔猫”态。
  根据量子力学理论,物质在微观尺度上存在两种完全相反状态并存的奇特状况,这被称为有效的相干叠加态。由大量微观粒子组成的宏观世界是否也遵循量子叠加原理?奥地利物理学家薛定谔为此在1935年提出著名的“薛定谔猫”佯谬。

所有的人都以为自己是自由的,他们都错了,没有属于自己的东西,一切接是数。

2005年12月05日

这些天想了很多,但做得很少。

虽然我很想看《Think in java3》,但是我却不得不去学习socket编程的东西。虽然公司只是应付式地给我们一件事情去做,但是我们却不得不做。于是在没有任何交流与指导的情况下,我开始学习socket编程。其实我也不是讨厌socket编程,反而害怕自己又学习她,因为我想赶快找一个方向稳定下来研究,我不想什么都知道一点,但是却什么也不能更多的了解一些。

不知道是诸如Java,C++这类的高级语言好呢,还是学习C/汇编这样的低级语言好。然后又觉得硬件知道的太少,底层的东西知道的太少,还有真正理论的基础知道得太少,甚至想从数学开始。。。

我知道自己没有太多时间了,其实和毕业的人也没有什么区别了。只是在用钱的时候才感到自己只是一个靠父母生存的人,什么时候才能独立呢?社会总是给人很恐怖的样子,越来越多的事实揭露社会的另外一面,然后不知道自己的哲学能坚持到何时。

下次我想就做个关于socket编程的东西吧。

2005年12月01日

俗话说得好:天有不测风云。我们就是 云中的雨滴,不知道要落在什么地方。

现在的情形不太好写Blog了,但是我仍然在学习。

今天说说对象的容纳吧。

我们需要容纳对象的容器在于:我们的程序中不知道会出现多少对象,也不知道他们的类型。于是我们用容器(也可以叫集合吧)把他们“装”起来。当然他们是无限大,可以这么想象。值得注意的是想int这样的基本类型是不可以放入这些集合中的。

java 类库中为我们提供的是一系列的容器,我们可以根据需求选择我们需要的,适合我们的用。

常见的如 ArrayList,Hashtable,Map ,Set….等

由于这些容器封装了我们得数据,我们使用得时候也必须使用他得方法。例如从一个集合中得到数据或是写入数据 ,不过我们不用担心,这些方法大都是一样的。这里写个例子:

Collection c = new ArrayList();

Iterator iter = c.iterator();

while(iter.hasNext()){

ArrayList a = (ArrayList)iter.next();

}

这里还有一个更早的东西Enumeration。他是一个和Iterator差不多的反复起(迭代器), Vector ,Stack,Map等集合与新的集合库有不同的操作方法,他们使用Enumeration。例如

Vector v = new Vector();

…//do something

Enumeration e = v.elements() ;

while(e.hasMoreElements){

Vector a = (Vector)e.nextElement();

}

Enumeration 比起Iterator来他的指针是单向的,而且Iterator的方法名字也较Enumeration更简短。

当然我们并不只是可以选择这两样,Iterator下面还有一些如listIterator等。。。

从集合中取对象是要小心的,因为我们根本不知道她里面到底放的是什么东西。所以我们在得到我们的东西之前应该“造型”如上面的例子。这也常常隐含了错误,比如不小心把不合适的类也放进去了,而出来的时候就得到了一个不知道的东西。

我们怎样选择集合呢?

这是我们最关心的问题,然而每一种集合都有他的特性,现在的问题变成我们需要什么 ?选择一个集合并不太困难,因为他们的差别不是很大,而我们了解的也不需要太多。例如我们应该知道ArrayList和LinkedList的区别。在需要大量的插入和删除操作的时候我们应该选择LinkedList,否则还是ArrayList比较好。当我们需要一个没有重复对象数据的集合的时候,我们可以选择Set,是HashSett还是ArraySet呢?作者通过试验告诉我们HashSet比ArraySet要好得多。Map是一个用作“映射”或“字典”的时候使用的。你可以考虑一下测试一下他么之间的新能,HashMap,TreeMap还是ArrayMap。不过暂时不要使用ArrayMap,应为他的性能不知是否改善。在此之前你用TreeMap就行了。

注意的

1,一些未支持的操作

例子: 静态方法Arrays.toList()能将一个数组转化成List,但是如此得到的List是否能得到一般的方法呢?

书上的程序://: Unsupported.java
// Sometimes methods defined in the Collection
// interfaces don’t work!
package c08.newcollections;
import java.util.*;

public class Unsupported {
  private static String[] s = {
    "one", "two", "three", "four", "five",
    "six", "seven", "eight", "nine", "ten",
  };
  static List a = Arrays.toList(s);
  static List a2 = Arrays.toList(
    new String[] { s[3], s[4], s[5] });
  public static void main(String[] args) {
    Collection1.print(a); // Iteration
    System.out.println(
      "a.contains(" + s[0] + ") = " +
      a.contains(s[0]));
    System.out.println(
      "a.containsAll(a2) = " +
      a.containsAll(a2));
    System.out.println("a.isEmpty() = " +
      a.isEmpty());
    System.out.println(
      "a.indexOf(" + s[5] + ") = " +
      a.indexOf(s[5]));
    // Traverse backwards:
    ListIterator lit = a.listIterator(a.size());
    while(lit.hasPrevious())
      System.out.print(lit.previous());
    System.out.println();
    // Set the elements to different values:
    for(int i = 0; i < a.size(); i++)
      a.set(i, "47");
    Collection1.print(a);
    // Compiles, but won’t run:
    lit.add("X"); // Unsupported operation
    a.clear(); // Unsupported
    a.add("eleven"); // Unsupported
    a.addAll(a2); // Unsupported
    a.retainAll(a2); // Unsupported
    a.remove(s[0]); // Unsupported
    a.removeAll(a2); // Unsupported
  }
} ///:~

  这样就导致了UnsupportedOperationException(操作未支持违例),这种设计主要为了新的集合可以不需要为集合接口的所有方法提供有意义的定义,同时他也只在实现的时候出现,而不是使用的时候。

对于集合中的一系列对象,我们关心的还有他们的排序和查找问题。当然这写也是应该具有的基本功能。

Arrays类为所有基本数据类型的数组提供了一个过载的sort()和binaraySearch(),也可用于String和Object

使用方法;Arrays.sort();

                Arrays.binarySearch();

注意的是我们必须想执行Arrays.sort();然后才执行Arrays.binarySearch(),否则会出现预料不到的错误,如死循环。还有sort的排序是以字典顺序,也就是大写字符集载小写字符集前面。

如果想改变排序方式,我们可以创建一个对象实现Comparator接口,过载compare()方法。然后把这个对象传给sort,当然在binarySearch中使用的参数也应该是实现Comparator这个接口的同一个对象。

书上例子:

//: AlphaComp.java
// Using Comparator to perform an alphabetic sort
package c08.newcollections;
import java.util.*;

public class AlphaComp implements Comparator {
  public int compare(Object o1, Object o2) {
    // Assume it’s used only for Strings…
    String s1 = ((String)o1).toLowerCase();
    String s2 = ((String)o2).toLowerCase();
    return s1.compareTo(s2);
  }
  public static void main(String[] args) {
    String[] s = Array1.randStrings(4, 10);
    Array1.print(s);
    AlphaComp ac = new AlphaComp();
    Arrays.sort(s, ac);
    Array1.print(s);
    // Must use the Comparator to search, also:
    int loc = Arrays.binarySearch(s, s[3], ac);
    System.out.println("Location of " + s[3] +
     " = " + loc);
  }
}

如果要排序查询的对象本身实现了Compoarator 接口并写了compareTo(大于返回1,小于-1,等于0),那么也可以直接使用Arrays.sort()。

例如:

//: CompClass.java
// A class that implements Comparable
package c08.newcollections;
import java.util.*;

public class CompClass implements Comparable {
  private int i;
  public CompClass(int ii) { i = ii; }
  public int compareTo(Object o) {
    // Implicitly tests for correct type:
    int argi = ((CompClass)o).i;
    if(i == argi) return 0;
    if(i < argi) return -1;
    return 1;
  }
  public static void print(Object[] a) {
    for(int i = 0; i < a.length; i++)
      System.out.print(a[i] + " ");
    System.out.println();
  }
  public String toString() { return i + ""; }
  public static void main(String[] args) {
    CompClass[] a = new CompClass[20];
    for(int i = 0; i < a.length; i++)
      a[i] = new CompClass(
        (int)(Math.random() *100));
    print(a);
    Arrays.sort(a);
    print(a);
    int loc = Arrays.binarySearch(a, a[3]);
    System.out.println("Location of " + a[3] +
     " = " + loc);
  }
} ///:~

其他的和Arrays都一样。

现面说说怎样创建同步的Colloction或是Map。

例:

//: Synchronization.java
// Using the Collections.synchronized methods
package c08.newcollections;
import java.util.*;

public class Synchronization {
  public static void main(String[] args) {
    Collection c =
      Collections.synchronizedCollection(
        new ArrayList());
    List list = Collections.synchronizedList(
      new ArrayList());
    Set s = Collections.synchronizedSet(
      new HashSet());
    Map m = Collections.synchronizedMap(
      new HashMap());
  }
}

有些时候我们需要创建不可修改的Collection或是Map,下面的例子就是如何创建的方法:将原始容器传递进入一个方法,并令其传回一个只读版本。

//: ReadOnly.java
// Using the Collections.unmodifiable methods
package c08.newcollections;
import java.util.*;

public class ReadOnly {
  public static void main(String[] args) {
    Collection c = new ArrayList();
    Collection1.fill(c); // Insert useful data
    c = Collections.unmodifiableCollection(c);
    Collection1.print(c); // Reading is OK
    //! c.add("one"); // Can’t change it
   
    List a = new ArrayList();
    Collection1.fill(a);
    a = Collections.unmodifiableList(a);
    ListIterator lit = a.listIterator();
    System.out.println(lit.next()); // Reading OK
    //! lit.add("one"); // Can’t change it

    Set s = new HashSet();
    Collection1.fill(s);
    s = Collections.unmodifiableSet(s);
    Collection1.print(s); // Reading OK
    //! s.add("one"); // Can’t change it
   
    Map m = new HashMap();
    Map1.fill(m, Map1.testData1);
    m = Collections.unmodifiableMap(m);
    Map1.print(m); // Reading OK
    //! m.put("Ralph", "Howdy!");
  }
}这里如果试图改变集合,那么就会出现UnsupportedOperationException违例。

我们看看书上的总结:

“下面复习一下由标准Java(1.0和1.1)库提供的集合(BitSet未包括在这里,因为它更象一种负有特殊使命的类):
(1) 数组包含了对象的数字化索引。它容纳的是一种已知类型的对象,所以在查找一个对象时,不必对结果进行造型处理。数组可以是多维的,而且能够容纳基本数据类型。但是,一旦把它创建好以后,大小便不能变化了。
(2) Vector(矢量)也包含了对象的数字索引——可将数组和Vector想象成随机访问集合。当我们加入更多的元素时,Vector能够自动改变自身的大小。但Vector只能容纳对象的句柄,所以它不可包含基本数据类型;而且将一个对象句柄从集合中取出来的时候,必须对结果进行造型处理。
(3) Hashtable(散列表)属于Dictionary(字典)的一种类型,是一种将对象(而不是数字)同其他对象关联到一起的方式。散列表也支持对对象的随机访问,事实上,它的整个设计方案都在突出访问的“高速度”。
(4) Stack(堆栈)是一种“后入先出”(LIFO)的队列。

若你曾经熟悉数据结构,可能会疑惑为何没看到一套更大的集合。从功能的角度出发,你真的需要一套更大的集合吗?对于Hashtable,可将任何东西置入其中,并以非常快的速度检索;对于Enumeration(枚举),可遍历一个序列,并对其中的每个元素都采取一个特定的操作。那是一种功能足够强劲的工具。
但Hashtable没有“顺序”的概念。Vector和数组为我们提供了一种线性顺序,但若要把一个元素插入它们任何一个的中部,一般都要付出“惨重”的代价。除此以外,队列、拆散队列、优先级队列以及树都涉及到元素的“排序”——并非仅仅将它们置入,以便以后能按线性顺序查找或移动它们。这些数据结构也非常有用,这也正是标准C++中包含了它们的原因。考虑到这个原因,只应将标准Java库的集合看作自己的一个起点。而且倘若必须使用Java 1.0或1.1,则可在需要超越它们的时候使用JGL。
如果能使用Java 1.2,那么只使用新集合即可,它一般能满足我们的所有需要。注意本书在Java 1.1身上花了大量篇幅,所以书中用到的大量集合都是只能在Java1.1中用到的那些:Vector和Hashtable。就目前来看,这是一个不得以而为之的做法。但是,这样处理亦可提供与老Java代码更出色的向后兼容能力。若要用Java1.2写新代码,新的集合往往能更好地为你服务”。

好了,今天就到这里了。

2005年11月05日

初始化和清除
   构造函数负责初始化,分配空间。
   构建器,无返回值,可过载overloading

方法过载overloading(根据参数不同而区分)不能根据返回值
   相同名字的方法。

主类型的过载: 若我们的数据类型小于方法中的自变量,就会向上cast,转换。 如果是大于的话,需要强制转换(信息可能丢失)
 默认构造器:创建一个空对象。如果定义一个构建器,那么就不会使用默认的构建器。

“this”关键字,表示调用它的对象的句柄。//当前对象的句柄

在构建器中调用构建器。使用“this”关键字。例如:

public class Moop{
            int lit;
            int pak;
       public Moop(int x){
                lit = x;
            }
       public Moop(int x,int y){
               this(x);                  //在构建器中调用了构建器。this表示当前对象句柄。
               pak = y;
            }
}
“static”关键字,static定义的方法没有this句柄
注意:我们不可以从一个static方法内部发出对非static方法的调用,除非将以个句柄传到static方法内部。
清除:收尾和垃圾收集
         垃圾收集器只知道释放new分配的内存。当需要释放一些特殊内存的时候,Java提供了一个名为finalize ()的方法。可以在我们的类中定义它。
 finalize()工作原理:当垃圾收集器准备好释放对象空间,它首先调用finalize()方法,并且需要在下一次垃圾收集的过程中才真正回收对象内存。
三个重点:
    1、垃圾收集并不等于“破坏”(释放)Java对象并非肯定最为对象被收集。
  2、我们的对象可能不会当作垃圾被收集掉。
  3、垃圾收集只和内存有关。
什么时候用finalize()呢?答案是最好不用。似乎finalize()没有多少用途,只是在一些特殊的地方。非Java对象调用。

C++ 中的所有对象都必须“破坏”,而Java中大多时候由垃圾收集器来完成。finalize()最有用的地方就是观察垃圾收集过程。
例:

 //:Garbage.java
 //Demonstrate of the garbage
 //Collector and finalization

class Chair{
    static boolean gcrun = false;
    static boolean f = false;
    static int created = 0;
    static int finalized = 0;
    int i;
    Chair(){
        i = ++created ;
        if(created == 47)
           System.out.println("Created 47");
          }

 protected void finalize(){
          if(!gcrun){
             gcrun = false;
             System.out.println(Beginning to finalize after "+created+" Chairs have been created");
                    }
          if(i == 47){
             System.out.println(‘Finalizeing Chair #47,"+"Setting flag to stop Chair creation");
             f = true;
                     }
          finalized++;
          if(finalized >= crated)
              System.out.println("All" + finalized + "finalized");
       }

}

public class Garbage{
    public static void main(String[] args){
                if(args.length == 0){
                      System.out.println("Usage:\n"+
                                          "Java Garbage before\n or:\n"+
                                          "Java Garbage after");
                      return;
                                     }
                      while(!Chair.f){
                               new Chair();
                               new String("TO take up space");
                               }
                       System.out.println("After all Chairs have been created:\n"+ "total created = "+Chair.created+
                                           ", toatl finalized = " +Chair.finalized);
                      if(args[0].equals("before")){
                                System.out.println("gc():");
                                System.gc();
                                System.out.,println("runFinalization():");
                                System.runFinalization();
                                System.out.println("bye");
                                }
                       if(args[0].equals("after")){
                                 System.runFinalizerOnExit(true);
              }
}          

   System.runFinalization()( 收尾)与垃圾收集是否运行无关。Sun公司文档称应该先运行收尾模块,然后再释放存储空间,然而这里若先调用System.runFinalization(),再调用 System.gc(),则收尾模块根本不会运行。(可以自己试一下,我还没有试)

成员初始化:
      若程序员没有初始化,那编译器会为他们赋一个值:
Data Type                          Inital value
boolean                            false
char                                          (Null,不显示)
byte                               0
short                              0
int                                0
long                               0
float                              0.0
double                             0.0

规定初始化:在定义同时赋初值(C++ 中不能这样做)可以用new,方法(带返回值)来初始化

构建器初始化:在用此初始化之前定义的数据成员已经被编译器赋给默认值,所以在构建器中没有强迫我们初始化。

静态数据的初始化:static的初始化只有在必要的时候才会进行。初始化时首先是static

对象的创建过程:以名为Dog的类为例
  1.类型为Dog的一个对象首次创建时,或Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class(在环境变量中设置搜索路径)
    2.找到Dog.class后(它会创建一个class对象) 它的所有static初始化模块都会运行.因此,static初始化仅发生一次,即在class对象首次装载时。
    3.创建一个new Dog()时,Dog对象分配足够的内存存储空间。
    4.这种存储空间会清为零,将Dog中所有基本类型设为他们的默认值。
    5.进行字段定义时发生的初始化都会执行。
    6.执行构建器。

明确进行静态初始化
     例:
       class Spoon{
          static int i;
     static{                      //静态初始化开始
          i = 47;
           }
     }

数组初始化: Java中的数组大小在编译的时候才决定,在运行的时候才创建。在编译的时候进行边界检查。牺牲性能换来安全。
 
         int[] a1 = {1,2,3,4,5};
         int[] a2 ;
          a2 = a1; //复制一个句柄。
   对于非基本数据类型的数组初始化:使用new
       Integer[] a = new Integer[] {            //java1.1以后版本支持
                            new Integer(1);
                            new Integer(2);
                         };

          Integer[] a = {             //java 1.0 版本支持(唯一)
                         new Integer(1);
                         new Integer(2);
                        }

未知参数数量大小,及类型:变参表
              //:VarArgs.java
                            //Using the Java1.1 array syntax to create
                            //varivale argument lists
                            class A{int i;}
                           
                            public class VarArgs{
                                  static void f(Object[] x){
                                    for(int i = 0 ; i < x.length ; i++)
                                           System.out.println(x[i]);           //每一个Object都有一个toString(),自动转换
                                          }
                    public static void main(String[] args){
                                      f(new Object[]{                  //不同的类型
                                                 new Integer(47),new VarArgs(),
                                                 new Float(3.14),new Double(11.11)});
                                      f(new Object[]{"one","two","three"});
                                      f(new Object[]{new A(),new A(),new A()});
                                   }
              }
              
多维数组初始化:
                 int[][] a1 = {
                              {1,2,3},
                              {4,5,6},
                              };

                  Integer[][] a2 = {
                           {new Integer(1),new Integer(2)},
                           {new Integer(3),new Integer(4)},
                           {new Integer(5),new Integer(6)},
                           }

                 int[][][[] a3 = new int[pRand(7)][][];             //pRand(int)是一个随机方法
                        for(int i = 0; i < a3.length;i++){
                            a3[i] = new int[pRand{5)][];
                            for(int j = 0 ;j<a3[i].length;j++)
                                 a3[i][j] = new int[pRand(5)];
                            }

2005年11月01日

今天的东西也很基础,不过不要紧,慢慢来。

Java运算符: 一个运算符可能改变运算对象的值。这也叫“副作用”(Side Effect)。所以用的时候要小心。

优先级: 一般优先级很难记住,所以必要的时候用"()"来确定。这个还有个助记的东西:

"Ulcer Addicts Really Like C A lot"溃疡患者特别喜欢维生素C

 助记词  运算符类型  运算符
 Ulcer  Unary  + – ++ – [[rest...]]
 Addicts  Arithmetic(and Shift) * / % + – << >>
 Really  Relational  > < >= <= == !=
 Like  Logical (and bitwise)  && || & | ^
 C  Conditional(ternary)  A>B?X:Y
 A lot  Assignment  =(and Compound assignment like *=)

老外真有意思。

赋值:

          注意:对象赋值。例如:A=B(A、B为句柄);此时A、B都将指向B原先指向的对象。此时A将成为B的别名。无论A或者B对对象的改变都是一样的。当对象作为参数传递时也是传递句柄,所以往往会改变对象本身。

算数运算符:没有什么好讲的。

关系运算符:当两个对象相比较时,请看
      Integer n1 = new Integer(48);

     Integer n2 = new Integer(48);

System.out.println(n1==n2);    //ture of false?句柄比较,false

System.out.println(n1.equals(n2));      //true of false ?对象比较,true

逻辑运算符:

“短路”,当出现false的时候,不需要判断下面的,就可以知道表达式的值。减少运算量。

按位运算符:

 & 与

|  或

~ 非

^ 异或

<<将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。

>>则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1

>>>(java特有)无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0

若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。

移位符号可以和赋值“=”一起用。<<=或者>>=,先移位,后赋值。

三元if-else表达式:不多说了。

逗号只在for语句里面使用

造型运算(Cast)(类型转换)作用是“与一个模型匹配”。

例:

                  int   i = 200;

                  long  lo = (long)i;

                  long l2 = (long)200;

两种: NarrowingConversion(缩小)—————〉编译器会警告,要求强迫转换。主要是信息可能丢失。

             Widening Conversion (放大)编译器可以自动转换 。

中断和继续

         //:BreakAndContinue.java
//Demonstrates break and continue keywords
public class BreakAndContinue{
          public static void main(String[] args){
              for(int i =0;i<100;i ++){
                     if(i==74)break;//out of for loop
                     if(i%9!=0)continue; //Next iterator;
                        System.out.println(i);
                      }
                      int i = 0;
                      //an "infinite loop "
                          while(true){
                            i++;
                            int j = i*27;
                            if(j==1269)break;//out of loop
                            if(i%10 != 0)continue;//top of loop
                            System.out.println(i);
                                  }
                         }
 }///:`

规则:

1、简单的一个continue会退回内层循环的开头,并继续执行。

2、带有标签的continue会到达标签的位置,并重新进入接在那个标签后面的循环。

3、break会中断当前循环,并移离当前标签的末尾。

4、带标签的break会中断当前循环,并移离由那个标签指示的循环末尾。

goto:java中没有使用的保留字。

在Java中唯一用的标签的地方就是拥有套嵌的循环。

字面值:前缀与后缀

char c =0xffff    //max char hex value
byte b = 0×7f    //max byte hex value
short s = 0×7fff  //max short hex value

int i1 = 0×2f    //Hexadecimal lowercase
int i2 = 0X2F      //Hexadecimal uppercase
int i3 = 0177    //octal (leading zero)

long n1 = 200L
long n2 = 200l

float f1 = 1F
float f2 = 1f
float f3 = 12e-45f  //10 to the power

指数表示 默认为double,上面的表示为1*10^(-45),注意需要强制转换float f3 = (float)12e-45f

double d1=1d;
double d2=1D;
double d3=47e47d //10 to the power
表示47*10^(47),可以不要后缀。

"e"表示"Exponential"指数,幂数。

最后以Java中没有sizeof来结束吧。Java不需要sizeof(),因为她无论在那里都是一样的。与平台无关。

真罗嗦,我说我呢。

2005年10月30日

又浪费了几天的时间。现在还没有进入正题。不过今天的有的东西很不错。让我门开始吧。

用句柄操纵对象

操纵对象的标示符实际是指向对象的“句柄”(Handle)。电视(对象)与遥控器(句柄)的关系。

创建一个句柄,如String s;

指向一个对象 (初始化)S = "asdf" ;

创建一个对象并用一个句柄操作

String s = new String("asdf");所有对象都必须创建。

数据保存的地方

1、寄存器:由编译器分配

2、堆栈:保存对象的句柄,而不是对象本身

3、堆:使用“new”关键字。保存对象,可以事先不知道此对象的信息

4、静态存储:固定位置(RAM中)“static”关键字。记住,java对象永远也不会置入静态存储空间

5、常数存储: 直接存入程序内部。需要保护的可存入ROM

6、非RAM存储:程序不运行时仍可存在,在程序控制范围之外。“流式对象”(字节流)和"固定对象“(存在磁盘)

特殊类型,主要类型

 主类型  大小  最小值 最大值  封装器类型 
 boolean  1-bit  -  - Boolean 
 char  16-bit  Unicode-0 Unicode216-1   Character
 byte  8-bit  -128  +127  Byte
 short  16-bit  -2^15  +2^15-1  Short
 int  32-bit  -2^31  +2^31-1  Integer
 long  64-bit  -2^63  +2^63-1  Long
 float  32-bit  IEEE754  IEEE754  Float
 double  64-bit  IEEE754  IEEE754  Double
 void  -  -  -  Void

主类型保存在堆栈,封装器类型则保存在堆中

BigInteger 和 BigDecimal(封装器类型)

BigInteger支持任意精度的整数

BigDecimal支持任意精度的定点数字(币值)

数组:

java编译时系统会自动进行检查。以小的开销换取安全性(数组越界问题)

作用域(不说了)

新建数据类型

“Class"+"new"

字段和方法

主要字段的默认值

boolean false
Char ‘\u0000′(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d

只是作为class中的主成员时默认。在一个函数定义的则是随机分配一个合适的值。

方法,自变量和返回值

奇怪的调用:int x = a.f()

f()是一个没有自变量,返回值为int 的方法。

名字可见性:

Package  和 类名

Package约定反转自己的域名

使用其它组件:import

static关键字  所有程序共用一个拷贝(共用一个存储空间)

class StaticTest{

static int i = 47;

}

StaticTest  t1 = new StaticTest();

StaticTest  t2 = new staticTest();
t1与t2共用一个存储空间放变量i,无论在任何里面改动i ,其它的i也发生改变

static 声明的方法可以直接用类名调用,不需要new

终于到第一个程序了。哈哈

//Property.java

import    java.util.*;

public   class   Property{

public static void main(String [] args)

           {

               System.out.println(new Date());

               Properties p = System.getProperties();

               p.list(System.out);

               System.out.println("—Memory Usage:");

               Runtime rt = Runtime.getRuntime();

              System.out.println("Total Memory = "

                                                +rt.totalMemory()"

                                                +"Free Memory="

                                                 +rt.freeMemory());

                      }

}

}

这个程序都看得懂吧。那就不说了。来看看最关键的注释和文档

/*                          注释内容      */

/*这是

*一断注释

*它跨越了多行

*/

好像“//”这个也能用呀

注释文档:

特殊的注释+ 一个注释提取工具(javadoc)

javadoc输出的是一个HTML文档

主要有两种方法: 1、嵌入的HTML

                               2、文档标记以“@”开头命令

javadoc命令只能出现在注释中

三种注释:

   1、类

  2、变量

  3、方法

只需在他们之前写注释

用javadoc输出的不包括private的注释

引用其它类

使用格式:

 @see 类名

    @see  完整类名

    @see  完整类名#方法名

在生成的文档中 以“See Also“进行超链接(不会检查是否有效)

嵌入HTML

javadoc将HTML命令传递给最终生成的HTML文档

/**

*<pre>

*System.out.println(new Date());

*</pr>

*/

也可以在其它web文档里面运用HTML

/**

*你<em>甚至</em>可以插入一个列表

*<ol>

*<li>项目一

*<li>项目二

*<li>项目三

*</ol>

*/

注意:不需要嵌入<H1> ,<HR>这样的标题

类文档标记

1、@version 版本信息

使用: javadoc -version *.java

2、@author 作者信息

使用 javadoc -author *.java

变量文档标记:只能包括嵌入的HTML以及@see引用

方法文档标记:使用针对参数,返回值,以及违例的文档标记

1、@param 参数名(句柄) 说明

2、@return  说明

3、@exception 完整类名 说明

4、@deprecated   这是表示这个功能可能被废弃不用,或被更新的取代

好了,基本上这些就完了。下一次就是基础了。真想早点看其他的。呵呵

2005年10月26日

开头太“垃圾”啦 。“废话”比较多。还是看要紧的。呵呵

“对象入门”这章有个叫“不要迷失” 的。不错。今天讲这个。

根据经验,盲目写程序简直就是折磨自己(迷失拉)。所以我觉得如果没有想好(设计)好,就不要动手。

所以呢设计很重要的。这两点不错:

一、对象是什么?(项目分割,让我想起WBS,项目管理里面的)

二、他们的接口是什么?(每个对象需要什么样的消息和发出什么样的消息)

现在他列举了4步,我看有点像软件工程了。不过很不错。

1、计划(大一点的项目,考虑时间)

2、如何构建(UML是好东西。哈哈。设计)

3、开始创建(一般程序员都做这个)

4、校订(维护,这个要求高)

最后是选择了,用C++还是要用Java?

这个问题还是留给你们吧,我想两样都学不是坏事呢。不过如果能用Java写操作系统,那么放弃C++ 也何尝不可呢?

今天就到这里。下面要加快速度了。

2005年10月25日

抽象类

         当一个类只希望为自己的衍生类提供接口时,可用abstract。抽象方法也可以用关键字abstract描述。继承抽象类的方法如果不实现其中的抽象方法,那么它也会变成抽象类。抽象类不能被实例化。

interface 关键字延伸了抽象类的概念。完全禁止所有函数的定义。

对象的创建和存在时间

两种方法创建一个对象

一、把对象放入堆栈或静态存储区域,方便控制。可以准确地知道对象的数量,大小,类型和存在时间。

二、在一个内存池中创建对象,该内存池也较作“堆”或“内存堆”。这样的话只有在运行的时候才能决定类的数量,大小,类型以及存在时间。这种方法更加灵活,然而开销也大。java实用的就是这种方法,与类本省的复杂性相比,这样的开销没有太大的影响。

对象的回收。 对于静态的对象无需考虑,编译器已经做好了。动态的可以手动释放,如C++ 也可以利用GC

有JRE所提供的 “垃圾收集器”将为你完成。Delphi中默认没有垃圾收集器,但可以安装。

java中可以强迫垃圾回收,如:System.gc()     ,Runtime.gc(),当然还有finalize()方法,使用System.runFinalization

集合于继承器(迭达器)

集合也称为“容器”。他提供读写操作。如“推”(Push),“添加”(Add)等相似操作。对集合可以用继承器(Iterator)来操作他们。例:

Iterator iter = c.iterator();

while(iter.hasNext())

{
Object obj = iter.next();

do Something with obj;

}

集合的种类:为适应不同的需要。 如:集、队列、散列表、树、堆栈等。例如:Vector和List的区别。他们拥有一致的接口和外部行为。然而相同的操作对他们却有不同开销。Vector的随机访问是等时的。而List则要付出更多的不同开销,远一点的对象可能要长的时间。

我们所要记住的是集合是一个用来置放对象的储藏所,我们关心的是他是否能满足我们的需要,而无需关心她的内部结构设计。

单根结构

所有的类都继承一个终极基础类:Object

单根结构的优点:

1、单根结构中的所有对象都有一个通用的接口,他们最终都属于相同类型。

2、实现类似C++中的模版功能。

3、单根结构中的所有对象都可以保证拥有一些特定的功能。一个单根结构,加上所有对象都在内存堆中创建,大大简化了参数传递。方便实现垃圾收集器。

C++中不用单根结构是为了考虑和C的兼容性。

2005年10月24日

十月,带来的不仅是秋的收获,也是我的生命。那是22年前。

所有的一切,都在这时来到我的面前,要离开了,离开原来的伊甸园,面对那些难以接受的事实。

我每天都有新的希望,而每天都失望了。

我以为自己无法生存下去了,然而我却奇迹般的活过来了。我知道,从今以后,一切不由你做主。

母亲的哭泣,父亲的关怀,姐姐的坚强,使我无法离去。生活不在是我的。

失望过后我依然期望,然后开始新的生活,然后是幻想,内心从未如此放松。

这年头,什么都要钱,什么都要经验。而我最缺的也就是这两样。

原本以为可以轰轰烈烈的爱,没有想到爱需要经验,当然也需要钱。

如同我的宝剑,曾经梦想的宝剑,等到了手里才知道只是宝剑,没有敌人,宝剑何用?

而爱也要对象,等你的对象消失在你身边的时候,你会有什么感觉呢?

眼光如果长盯着一处看,你只会看到死亡;当我们看世界的时候,我们才发现世界如此美丽!

世界很美丽,而我却找不到可以爱的。

活着,十月,新的生命。我将活着,送别过去。

还有那个即将离我而去的她。