Scjp笔记

发表于:2007-06-22来源:作者:点击数: 标签:
注:*表示0或多个;+表示1个或多个 Object-Oriented Programming 1.Constructor 没有返回值 如果只定义一个带参数的constructor,则lose缺省的无参数的constructor,new xx()会出错。 2.Source file layout: 定义顺序:Package – >import –> class decl

   
  注:*表示0或多个;+表示1个或多个
  Object-Oriented Programming
  1.Constructor
  没有返回值
  如果只定义一个带参数的constructor,则lose缺省的无参数的constructor,new xx()会出错。
  2.Source file layout:

  定义顺序:Package – >import –> class declaration
  一个文件至少应该有一个class,只能有一个public class,文件名必须要和public class的名称一致,如果没有public class,对文件名没有限制。
  
  3.Package:
  如果文件中没声明Package,则class属于缺省包,即没有名字的包
  
  Identifiers,Keywords,and Type
  1.Identifiers:
  开头以Unicode letter,”_”和”$”。后面可以跟数字;(中文变量,方法名居然都可以!!!牛)
  大小写敏感;
  没有长度限制。
  
  Warning:
  类名必须是ASCII的字母。因为很多文件系统不支持UNICODE.(不过我试了一下,类名是中文的,Compile的时候是可以通过,Runtime时throw java.lang.NoClassDefFoundError)
  
  2.Keywords:
  几个 很生僻的Keywords:
  transient,strictfp,volatile
  
  没有goto和const;没有sizeof()。
  
  4.Basic Java Type:
  共8种。
  Boolean和integer Type之间不能转化。
  
  5.Integral:
  Byte:8bit -2的7次方~2的7次方-1
  short:16bit
  int:32bit
  long:64bit
  
  6.Floating point
  float:32bit
  double:64bit
  
  浮点形默认是double.
  float a = 1.02 //compile error
  float a = 1.02f or float a = 1.02F //correct
  
  7.类型的取值范围
  Data TypeSize (bits)Initial ValueMin ValueMax Value
  boolean1false falsetrue
  Byte80-128 (-27)127 (27 – 1)
  Short160-215 215 - 1
  Char16‘\u0000’‘\u0000’ (0)‘\uFFFF’ (216 – 1)
  Int320-231 231 - 1
  Long640L-263 263 - 1
  Float320.0F1.4E-453.4028235E38
  Double640.04.9E-3241.7976931348623157E308
  
  8.Assignment of Reference Type
  基本类型的赋值是值的赋值;int x =6; int y = x;相当于复制x的内容到y上。
  对象的赋值不会赋值内容,两个对象的指针都是指向同一个object..
  
  9.Pass by Value
  Pass argument by Value. 当方法的参数是对象的引用时,参数的值是对象的地址,对象是可以在参数调用时改变的。
  Public class test{
  Public static void changeObject(MyDate ref){
  Ref = new MyDate(1,2,2002);
  }
  public static void main(String[] arv){
  MyDate d = new MyDate(3,3,1988);
  ChangeObject(d);
  }
  }
  结果是d还是为1988,3,3;因为对象的地址是不变的。
  
  10.Java Coding Convention(编码惯例)
  Package – 名词且小写
  Class--名词且第一个字母大写
  Interface—同Class
  Methods-动词且第一个字母小写,分隔词第一个字母大写,不用”-“
  Variable—第一个字母小写,不用”_”,”$”(对于inner class有意义)
  Constants—大写并用”_”
  
  Expression and Flow Control
  1.
  Local variables—Variable defined in method
  Instance variables—Variable defined outside method
  
  Instance variable initialize:
  byte,short,int,long,float,double:0
  boolean:false
  char:’\u0000’
  all reference type:null
  
  
  
  2.Bitwise logic Operators
  位逻辑运算符作用于整形。(byte,char,short,int,long)
  
  3.>>
  右移是把第一个操作数/2的第二个操作数次方
  e.g
  128>>4 returns 128/(2的4次方)
  
  4.优先级
  助记词 运算符类型 运算符
  UlcerUnary+ - ++ – [[ rest...]],()cast
  AddictsArithmetic (and shift)* / % + - << >>
  ReallyRelational> < >= <= == !=
  LikeLogical (and bitwise)&& || & | ^
  CConditional (ternary)A > B ? X : Y
  A LotAssignment= (and compound assignment like *=)
  
  Note:
  对于int,其实是右移右操作数的求32的模;对于long,其实是右移右操作数的求64的模
  int y = x >> 32 ,y没有改变,而不是0.(我试了一下,byte和short分别右移8和16,结果都为0)
  
  4.>>>
  11000>>2 returns 11110
  11000>>>2 returns 00110
  
  Note:
  >>>只对int,long有效。如果对于byte和short,在>>>之前先promote成int,右移完再折回byte或short,这样,通常unsigned shift becomes signed shift
  
  5.<<
  128<<4 returns 128*(2的四次方)
  
  6.+
  short x =5;
  short y=6;
  short z=x+y;//compile error
  因为+的结果最小起码是int
  
  7.cast
  
  
  7.if()要求的是一个boolean表达式
  if(x) //int x cause error
  use if(x!=0)
  
  8.switch(exp1)
  exp1必须是和int兼容,(byte,short,int,char)
  float,long,和类指针(String)都不允许。
  
  9.label:statement
  statement必须是循环(break 还可以是switch)
  
  
  Array:
  1.初始化
  s = new char[5] //initialize for ‘\u0000’
  
  2.多维数组的定义
  int [][] a = new int [2][];
  a[0] = new int[4];
  a[1] = new int[6];
  
  System.out.println(a.length);
  System.out.println(a[0].length);
  
  Result:
  2
  4
  
  3.数组的复制
   int a[]={1,2,3};
   int b[]={4,5,6,7,8,9};
   System.arraycopy(a,0,b,0,a.length);
  
  Result:
  b[]={1,2,3,7,8,9}
  Note:
  System.arraycopy拷贝的是引用,而不是Object.(我试了,如果是基本类型的数组,用arraycopy后,修改其中一个数组的值,另一个数组是不变的;如果是对象的数组,则值会改变)
  
  Inheritance
  1.Constructors Are not Inherited
  
  2.instance of 检查对象的类型(类,接口,数组)
  
  3.cast
  Up Cast(parent class = subclass) :直接用=转化
  Downward(subclass = parent class):如果该对象不是要转化的那个对象,则会在Runtime的时候出错。
  
  
  
  4.OverLoading Method
  必须有不同的参数,可以有不同的返回类型
  
  5.Overriding Method
  有相同的函数名,参数类型,和返回值,实现可以不一样。并且子类的方法不能比父类的函数的访问权限小。
  
  6.Super
  在Constructor中如果要调用Super的话应该写在第一行
  Super能指定参数调用父类的Constructor
  如果在Constructor中没有调用Super,则Compiler会隐含调用父类的”default”的Constructor
  如果父类没有定义非私有的“default”的Constructor,则Compile Error
  
  7.构造函数初始化
  1.分配对象的空间,把instance variable设置default value(Boolean->false,Integer,float->0,reference->null)
  2.
  2.1绑定Constructor的参数
  2.2如果有this(),跳到2.5
  2.3递归调用implicit 或explicit的super
  2.4执行instance variable的explict的赋值
  2.5执行当前的Constructor.
  
  7.Constructor的Rule
  在Constructor中调用的函数应为私有函数。
  因为如果超类Employee的Constructor中有公有函数getDetail,类Manager继承Employee,而manager中override此函数getDetail,声明一个manager的对象时会递归调用Employee的Constructor,而因为是runtime check,实际上Emplyee中调用的getDetail是Manager的getDetail。
  
  public class Emploee extends Object {
   private String name;
   private double salary = 15000.00;
   private Date birthDate;
   private String summary;
  
   public Emploee(String n, Date DoB) {
   name = n;
   birthDate = DoB;
   summary = getDetails();
   }
   public Emploee(String n) {
   this(n, null);
   }
  
   private String getDetails() {
   return "Name: " + name + "\nSalary: " + salary
   + "\nBirth Date: " + birthDate;
   }
  
   public static void main(String[] arg)
   {
   Manager m = new Manager("2","gl");
  
   }
  }
  
  
  class Manager extends Emploee {
   private String department;
   public Manager(String n, String d) {
   super(n);
   department = d;
   }
  
   public String getDetails() {
   return "\nDept: " + department;
   }
  
  }
  
  
  8.如果重载equals,最好重载hasCode()
  
  9.toString

原文转自:http://www.ltesting.net