Kevin 的个人资料Country Metro照片日志列表更多 工具 帮助

日志


2005/12/4

Café Notes

1. Environment Variables
        + Linux/UNIX:
                JAVA_HOME="/.../jdk
                export $JAVA_HOME/lib
 
        + Windows:
                JAVA_HOME: X:\Java\Sun\JDK
                PATH: .;%JAVA_HOME%\bin
                CLASS_PATH: .;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
                
 
 
2. Java  Identifier
package, class, method, variable, parameter's name can begin with letter, digit, $. But can not be Java keywords
 
 
3. Conversions of Expression Numeric Types
If either of the operands is of type double, the other one will be converted  to a double.
Otherwise, if either of the operands is of type float, the other one will be converted to a float.
Otherwise, if either of the operands is of type long, the other one will be converted to a long.
Otherwise, both operands will be converted to an int.
 
 
4. Method
如果被调method没有return 语句,编译时系统会自动在method最后添加"return;"
 
 
5. Bit Operator
a. <<  左边operator在memory中的binary data左移右边operator指定的位数
b. >>  若最高位为0,左边移空的所有位补0; 若高位为1,左边移空的所有位补1
c. >>>  左边移空的所有位补0
 
bit operator above 适用的数据类型  byte, short, char, int, long
a. 低于int型的operator先自动提升为int再移位
b. int型移位 a>>b,系统先将b对32取模,得到的结果才是真正的移位数, so a>>33同a>>1相等,a同a>>32相等
c. long型移位 a>>b, 系统先将b对64取模,...
 
 
6. Control Flow
switch 语句判断条件只接受 byte, short, int, char
 
 
7. Memory 分配
Java 把内存分为栈(stack)内存堆(heap)内存.
栈内存: 在method中定义的基本类型的变量和对象的引用变量均在method的栈内存中分配
堆内存: 堆内存存放由new创建的object & array.堆中分配的内存,由JVM 的Garbage Collection管理.在堆中产生了一个object or array后,还可以在栈中定义一个引用变量,让栈中的这个引用变量的取值等于object or array在堆内存中的首地址,以在程式中使用栈中的引用变量访问堆中的object or array.引用变量为普通变量,定义时在栈中分配,引用变量在程式run到其作用域之外后被释放.
 
 
8. OOP 三特征
a. Encapsulation (封装): 将类的成员变量声明为private,再提供一个或多个pbulic方法实现对该成员变量的访问或修改.一个类通常是一个小的module, module设计追求强内聚(许多功能尽量在类内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)
b. Inheritance (继承)
c. Polymorphism (多态)
 
 
9. 初始化 
变量在初始化前不能使用, method内的变量不会隐式初始化,需显示初始化.
 
实例化对象调用构造方法的内部实现过程:
隐式初始化(系统default初始化)--->显式初始化(按成员变量的赋值初始化)--->参数初始化(按调用构造方法的参数列表初始化)
 
 
10. Java is always called by value
基本数据类型: 传递该数据值本身
引用数据类型: 传递这个变量的值本身,即object or array 在堆内存中的首地址
 
 
11. Static
类的静态成员被称作 class members (类成员), so静态成员变量叫 class variables (类变量), 静态成员方法叫 class methods (类方法).用static 修饰的class variables & class methods不属于类的某个对象,而属于类.
 
a. static methods只能直接调用同类中的其它class members (class variables & class metods),不能直接访问类中的非static成员.因为非static变量和方法,需先创建类的实例对象后方可使用,而static methods在使用前无需创建任何对象.
 
b. static methods不能以任何方式引用this和super 关键字.理由同上, static methods在使用前无需创建任何对象,当static methods 被调用时,this所引用的对象根本就未产生
 
c. main方法时static的.so在main方法中不能直接访问类中的非static成员,必须创建类的实例对象后,才能通过这个对象去访问类中的非static成员
 
 
12. final
a. final mark了的class不能被继承
b. final mark了的method不能被子类override
c. final mark 了的变量 (成员变量和局部变量) 即成为常量, 只能赋值一次, 其life cycle超出method运行的life cycle
d. method中的inner class只能访问该method内的final mark了的局部变量
 
 
13.Inner Classes
当类A中的代码要用到类B的实例对象,而类B的代码又要访问类A的成员,可以将类B做成类A的内部类
       package com.sun.java;
       public class Outer{
           public static void main(String[] args){
                ...
           }
           static class Inner{
              private String name;
              public String getName(){
                  return this.name;
              }
        }
a. static inner classes     
    其它类访问静态内部类用法:
        Outer.Inner.inner = (new Outer()).Inner();
        ic.getName(); 
或    Outer outer = new Outer();
        Outer.Inner.inner = outer.Inner();         
 
b. member inner classes
    同类类访问成员内部类用法:
        Outer outer = new Outer();
        Inner inner = outer.new Inner();
或    (new Outer()).new Inner();
    其它类访问成员内部类用法:
        Outer.Inner inner = (new Outer()).newInner();
 
c. local inner classes (方法或方法中的块中定义)
local inner classes定义在method或块内,不能被声明为public, protected, private, static, local inner classes 只在method内有效
 
d. anonymous inner classes (方法或方法中的块中定义)
anonymous inner classes 没有类名;no keyword:class, extends, implements; no constructors; and implicitly extends a superclass 
eg:        public Test anonymousInnerClass(){
                 return new Test(){
                    public void test(){
                              ...
                    }
                 }
             }
 
方法或块中定义的内部类(local inner classes & anonymous inner classes)只能访问方法中的final类型局部变量,因为final定义的局部变量相当于一常量,其作用域超出方法生命周期
eg:    package com.sun.java;
         class Outer{
            String str = new String("Sun Microsystems");
            public void outer(final int iArgs){
                int test = 10;
                class Inner{
                   public void inner(){
                       System.out.println(str);
                       System.out.println(iArgs);
                   }
                }
            }
         }
在inner 方法中,可以访问变量str和iArgs,不能访问test
 
 
14. Access Control
                  class(本类)            package(同包)          subclass(子类)             others

public              OK                            OK                            OK                     OK
protected         OK                            OK                            OK                        
default             OK                           OK
private             OK 

                                          
                                                     
15. Inheritance
子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法.在子类中可使用super(parameters)调用父类构造方法.
 
若子类的构造方法没有显式调用父类构造方法,也没有使用this调用重载的其它构造方法,则在产生子类实例对象时,系统默认调用父类无参数的构造方法.若父类没有无参数的构造方法(包括系统提供的),则编译出错.so定义类时,只要定义了有参数的构造方法,通常还需定义一个无参数的构造方法.
 
super(...) & this(...)不能同时出现在一个构造方法中,for 它们都必须是构造方法中的第一个语句.
 
 
16. Abstract class
a. 任何带有抽象method的class都必须声明为abstract class, abstract class的之类必须override所有的abstract method后才能被实例化
b. abstract method只需声明,无需实现
c. abstract class中的某个method不一定是abstract的
 
 
17. Interface
a. interface是只包含常量和method的定义, 而没有变量和mehod的实现的abstract class
b. interface里声明的变量缺省为public static final
c. 可以定义一个新的interface,  用extends继承一个已有的interface; 也可以定义一个class, 用implements去实现一个interface中的所有method; 亦可定义一个abstract class, 用implements去实现一个interface的部分method, 未被实现的method仍然是abstract method,被该abstract class继承
 
                                                                                    To be continued...
2005/11/7

package 程式的编译

很多人写Java程式都不喜欢用package,当然不是指那些有着深厚功底从事Java开发多年的老手,而是接触Java不久的人,刚开始学还不理解package还说得过去,有基础了还不用package可不是个好习惯...

一起来分享package:

程式 Test.java 存在E:\ 下,Test源码:

package com.pilot.util;
 
public class Test{
     public static void test()
     {
         System.out.println("alpha");
     }
}

程式 HelloJava.java 存在D:\ 下,HelloJava源码:

package com.pilot.java;

import com.pilot.util.Test;

public class HelloJava
{
     public static void main(String[] args)
     {
         System.out.println("Hello Java");
         Test.test();
     }
}

程式HelloJava import了E:\com.pilot.util.Test; 并调用了Test类的test() 方法,故需先编译Test.java,用命令

javac -d . Test.java

加上 -d . 编译能产生package的结构,编译完后会在E:\下生成com\pilot\java的目录结构,Test.class会被按package描述的结构存放在E:\com\pilot\java下

转到D:\,编译HelloJava.java的时候,用命令

javac -cp e:\ -d . HelloJava.java

JVM在import 信息的时候查找环境变量里的CLASS_PATH值,若没有set这个值,default是当前目录,若CLASS_PATH的值没有e:\,就会出错,如package com.java.util doesn't exist 云云。上面的编译命令-cp e:\;.是让JVM也查找e:\,这样就能找到E:\com\pilot\util\Test.class

运行

java -cp e:\;. com.pilot.java.HelloJava

运行结果:

Hello Java

alpha

-cp e:\;.其实就是临时把e:\;.加给JVM使能找到Test.class,因为两个bytecode files在不同的分区,所以两个搜索路径都要加上,需要添加"';" 再加"."