找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2889|回复: 23

我在达内上CORE JAVA的笔记

[复制链接]
发表于 2008-8-13 23:16:40 | 显示全部楼层 |阅读模式
QUOTE:

笔记一共有18天,每天的笔记我都发出来了.代码太多,我这里的太乱 就不发了.

如果哪位同学需要就和我联系吧.

欢迎大家和我讨论JAVA.

 

                       core java  day01 总结

1、Java之父Golsling

   1995年5月23日  Java诞生
   1998年12月     1.2版本  Java2   J2SE J2EE J2ME 
   2004年12月     1.5版本(5.0)  Java    JavaSE JavaEE JavaME
  
2、Java SE --- Java标准平台  
   Java EE --- 企业级平台
   Java ME --- 微小平台,用在资源受限的平台上

   Java SE和JAVA EE是我们主修的

3、环境变量的设置

Linux下: /etc/.profile这是所有用户的全局的文件


  主目录下的vi .bashrc这是当前的用户

 export JAVA_HOME=/opt/jdk1.5.0_06      指向java的安装目录
 export PATH=$JAVA_HOME/binPATH       指向安装目录下的bin子目录
 export CLASSPATH=.JAVA_HOME/lib      类路径
          
 用source .bashrc 生效或注销

 主目录下vi .bash_profile
 
 JAVA_HOME=/opt/jdk1.5.0_06      指向java的安装目录
 ATH=$JAVA_HOME/binPATH       指向安装目录下的bin子目录
 CLASSPATH=.JAVA_HOME/lib      类路径
 export JAVA_HOME CLASSSPATH PATH

 在以上两个文件配置都可以,只配置一个文件就可以

 配置完以后用source .bash_profile生效或注销 

windows下:我的电脑(右键)--->属性---->高级----->环境变量

   用户变量针对的是当前用户
   系统变量针对所有的用户
          在用户变量和系统变量这两个里面只配一个

 JAVA_HOME=c:\Program Files\Java\jdk1.5.0_09(不是JRE)
 path=%JAVA_HOME%\bin (可执行文件)  (path里原有的内容不要改变,只在其后进行添加即可)
 CLASSPATH=.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;

验证是否配置成功:在cmd后,输入javac就可以了,看是否有帮助信息
  Linux下:在命令行输入javac就行了

4、java的特点:

 1、java是一种纯面向对象的编程语言

 2、跨平台:一次编译,到处运行(write once,run anywhere)

             编译(javac)
  .java(源文件)---------------->.class(字节码--与平台无关)

      解释(java)
  .class------------------------->可执行文件

   java虚拟机(JVM):由虚拟机处理操作系统之间的差异,实现跨平台
    _________
   |         |
   | 解释器  |
   |_________|
          |  JVM    |
   |_________|
   |  OS     |
   |_________|
 
 3、简单高效
 
5、第一个程序
 
 文件名:HelloWorld.java

 package mypack;              //package是关键字,在这代表一个目录,mypack是包名
 public class HelloWorld      //public也是关键字,代表这个类是公共的。class也是关键字,代表类。HelloWorld是类名。文件名要与公开的类名完全相同
 {    
  public static void main(String[] args)
  {    
   //public 与 static 的位置可以交换,其它的不可以换位也不可以省略,static是关键字,静态的意思,是全局的。
   //void是返回类型,表示无返回值,main是方法名。
   //String[]代表字符串数组,args代表数组名。
   System.out.println("HelloWorld");  //System是系统,out是输出,println是换行打印
  }
 }

 编译:javac -d . HelloWorld.java        javac  文件名,-d是按照包结构生成.class文件,若目录不存在,会自动创建
 解释:java mypack.HelloWorld            java  类名

 注意:一个源程序可以有多个类,一个类对应一个.class文件
            如果一个源文件中有公开类,则源文件的文件名必须与公开类的类名完全同名(大小写也要相同)
       一个源文件中至多只能有一个公开类

**6、包的概念:
  
 文件多了用文件夹管理,类多了用包来管理,包和目录的结构一一对应

 关键字package mypack; mypack是包名

 编译时javac -d . HelloWorld.java    -d是按照包结构生成.class文件,若目录不存在,会自动创建, .代表当前
 
 运行时 java mypack.HelloWorld        注意:运行时要使当前目录在mypack的上一级,不能进入mypack目录下运行
 
 常用的包:
  java.lang      核心类都放在这个包里,例:System,Object
  java.awt/javax.swing/java.awt.event      GUI所用的类都在这几个包里
  java.applet     动态网页所需要的包,被java script,ajax代替
  java.io      输入、输出流所用的包
  java.net     网络编程时所用的包
  java.util    工具包(日期,集合...),除了lang包以外用的最多的包
  java.sql     操作数据库的包

 引入哪个包里的哪个类:关键字import 

 注意:
  package
  import
  class
  这三个顺序是不可改变的

 习惯上:加包,加注释,换行,缩进

7、注释
 单行注释://   从双斜线开始到本行结束被注释掉

 多行注释:/*
     .....  在这个范围之内的都是注释
         */  
   一般为了美观这样写:/*
          *  comments
          */
    若想在关键字中间使用注释可以使用多行注释

    /**
     .....
    */  这个也是多行注释,但编译时会把这种注释抽出来放在html中做成帮助文档

   有这种注释的程序在编译时要用:javadoc -d doc 源文件名  
   把生成的帮助文档放在doc目录下,生成的帮助文档就是doc目录下的index.html文件
  
  这种注释在包前面,import前面,类前面,方法前面,属性前,构造器前才能被被抽取
  
8、标识符
 
 只能包括字母,下划线,$ , 数字,但数字不能开头,区分大小写,关键字不能做标识符

 一个汉字就是一个字母,汉字也可做标识符,但习惯上不用,而且尽可能回避中文
 
 包名也是标识符
 
 java的关键字都是小写字母,幻灯片44的关键字

 关键字 strictfp   1.2添加
      严格的浮点数
    在类或方法前加上这个,表示精确的浮点数
  assert  1.4添加的
  enum 1.5添加的

 goto , const 是保留字,java中不能使用
 
 true , false,null 不是关键字,是预留字
 
命名规范习惯上:包名----------------- 全是小写字母
  类名、接口名----------每个单词的首字母大写,其它的都是小写
  变量名、方法名--------第一个单词都是小写,第二个单词及以后的每个单词首字母大写
  常量------------------全大写,不同单词间用下划线隔开

9、变量
 
 局部变量:在方法内定义的变量
    (1)一定要先赋值后使用
    (2)作用范围:从定义开始到定义它的代码块结束 
    (3)在重合范围不允许两个局部变量命名冲突

10、数据类型 
 
 一、基本类型(原始类型):8种

  (1)与整型相关的:byte     1B     -128~127       若byte i=128  超出范围就会报错
                    
    byte a=1;byte b=2; byte c=a+b;  //error!!!  1默认为int类型。 因为a+b后自动把类型提升为int,
    正确写法: byte c=(byte)a+b;    //把高字节数值赋值给低字节变量时要强制类型转换

     short    2B     -32768~32767
     int      4B     -2147483648~2147483647
     long     8B     -2的63次方---2的63次方-1     字面值+l或L

  (2)与浮点数相关的:
    float     4B     赋值时加f
    double    8B     赋值时加d
    
    float f=1.3; //error!  默认为double,应为 float f=1.3f;

  (3)布尔值: boolean   1B  字面值 true,false   意味着布尔值和整数不能转换   if(1)  //error!!!!

  (4)字符型:char      2B  采用16位unicode编码   

   char c='a';  char c=97; 
   
   char c='\u0061' -----unicode码值(16进制) 1个16进制表示2个字节, 即使是在注释里面用\u也要规矩的写四个数字,不能随便写

 二、对象类型(引用类型) 
  
  字符串:String  str="abc";
   a+b 若有一方为字符串,则为字符串连接
    "1"+2+3   结果是"123"
    1+2+"3"   结果是"33"

 类:  类是对象共性的抽象,是客观事物在人脑中的主观反映,类是对象的模板
 对象:现实生活中一切客观存在的事物(万物皆对象)
 成员:凡是写在类体括号内的都叫成员

11、基本类型和引用类型的内存分配

 栈:后进先出,简单类型入栈,引用类型变量入栈(给以在堆空间的内容的首地址)
 堆:引用类型内容放入堆空间。
 池
 
      栈空间              堆空间

 |           |      |-----------------|
 |     |      |                 |
     t  | 内存地址  |------|-->|-------|     |
     i |   2       |      |   |name   |     |
 ------------       |   |-------|     |
      |   | age   |     |
      |   |-------|     |
      |   | salary|     |
      |   |-------|     |
      |-----------------|

  


  

  


 
 
 
 
 
 
 
 
 
  
 

 

[此帖子已经被作者于[lastedittime]1218641052[/lastedittime]编辑过]
 楼主| 发表于 2008-8-13 23:17:04 | 显示全部楼层

   core java  day02 总结

1、变量
 
 实例变量:声明在类体内的变量都是实例变量。例:类的属性
    (1)实例变量有默认的初始值,声明后就可使用

   实例变量默认值列表:

  byte short  int  long  float  double    char    boolean     All reference types 

  0     0     0     0L    0.0f   0.0d  ‘\u0000’  false          null

  \u0000是空格

 局部变量:在方法内声明的变量,既凡是不在类体内声明的变量都是局部变量
    (1)一定要先赋值后使用,即必须由程序员进行显示初始化
    (2)作用范围:从定义开始到定义它的代码块结束 
    (3)在重合范围不允许两个局部变量命名冲突

      默认值         使用范围          命名冲突

       实例变量  系统赋初始值   本类的内部使用   允许实例变量和局部变量发生命名冲突,在命名冲突的时候变量的值-->局部优先

       局部变量  先赋值后使用   定义他的代码块   同范围内不允许两个局部变量发生命名冲突
 
2、值传递
 
 基本类型传值,引用类型传地址。

3、运算符:java的运算符的优先级和结合性和c++相同

 计算机采用的是补码,既取反加1。符点数是不能进行移位运算的。
 
 有符号右移:>>=  前面是零补零,前面是一补一;   右移一位比除以2效率高
   正数移完后还是正数,负数移完后还是负数

   所有的非长整型,都是先取32的余数,再移位
   所有长整型的数据都是先取64的余数,再移位

   负数用二进制表示是取反加1
   对于移动负数位都是+32再移位

   右移一位等于除以2,左移一位等于乘以2
   例:12>>1等价于 12/2的1次方--->6
       12>>33等价于12/2的(33%32)次方---->12/2的一次方--->6
       -12>>2等价于-12/2的2次方---->-3
       -12>>66等价于-12/2的(66%32)---->-12/2的2次方--->-3
      
   无符号右移:>>>=  不管是正数还是负数,移完后都是正数
      >>=和>>>=对于负数不一样
        正数:右移n位等于除以2的n次方
        负数:变成正数。

 &&   短路与,前面为假,表达式为假,后面的操作不会进行,& 非短路运算符,会对所有条件进行判断。
     例:  int a = 4;
           if(a<3&(b=a)==0)   b赋值
           if(a<3&&(b=a)==0)  b不赋值 

   ||   短路或,前面为真,表达式为真,后面的操作不会进行,| 会对所有条件进行判断。

    instanceof,是用于判断一个对象是否属于某个类型

    java中的求余运算符“%”可以对两个实型变量求余 5%2=1
 
4、字符串连接:

 两个操作的对象都是数字时,是加法
 若有一个是字符串,就是字符中连接
 例:String str="abc";
     4+str=4abc
     4+str+5=4abc5
     4+5+str=9abc
     s+4+5=abc45

5、流程控制
 
 (1)控制流
      if()
      if()…else
      if()…else if()…else

      注意:else只是和其上面的同层的最近的if()来配对。

 (2)switch(s){
         case 'a':……break;
          case 1:……break;
          default:....break;---default后面的break可有可无
           }
      注意:switch()内数据类型为byte short char int和枚举类型,只有以上四种类型的才可以在switch()中使用。
            case块中不加break时顺序执行下面的语句。
  switch只能用于有限的条件。能用switch写的分支语句都能用if--else来写,故switch不常用 
         
 (3)循环语句
  
  每一种循环都有的四要素:

   条件初始化
   条件定义
   条件变量的变化
   循环体

     for(int i=0;i<n;i++){}  ---- 知道循环次数时最好用for循环

  不知道次数只知道循环条件最好用以下两个
     while(){}               ---- 循环0或多次
     do{} while();-----------注意加分号  循环1次或多次  


6、数组
 (1)数组的定义

  数组是内存中的一块连续的存储空间
    数组是一次性定义多个相同类型的变量 
 
   (2)定义一个数组:

    int[] a; //定义一个数组,变量名就是指向数组首地址的指针
    a=new int[10]; //为数组分配空间,分配了长度为10,int类型的数组空间,把首地址赋值给a,数组长度一旦确定不能改变

  一个数组在java中就是一个对象,数组是一个没有方法,只有属性的对象。
    a.length;  //得到数组的长度   
  
  访问数组元素:

   for(int i=0;i<a.length;i++){
    System.out.println(a);
   }

    数组元素有默认值:默认值是各式各样的0

  数组元素默认值规则:
   int           0
   long          0l
   float         0f
   double        0d
   boolean       false
   对象数组      null(空指针)
 
   (3)初始化、创建、和声明在同一时间
        int[] i = {0,1};   //显示初始化
        int[] i = new int[]{0,1};  //注意:这样显示的初始化的时候,new int[] 中括号中必须是空的,不能填数字
        Car[] c = {new Car(),new Car()};

 (4)二维数组:

  定义二维数组:int[][] a=new int[3][4]  3行4列

  java中的二维数组其实是一维数组,一维数组的元素又是个一维数组
 
     1) 有效定义

         int[][] a = new int[2][3]; (同时给定一维,二维的空间)

   遍历二维数组:for(int i=0;i<a.length;i++){
     for(int j=0;j<a.length;j++){
      System.out.print(a[j]+" ");
     }
     System.out.println();
          }

         int[][] b = new int[3][]; (给定一维的空间,二维空间待定,不规则的二维数组,只有java中有,C++没有)
            b[0] = new int[2];
       b[1] = new int[4];
o       b[2] = new int[3];
       
     2) 无效定义

        int[][] i1 = new int[][3]; //不能不指定行数

  3) 显示初始化二维数组
 
   int[][] c={{1,2,3,4}{5,6,7,8}{9,8,7,6}};

     3) 数组长度

         int[] b = new int[5];
         int len = b.length;  //len = 5;
      
         int[][] a = new int[4][6];
         len = a.length;      //len = 4;
         len = a[0].length;   //len = 6;
 (5)数组拷贝
    System.arrayCopy(Object src, int srcPos, Object dest, int destPos, int length);
    src源数组,srcPos从第几个位置开始拷贝(数组下标,从0开始),dest目标数组,destPos目标数组放置的起始位置,length,表示要拷贝的长度。

  (6)数组排序

  类库中用 Arrays.sort(数组名);  进行升序排序
  该方法是一个经过调优的快速排序法

 作业:写一个模拟彩票系统的随机数程序(从1--33里选),需要6个数
       java.Math.random();  //取值范围是[0,1)这个区间的double类型数据
       要想取[1--33]的随机数可以:int d=(int)(33*Math.random()+1);
       问题就是如何过滤重复,检验代码写的是否正确可以把33改成6看是否有重复数据就知道了
      
   

回复

使用道具 举报

 楼主| 发表于 2008-8-13 23:17:18 | 显示全部楼层

     core java day03 总结

作业讲解:(参看代码:TestRan.java)
 

面向对象:
 
 1、类:同一类事物的抽象的定义,对象的抽象,客观对象在人脑中的主观反映。对象的模版

 2、对象:类的个体(实现),客观存在的一切事物都是对象,有什么(属性),能做什么(方法)。对象有可能被实例化,也有可能不被实例化。
    实例(instance):实现了的对象

  例:Student s;   //Student是类,s是对象
          s=new Student();  //new Student()是实例  

 3、规范:

      package 包名;  0--1个            包名全小写,各单词之间用.隔开
      import 要导入的包路径;  0--n个
      class 类名{   
        field;  //属性  0--n
        构造方法;   //0--n   在编译后的文件中是1--n个
               方法;      //0--n
       }
  
  package;
  import;
  class; 
  这三个顺序不可改变

  类的定义格式: [修饰符(0--n)] class 类名{}

  属性的定义格式:[修饰符] 类型 属性名;

  方法的定义格式:[修饰符] 返回类型 方法名 参数表 [异常] {}

  容易出现的错误:class T{
        private String name;

        System.out.println(name);   //这句位置错误,因为在类体内只允许放属性、构造器、方法和语句块,不允许出现语句。

        {
         System.out.println(name);  //这是正确的,因为是放在了语句块里,被大括号包围起来的多行代码称为语句块。
        }
    }
  
  java中所有的参数类型传递都是值传递,基本类型传递变量中确切的值,引用类型传地址。

 4、this的使用
  
  this不能出现在静态(static)方法中。

  两种用法:
   1)用来区分实例变量与局部变量的冲突 
 
   例:public setName(String name){
    this.age=age;    
      }

   2)this();在构造器里这样写表示调用本类的其它构造器,必须放在此构造器的第一行。
     this(name);   小心循环调用造成死循环


 5、面象对象的三大特性:封装,继承,多态

  a)封装(Encapsulation):(课堂代码:Person.java,TestPerson.java)

   封装,一个对象和外界的联系应当通过一个统一的接口,应当公开的公开,应当隐藏的隐藏。

           (对象的属性应当隐藏),一个对象的内部是透明的,就是把对象内部的可透明性和隐藏的特性区分开,该透明的透明,该隐藏的隐藏。

           (封装的属性)java中类的属性的访问权限的默认值不是private,
     要想隐藏该属性或方法,就可以加private(私有)修饰符来限制只能够在类的内部进行访问。

      对于类中的私有属性,要对其给出一对方法(getXxx(),setXxx())访问私有属性,保证对私有属性的操作的安全性。
      
   方法公开的是方法的声明(定义),即(只须知道参数和返回值就可以调用该方法),封装会使实现的改变对架构的影响最小化。

      完全的封装,类的属性全部私有化,并且提供一对方法来访问属性。给自己用的方法要隐藏                                             
        
      Java Bean 一种组件规范 --> 所有属性私有,访问方法按照命名规范setXxx(),getXxx(),isXxx()方法

         b)重载Overload): (课堂代码:Calculator.java)

   方法名相同,参数表不同,可能相同的返回类型,又叫编译时多态
   
   方法是否重载与返回类型无关。
   
   参数列表必须不同是为了查找、调用不同的方法,虚拟机按照参数的类型与个数来进行方法的调用。

     重载是为了屏蔽对象同类方法由于参数表不同所造成的差异,这个差异对使用者是屏蔽的

           向上就近匹配原则(当有多个参数时,选择少提升的参数)(课堂代码:TestOverload.java)

  API中方法名的规范:获取某个属性的内容getXxx(),设置属性的值setXxx(),判断是不是isXxx(),返回boolean类型

       6、构造器:(课堂代码:Emp.java)
  
  定义构造器的格式:[修饰符] 类名([参数]){
     语句
      }

  构造器无返回类型,方法名与类名相同,既方法名固定为类名。不能继承。
    
                 实例化
  构造器是为了完成由类到对象实例化的过程:类---------->对象  ,(new 构造器)

  构造器的功能是为了创造对象,方法是为了操作对象。

  一般把初始化的代码放在构造器里
  
  package----->分配目录
  import------->导入目录下的文件,引入哪个包里的哪个类文件。import的来源是CLASSPATH(类路径)

          例:import mypack.Welcome;   声明以下用到Welcome时不带包名
  
       import mypack.*;    *表示mypack包下的所有类,不能表示子包

  class 的声明:
   class 类名{
    属性: 类的特征,在命名时用名词表示
    构造器:实现,表示如何实例化类,生成一个具体的对象
    方法:标识对象的行为,在命名时使用动宾短语
   }

  类的使用:new 一个类的构造器,得到该类的对象,用对象.属性/方法去执行代码

  创建对象格式:类名 对象名=new 类名(参数表)

   例:int a; //简单变量
         Student s;  //声明一个Student类的对象变量(或称引用)
           s = new Student();  //调用Student类的无参的构造方法,创建一个对象,把这个对象的地址赋给一个Student类的引用
          (引用指向了这个对象,引用中保存对象的首地址,以后都是通过引用访问这个对象的属性和方法)
           s.age    s引用指向对象的age属性

  构造器可以重载,构造器是由系统自动调用的

  若对一个类没有写构造器,则构造对象时会自动调用默认的无参的空的构造器,但要求最好自己写构造方法,不要依赖默认的构造方法
  
  若自己写了任何一个构造器,系统便不再提供无参的空的构造器
         
  java中没有析构方法,也不允许程序员自己定义析构方法,因为java中有自动垃圾收集器

  
 7、继承
  继承,是对有着共同特性的多类事物,进行再抽象成一个类。这个类就是多类事物的父类。父类的意义在于可以抽取多类事物的共性。

    泛化:把共性从子类中抽取出来。先有子类后有父类叫泛化

      特化:先有父类,再有子类的过程。先有父类再有子类叫特化

     父类与子类 -> 从一般到特殊的关系

     java中的继承要使用extends关键字,并且java中只允许单继承,也就是一个类只能有一个直接的父类。

     这样就是继承关系呈树状,体现了java的简单性。

     子类只能继承在父类中可以访问的属性和方法(实际上父类中私有的属性和方法也会被继承但子类中无法访问罢了)。

  注意:构造器不能被继承。

     实际上一个子类对象中包含一个父类对象
  
  继承的意义,就在于子类可以在父类的基础之上对父类的功能进行发展,继承可以使系统的耦合性降低,
       也就是使对象间的联系便的松散,使多类对象间的联系用其父类对象代替。 
 
 8、super关键字

    (1)区分父子类间的属性遮盖和方法覆盖,用来区分被子类遮盖的实例变量和被子类覆盖的方法,父子类之间的属性相同时会形成遮盖

    (2)super(),表示在子类的构造方法中调用父类的构造方法(可以通过这种方法在子类的构造方法中初始化父类中的属性),
     super()也只能出现在构造方法的第一句上。super(),在子类的构造方中指明构造父类时调用哪一个父类的构造方法构造父类。
       super. 这里所表示的是一个父类的对象,可以通过super来使用父类中可以访问的方法
   (可以在父类中定义setXxx(),getXxx()方法来访问父类中的私有属性),super可以屏蔽父子类中同名属性的冲突。
 
    注意:在写类的时候,一定要写默认无参的构造方法,如果一个构造方法的第一句既不是this(),也不是super()时,
   那么就会在这里隐含的调用他的父类的无参的构造方法,即隐含的有super()。
        this()和super()不能在同一个构造器中出现,因为都必须出现在第一行。既“一山不容二虎”
        所有的对象的构造都是先父后子,先调用this的东西,后调用super的东西.

 9、多态:
 
  java中的多态 --- 运行时多态
  erson p=new Student();  //Person 是编译时类型,Student是运行时类型。运行时类型得是编译时类型的子类
     引用类型      对象类型
     主观类型      客观类型
 
  父类的引用赋值给子类的引用需要强制类型转换,而子类的引用赋值给父类的引用不需要强制类型转换

  多态的用途:可以把不同子类的对象统一当做父类对象来看,屏蔽不同子类的差异
       多态可以使代码变得更通用,以适应需求的变化。也就是定义在父类中的方法,可以在子类中有不同的实现将其覆盖,
          在为父类型的对象变量赋值相应需要功能的子类的对象实例。

    多态的种类:

  a)简单类型的多态
  b)方法的多态
  c)参数的多态
  d)类的多态: Person p=new Student();

  instanceof的用法: 引用 instanceof 类名----判断该引用所指向的对象和后面的这个类是否兼容,用在强制类型转换之前。

   p instanceof Student;    //p指向的对象是不是Student类
     一般用在强制类型转换之前,避免转换异常
  
  if(p instanceof Person)  返回true ,因为向上兼容
  
 10、方法的重写(也叫方法覆盖):重写一定要有继承关系,重载不需要继承关系
  
  java中方法的覆盖-----父子类之间
   1)重写的要求:子类与父类的方法名相同,参数表相同,返回类型相同,不能抛出比父类更大的异常
   2)需要重写的子类方法的修饰符要比父类被重写方法的修饰符相同或更宽

    注意:在jdk1.4以前要求方法的覆盖时,需要方法的返回值,参数表,方法名必须严格相同,
   而在jdk1.5中方法覆盖,子类的中覆盖的方法的返回值可以是父类中被覆盖的方法的返回值类型的子类型。

    注意:子类的方法覆盖父类的方法时,方法的修饰符要么相同,要么子类中的方法的修饰符表示的访问权限要大于父类。
   父类中的私有方法,不能被继承到子类,就是说子类中即使将其覆盖了也不会有多态。   
    
    注意:父子类中有同名的属性不叫子类覆盖了父类的属性,这种情况叫作属性的遮盖(shadow)。

   参考书:java核心技术
  
 作业:写一个日期类(Mydate): 私有化属性(用封装)
   int year;
   int month;
   int day;
  对每个属性给出set,get方法,其中setYear:1900---2100之间,setMonth:1-12之间
                         setDay:1,3,5,7,8,10,12:31天,
       4,6,9,11:30天,
       2:28天或者29天?看是否闰年:year%4==0&& year%100!=0||year%400==0
  写两个构造器,一个无参,一个参数表是(int y,int m,int d)
  
        
             
   

回复

使用道具 举报

 楼主| 发表于 2008-8-13 23:17:46 | 显示全部楼层

        core java day04 总结

作业讲解:(课堂代码:MyDate.java)

从今天开始学习java高级特性
 
1、static(静态):

 静态的属性都存储在池里面。在类加载的时候存入。

 static可以修饰属性,方法,内部类,语句块
 
 静态属性:(课堂代码:TestCount.java)
  例:public class TestCount {
   private int count1=0;
   private static int count2=0; //类变量
     }
     TestCount t1=new TestCount();
     t1.count1;   //普通属性的调用方式
     TestCount.count2; 静态属性的使用方法是用用类名调用,也可以用对象来调用,但建议用类名调用
 
 静态方法中不能使用非静态的属性。静态方法里不能使用this,是因为静态方法里根本没有this.
  例:public static void test1(){
   //count1不可用,count2可以用
      }

  静态方法不能被非静态的方法覆盖。
  静态方法可以被子类的静态方法覆盖,但覆盖以后就没有多态了。

 静态语句块:(课堂代码:TestStatic.java,TestTestStatic.java)
  static{  //类加载的时候调用
   System.out.println("static is called");
  } 
  { //构造对象的时候调用
   System.out.println("is called");
  }

  static语句块>语句块

  静态初始化代码块在类加载的时候运行,所以只执行一次。声明引用时不会进行类加载。
  静态初始化代码块和静态方法一样也不能访问非静态成员。
 
 什么情况下算类加载:类在创建一个实例,或用类名. 调用属性或方法的时候会类加载,即需要运行的时候才会类加载
 
 加载子类会先加载父类,语句块的调用也是先父后子。(课堂代码:Person.java)(课堂代码:Student.java)(课堂代码:Test.java)
 
 先加载父类再加载子类,然后再构造(构造也是先父后子),既先加载后构造

 静态的好处就是可以用类名.方式去调用
 
 单例设计模式:(课堂代码:Singleton.java)

  保证实例唯一,节省内存,构造方法私有 static+private+public

  对象不会改变

  
2、final: (课堂代码:TestFinal.java)

 final可以修饰变量、方法、类。
 
 final变量(实例变量(属性),局部变量):
  
  final等于是把栈给锁定了

  final修饰的变量,一旦赋值,不能改变,表示属性的值是不可变的

  对于实例变量是一个final的,要么在初始化属性时赋值,要么在构造方法中赋值,只能一次且还不能不赋值,即必须在构造对象后有值

  若是用final static修饰的常量,必须在类加载后有值,即在声明时赋值或者在静态初始化代码块中赋值,尽量在声明时赋值。习惯上常量用大写。
      
 final方法:表示这个方法是最终的方法,不能在子类中去覆盖这个方法
 
 final类:表示这个类不能被继承,不能有子类,是断子绝孙类。

3、访问权限:


         访问范围                 子类是否能继承                  | 严
                                                                     |
  private      本类内部访问               不能继承                     |
                                                                            |
    不写(default)    本类+同包                不一定,要看子类和父类是否同包  |
                                                                        |
  protected    本类+同包+不同包子类        子类能继承                    |
                                                                        |
  public        公开                       能继承                        | 宽


  public,final,不写(default),可以修饰类
  public,private,protected,不写(default),static,final 可以修饰属性,一般会用private,static,final
  public,private,protected,不写(default),static,final 可以修饰方法。
  public,private,protected,不写(default),可以修饰构造器

4、Object类: 

 全称:java.lang.Object

 equals:(课堂代码:Student1.java,TestStudent.java)

 public boolean equals(Object obj): 判断两个对象内容是否“相等”。

  ==(双等号):判断的是地址,Object里的equals方法和==判断的是一样的,所以要想比较自己写的类的内容是否相同,就要重写equals方法
  .equals  :判断的是内容
 
 重写equals方法时:
  1、判断是否为null   if(obj==null) return false;
  2、判断类型是否兼容    if(obj instanceof 类)
  3、强制类型转换: 判断每一个不可能会重复的属性:简单类型用==,对象类型用.equals,若每一个属性内容都相等就可以返回true.
  
  
 继承:代码复用,代码维护
 多态可以使参数传递灵活、简洁,定标准
 多态+重写可以帮助父子类之间的传递更方便、更灵活。
 重载:便于用户使用
 
 
 

回复

使用道具 举报

 楼主| 发表于 2008-8-13 23:18:00 | 显示全部楼层

   core java day05 总结

复习:static,final的区别(课堂代码:Sin1.java)

抽象类:(课堂代码:Sin1.java)(课堂代码:Temple.java , DAcount.java)

 比如银行帐户:有定期,活期,外汇,但有共同的特征就是有这两个属性(本金,id),这种情况就可以采取继承的方式
            但定期,活期,外汇又都有各自的不同之处,可以用多态来实现。

 abstract:抽象的关键字,abstract可以修饰类,修饰方法。抽象类只定义框架,不予实现

 抽象类不能用构造器创建获得一个对象,也就是自身不能直接被实例化,由了类来传递参数。抽象类可以声明引用。
 抽象类可以有构造方法(要被子类调用),可以有静态方法,也可以有主方法

 抽象方法:只有定义没有实现
    例:public abstract class Account{  //抽象类
          public abstract String getName();   //抽象方法
      }

 注意:如果一个类中有抽象方法,这个类必须是抽象类,为了避免new对象后没有实例。

       如果某个类没有任何抽象方法,这个类也可以定义为抽象类,即抽象类中不一定有抽象方法,可以有非抽象方法。

       抽象方法是留给子类实现的,子类必须实现抽象方法,否则也不能new对象,并且也要声明为抽象方法,所在的类要声明为抽象类
     
      abstract 与 final  不能同时出现
      abstract 与 static 也不能同时出现
      abstract 与 private 也不能同时出现  

接口:

 为解决多继承的问题引入接口,面向接口编程

 定义接口---interface关键字

 接口可以理解为是一个特殊的抽象类,但在语法上和类有区别。

 属性:接口中的所有属性都是公开静态常量(public static final)
 方法:接口中所有方法都是公开抽象方法(public abstract)
 构造方法:接口没有构造方法

 implements 实现的关键字,变相的继承
 
 接口与接口之间可以有继承关系,允许多继承。
 一个类在继承另一个类的同时可以实现接口,并且可实现多个接口
 
 类和接口之间可以定义实现关系,逻辑上相当于接口是实现类的父类型,
 当我们用类去实现接口时,如果不希望实现类是抽象类的话,那么就要实现接口中定义的所有的方法

 接口和多态配合使用,接口不能构造对象,可以作为引用类型(编译时类型),只能调用接口中定义的方法,运行时找接口实现类中实现的方法
 
 如果对接口类型的引用调用方法,调用的一定是接口实现中的方法
 
 所谓接口对象指的是接口实现类的对象

 子             父

       继承
 类 -----------类(单个)
     extends

      实现
 类------------接口(多个) (课堂代码:Interface1.java)
     implements
 
       多继承
 接口----------接口(多个) (课堂代码:Interface1.java)
      extends

      若是类与类多继承就会形成网状结构,而java里只允许单继承,使类与类形成树状结构。接口解决了多继承的问题,属性都是常量,方法没有实现,故不会形成网状结构。

      接口的使用:1、功能模块 2、标准,一个接口就是一个标准,把制定标准、使用标准、和实现标准分开,标准的使用者和标准的实现者通过标准间接发生联系。
 
封装类:
 
 引用类型更强大

 基本类型的包装类,为了提高效率
 
 JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载。
 除了int(Integer)和char(Character),其余类型首字母大写即成封装类类型名。参考API的java.lang包下的类

 1.4通过构造器转化,5.0可以自动转化

 Integer i2=127;//5.0的新特性,自动封箱
 Integer i5=127; //byte大小的数字自动装箱只有一次
 System.out.println(i5==i2);   这条语句的结果为true,若i2和i5是128或更大时,这条语句的结果就是false了

 转换字符的方式:
 int I=10;
 String s=I+” ”;
 String s1=String.valueOf(i);

 Int I=10;
 Interger I_class=new integer(I);

 封装类.字符串.基本类型


 三种类型六种转换

        new Integer() 或Integer.valueOf()
 int--------------------------------------->Integer

              i.intValue()
 Integer----------------------------------->int

    Integer.toString(...) 或  String s=100+" "
 int--------------------------------------------------->String

    Integer.parseInt("...")
 String---------------------------------->int

      i.toString()
 Integer-------------------------------->String

  Integer.valueOf("...") 或new Integer("...")
 String------------------------------------------------>Integer


Object类中的clone()方法、equals()方法、hashCode()方法和toString()方法:
 
 protected Object clone() throws CloneNotSupportedException:实现Cloneable接口(课堂代码:TestClone.java)
 
        类可以被clone,浅clone不需要重写,深clone需要重写

 public boolean equals(Object obj): (课堂代码:Student.java)
 
 public int hashCode():   equals为true,hashCode相同,但hashCode相同,内存地址不一定相同
 
 public String toString(): 返回一个字符串,直接输出一个对象时,会自动调用对象的toString()方法,输出toString()的返回值
           当没有覆盖toString()方法时,会输出 :对象名@对象哈希码的无符号十六进制表示组成

String类:

 1、String是一个不变模式:不变模式:一个对象一旦产生就不可能再修改(string就是典型的不变模式);通过不变模式可以做到对象共享;
 
 2、如果用Stirng str = “abc”来创建一个对象时,则系统会先在串池中寻找有没有“abc”这个字符串。
  如果有则直接将对象指向串池中对应的地址,如果没有则在串池中创建一个“abc”字符串。
  所以:String str1 = “abc”;
        String str2 = “abc”;
        Str1 = = str2 返回值是ture;他们的地址是一样的。
  也就是说str1和str2都指向了代码空间中相同的一个地址,而这个地址空间保存就是是字符串”abc”;

 如果用String str = new String(“abc”)则直接在堆空间开辟一块存储空间用来存放”abc”这个字符串。
  所以:String str1 = new String(“abc”);
        String str2 = new String(“abc”);
        Str1 = = str2 返回值是false;他们的地址是不一样的。
  也就是说str1和str2分别指向了堆空间中不同的两个地址,而这两个地址空间保存的都是字符串”abc”;

 3、java.lang下的StringBuffer类。
  对于字符串连接
  String str=”1”+”2”+”3”+”4”;
  产生:
       12
       123
       1234
  会在串池中产生多余对象,而真正我们需要的只有最后一个对象,用这种方式进行字符串连接时,不管在时间上还是在空间上都会造成相当大的浪费。
  所以我们应该使用 StringBuffer(线程安全的) 或者 StringBuilder(线程不安全的)
  解决方案:
  String s;
  StringBuffer sb = new StringBuffer(“1”);
  ss.append(“2”);
  ss.append(“3”);
  ss.append(“4”);
  S = ss.toString();
  解决后的方案比解决前在运行的时间上相差2个数量级。

 注意:8大包装类及String类不用再去重写equals()和hashCode()方法,因为已经重写过了。
 
 
 String类常用方法:(课堂代码:TestString.java)
  
  indexOf():查找字符符,返回类型int,参数有很多种,>=0代表有,==-1代表无
  
  split():分拆字符串,按照正则表达式,用传递的参数来分,返回String数组
  
  length():返回int类型,代有字符串长度。
 
  getBytes():能够转码,解决中文的乱码问题
  
  subString():求子串

   public String substring(int beginIndex)
   public String substring(int beginIndex,int endIndex)
 
   有以上两种方式,其中beginIndex - 开始处的索引(包括)。endIndex - 结束处的索引(不包括)。

  replace:是字符的替换,replace All是字符串的替换。
  matches():匹配正则,输入验证

  调用任何String的方法,不会改变自身,除非重新赋值
  
  
 作业:
  班级CLASSROOM,学生(88/其他数字)个、老师1个、机器管理员1个
  学生人数要在构造CLASSROOM的时候强制限定,不可以再改变,管理员每天都只有一个,但是可能不同(所有CLASSROOM共享)
  老师、学生、管理员共性怎么处理
  
  (面向对象的思想、封装、继承、多态、静态、final、抽象)
  

回复

使用道具 举报

 楼主| 发表于 2008-8-13 23:18:13 | 显示全部楼层

                        core java day06 总结

String的最后一个方法:public boolean matches(String regex)

 正则表达式:java.util.regex.Pattern
  
     本身是字符串,自己可以当做模板要求我们去匹配。(课堂代码:TestZh.java)
 
     ^代表行的开头
     $代表行的结尾
    
 注意:在正则表达式中,小括号()也是要通过斜线进行转义的,
    \(代表(
    \)代表)
  
       “[]”代表列表,等于in。
      例:[abc] a、b 或 c(简单类)
       “^”代表非,  [^abc] 表示任何字符,除了 a、b 或 c(否定)

       “-”代表范围

       “\d”表示数字
  
       “|”表示或
  
  [a-z] 数量限制:?代表0-1,*代表0-n次,+代表1-n次,{6}表示必须6次,{6,}表示最少6次,{6,12}表示最少6次,最多12次


集合:

数组:固定长度,类型单一,集合的大小是可以自增的,类型可以混合的。
 
集合(集合类的对象)是用来管理其他若干对象的。它类似于C++标准模板库中的容器,不过在JAVA的集合类的对象中可以用来存放多种类型的对象。

接口和类共同构成了一个集合框架,集合的概念,一个对象可以装载多个对象,这个对象就是集合对象。


1,接口
       Collection
                   ↑
             |ˉˉˉˉˉˉ|    
            Set          List        Map
             ↑                      ↑
             |                        |
          SortedSet              SortedMap


集合中用到的类,接口在java.util包中,在使用时注意将其引入import。

Collection 接口: 用来管理多个对象,集合中的每个元素都是对象。

 1)List接口: 一个List的实现类的对象在管理多个对象时会按顺序组织对象(即按照将对象放入的顺序存储)

                List实现类的对象是有顺序的,List实现类对象中的内容是可重复的。(注意,顺序和排序的区别)

       List接口的特点:有序存放,允许重复,可放不同类型对象

 2)Set接口: 一个Set的实现类表示一个数学概念上的集合,Set的实现类的对象中的元素是无顺序的,也就是不会按照输入顺序来存放,
       Set的实现类对象中的元素是不重复的。

      Set接口的特点:无序存放,不允许重复,也可以存放不同类型对象

 3)SortedSet接口:它是Set的子接口,他的实现类会对集合中的元素进行排序。但是要指定排序规则,他会按排序规则进行排序。


Map,Map中没有对象,而是键值对,由Key,value组成的键值对
     Key是没有顺序,不可重复的。
     value是可以相同的,一个Key和一个value一一对应。

Map 接口(以下介绍其子接口)

SortedMap,这个接口的实现类同样可以实现,不过是对键值对中的Key进行排序,这个接口的实现类也是要指定排序规则的


2、List接口的实现类

  (Collection)       括号中的是接口,旁边的是此接口的实现类
                   ↑
             |ˉˉˉˉˉˉ|    
          HashSet     LinkedList       Hashtable
           (Set)    Vector, ArrayList   Hashmap
                        (List)           (Map)
             ↑                           ↑
             |                             |
           TreeSet                     TreeMap
         (SortedSet)                 (SortedMap)

 
 1> ArrayList是接近于功能的集合类,ArryList的实质就是一个会自动增长的(支持泛型的)数组,ArrayList是用封装的数组来实现的List接口的,底层用数组实现的。
  
  初始容量是10,当超过容量时会进行扩容(容量*1.5+1);

  往集合中添加数据(课堂代码:TestList.java)
 
  使用泛型(课堂代码:TestListF.java)
  
   使用泛型的好处,可以保证存储的类型一致,坏处是不再允许多种对象混存
   在开发中能用泛型的时候最好用泛型。

  扩容:(课堂代码:TestListCap.java)
  
   long strat=System.currentTimeMillis();返回一个从1970年1月1日0时0分0秒到现在为止的毫秒

   使用这个扩容方法进行手工扩容ensureCapacity(100000); 手工扩容,可以大幅提高性能。

 2> LinkedList,它是List接口的实现类,其底层是用双向循环链表来实现的。

 注意:ArrayList的查询效率比较高,增删动作的效率比较差,适用于查询比较频繁,增删动作较少的元素管理的集合。
             LinkedList的查询效率低,但是增删效率很高。适用于增删动作的比较频繁,查询次数较少的元素管理集合。

      ArrayList,LinkedList都是线程不安全的。

 3> Vector: 底层用数组实现List接口的另一个类
     特点:重量级,占据更多的系统开销 线程安全
          (与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多。)
  结论:在考虑并发的情况下用Vector(保证线程的安全)。
  在不考虑并发的情况下用ArrayList(不能保证线程的安全)。

  面试经验(知识点):
  java.util.stack(stack即为堆栈)的父类为Vector。可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,
  且Vector有get方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。
  对于堆栈和队列只能用push类和get类。
  Stack类以后不要轻易使用。
  实现栈一定要用LinkedList。


 实现堆栈 1,数组(ArrayList,增删效率比较低,不适合)
   2,LinkedList(实现堆栈的好方法)
   3,java.util.Stack类,Stack是Vector的子类,Vector类是一个线程安全的(是一个重量级的类),并继承了Vector的方法,
  Verctor类和ArrayList的功能近乎相同。(不推荐使用Stack类来实现堆栈)。

3、Set接口的实现类

 3.1 HashSet

 Set的实现类的集合对象中不能够有重复元素,HashSet也一样他是使用了一种标识来确定元素的不重复,HashSet用一种算法来保证HashSet中的元素是不重复的,   HashSet采用哈希算法,底层用HashMap实现,用数组存储数据。默认初始化容量16,加载因子0.75。16*0.75=12,即在12的时候就开始扩容了.扩容时,原容量*2;

 Object类中的hashCode()的方法是所有子类都会继承这个方法,这个方法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模,
 模(这个模就是对象要存放在数组中的位置)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。

       不可排序 
  Set----------->HashSet------>LinkedHashSet(HashSet的子类)
   |不
   |可
   |排
   |序
  SortedSet----->TreeSet(可排序)

 Hash算法是一种散列算法。

  Set hs=new HashSet();
 
  hs.add(o);
     |
         o.hashCode();
     |
  o%当前总容量  (0--15)
     |            
     |           不发生冲突
        是否发生冲突-----------------直接存放
     |
     | 发生冲突
     |              假(不相等)
        o1.equals(o2)-------------------找一个空位添加
     |
     |  是(相等)
         不添加
 
 覆盖hashCode()方法的原则:
  1、一定要让那些我们认为相同的对象返回相同的hashCode值
  2、尽量让那些我们认为不同的对象返回不同的hashCode值
         3、尽量的让hashCode值散列开(两值用异或运算或用质数运算都可使重复率降低)


 注意:要存入HashSet的集合对象中的自定义类必须覆盖hashCode(),equals()两个方法,才能保证集合中元素不重复,缺一不可。在覆盖equals()和hashCode()方法时,
 要使相同对象的hashCode()方法返回相同值,覆盖equals()方法再判断其内容。
        为了保证效率,所以在覆盖hashCode()方法时,也要尽量使不同对象尽量返回不同的Hash码值。

 如果数组中的元素和要加入的对象的hashCode()返回了相同的Hash值(相同对象),才会用equals()方法来判断两个对象的内容是否相同。
  
 hashCode和equals方法是HashSet认定对象是否相同的标准。

 Collection的实现类对象的遍历方式是用迭代来实现的。
  在使用迭代器时先要获得一个迭代器的对象,Iterator(迭代器接口)这是一个接口,迭代器是在集合类中实现的,
  也就是说,他是一个内部类(匿名内部类)实现的。
  Iterator接口中定义的常用方法方法hasNext(),next()。
  hasNext(),这个方法会使用一个游标,并通过判断游标指向的位置是否存放有对象。
  next()方法也是Iterator接口中定义好的方法,这个方法会使游标指向下一个元素的位置,游标会跳过第一个元素,并返回其中的内容。

 3.2  SortedSet接口是Set的子接口。TreeSet是SortedSet接口的实现类

 TreeSet底层用二叉树实现。它可以对集合中的元素进行排序。
 要存放在TreeSet中自定义类的对象,这个类要么是已经实现了Comparable接口,要么是能给出Comparator比较器,
 TreeSet可以自动过滤掉重复元素所以不用重载hashCode()方法,TreeSet会根据比较规则判断元素内容是否相同,TreeSet会在元素存入时就进行了排序。
 (在TreeSet给出排序规则时,一定要注意对象内容相等的条件,一定要注意在主观的认为两个对象内容相同时,才可以使用比较少的条件来进行判断)

 在要排序时才使用TreeSet类(存储效率比较低),HashSet的,,存储效率比较高,在需要为HashSet的对象排序时,就可以把HashSet中的元素放入TreeSet。


 Iterator:迭代器      java.util    
 Iterable:可迭代的    java.lang
 
 排序可分为两部分内容,一个是排序的规则,也就是按照什么来进行排序,并且排成什么样的顺序。
  第二个就是排序的算法,他决定了排序的效率。

  在对自定义的集合内容类型排序时,需要先定义那个类型的排序规则。
  Comparable接口,这个接口中只定义了一个compareTo(Object o),方法的返回至类型是整型,如果当前对象大于参数对象就返回正数,当前对象等于参数对象  是就返回0,当前对象小于参数对象时就返回负值,这样写就是升序排列,反之则是进行降序排列,在实现这个接口中的方法时,返回值定义方式,只有这两种

  根据指定类型的排序规则实现了Comparable接口,那么就可以对存有这个类型的集合进行整体排序。Comparable接口,也叫做可比较接口。
  这个接口在java.lang包下。只要实现了这个接口,就是可排序的。

  接下来介绍另外一种对自定义类型对象的集合整体排序的方法,也就是实现比较器接口(Comparator),
  这个接口中定义了一个compare(Object o1,Object o2)方法来比较两个对象,
  这个方法的返回值定义随第一个参数小于、等于或大于第二个参数而分别返回负整数、零或正整数。

  注意:在API,帮助文档中以上两个方法的参数类型是T,这代表的模板类型,也就是集合中存放的内容的类型,在JDK1.4中其参数就是Object类型,
  模板类型的详细内容会在最后的JDK5.0新特性中讲到。

  Comparator接口可以在匿名内部类中实现,Collections 中的sort(集合了的对象,比较器)方法,可以对自定义类型内容的集合进行整体

 Comparator:比较器    java.util
  1、写一个比较器的类,实现Comparator.再构造TreeSet(放这),实现compare(T o1,T o2)方法
  2、可以放任何对象进入TreeSet
  3、比较算法和比较内容分离,降低耦合。

 Comparable:可比较的  java.lang
  1、TreeSet中的元素实现接口,重写compareTo(Object o)方法
  2、放TreeSet或比较
  3、比较算法和比较对象在一起,增加耦合。

4、Map:
 Map中只可以存放键值对(Key,value),键值对的存放是无序的。其中Key是不可以重复的。value是可以任意重复的。Key和value是一一对应的。

 HashMap,是Map接口的实现类,Key时无序存放的,其中Key是不可以重复的,它也是通过Hash码值来保证Key不重复的,Key和value是一一对应的。
 如果要加入的键值对和HashMap中键值对的Key是相同的就会将这个集合中的Key所队应的value值进行覆盖,
 在使用自定义类型作为Key时,那就是要覆盖hashCode(),equals()方法,也就是和HashSet中要放入自定义类型是的处理方法相同。
 这个类的对象是线程不安全的。

 添 加:V put(K key,V value)

 遍历:keySet() 返回所有键对象的集合,是一个Set,遍历这个Set,用get()方法来获得Key所对应的value,也就遍历了Map。
 
 删除:V remove(Object key)

 Hashtable,也是Map接口的实现类,它和HashMap比较相似,只不过这个类对象是重量级的,也是线程安全的(支持并发控制,即并发时可能发生错误)。
  它不允许Key和value为null。
     HashMap不支持并发控制,允许为null。
     
 roperties,这个类是Hashtable的子类,他的Key和value只能是字符串。

 SortedMap是Map的子接口
 TreeMap,是SortedMap的实现类,他会按照Key进行排序。和TreeSet类一样,在使用自定义类作Key时,要用自定义类实现Comparable接口。


回复

使用道具 举报

 楼主| 发表于 2008-8-13 23:18:31 | 显示全部楼层

                                      core java day07 总结

反射:
 简介:struts,Hibernate,spring这三种框架统称为ssh,这三种框架都是用.xml作配置文件的,利用的就是反射机制。
       反射有用,但我们用反射的机会不多,因为大部分用到反射的时候别人都已经写好了。

 反射的作用:java 1.4以前反射是不被推举技术,因为当时性能差。
      从1.4开始sun公司把反射的机制作了很大的优化,性能上不再有问题,从此反射成为程序员可用的武器。

 反射的应用:平时不写反射,当想动态的生成执行代码时就会用到反射。

      动态生成代码:类,对象,方法

 我们的要求:能够做到动态生成对象,动态调用方法

 用的最多的类的反射

  class(类)是抽象、概念上的定义。object(对象)是个体、实例化。

 java.lang.Class(类): 是Object的子类。Class是一个类。对应类里的所有信息。

  用反射的眼光看String类:1、class---API信息(是一个对象) 2、object-----可以调用任意方法(是一个对象)

  每一个类都含有两个对象(class对象,object对象)
  
  int(对象)--->class(封装类)    封装类.TYPE-------例 Integer.TYPE

  当getXXX时,取得的所有都是public(允许继承),private不行。
  例: public Field[] getFields()throws SecurityException 

  方法名加Declared的就会把private的和public的都取到

  需要记的方法:1、class--->public static Class<?> forName(String className) throws ClassNotFoundException

   2、get系列:可以取属性、方法、构造器、父类、修饰符

      取方法的:public Field getDeclaredField(String name) throws NoSuchFieldException,SecurityException
         public Field[] getDeclaredFields() throws SecurityException
        只获得public的属性
   3、newInstnce()(类对象调用,调用无参的构造器)---->类对象---->普通对象,若没有无参构造器就会出错。

  常用的:
     java.lang.reflect.Field(属性):
  public Class<?> getType()  不管是否是private的
  
    java.lang.reflect.Method(方法):
  public Object invoke(Object obj,Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException
 
    java.lang.reflect.Constructor(构造器):
   public T newInstance(Object... initargs)throws InstantiationException,IllegalAccessException,IllegalArgumentException,InvocationTargetException

  基本不用:java.lang.reflect.Array(数组):

 
 获得类对象(class)的三种途径:(课堂代码:TestClass.java)
  1、Class c1=Class.forName(“java.lang.Integer”)  //输入全类名,包名、类名都要有,即使import了也不能少包名
  
  2、String s1="abc";
     Class c2=s1.getClass(); //所有先有对象的都可以getClass();

  3、Class c3=Integer.TYPE; //所有简单类型对应类对象只有一个

 获得属性会破坏封装:(课堂代码:TestField.java,Person.java)


 获得构造器:(课堂代码:TestCon.java,Person.java)

 
 如何动态的构造对象:(课堂代码:UseCon.java,Person.java)

  先要选定构造器,再创建实例

 获得方法:(课堂代码:TestMethod.java,Person.java)

  public Method[] getDeclaredMethods()throws SecurityException
  public Method[] getMethods() throws SecurityException
  public Method getMethod(String name,Class... parameterTypes)throws NoSuchMethodException,SecurityException
   Class...是5.0的新特性,也可以传数组的。1.4及以前都必须传数组的。

 动态调用方法:(课堂代码:UseMethod.java,Person.java)

  public Object invoke(Object obj, Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException

 练习动态生成代码:(课堂代码:TestAuto.java,Person.java)
 
  for(String s:set){} //5.0新特性,可以从所有集合中取

  对象---->String 包名、类名,Object o没有所有属性
   |
   |
   |
        对象set方法
   |
   |
  c.getMethod(方法名.class)


 总结反射的编程步骤:
  1、利用String---->class     class.forName(String);

  2、class----->其它
       |必
       |须
       |无
       |参
       |构
       |造
       |
     实例化对象
  
  3、其它---->传参---->调用
  

内部类:
 不推崇使用内部类

 内部类的好处:可以直接操作私有属性。
 
 封装类:
  class1{
   class2{}  //内部类
  }

 内部类的分类:  
  
       成员式:
        静态内部类: (课堂代码:StaticInner.java ,TestStaticInner.java) 生成的内部类的字节码文件StaticInner$Inner1.class 

    在静态内部类中只能访问外部类的静态成员。构造静态内部类对象不再需要构造外部类对象

        成员内部类:(课堂代码:MemberInner.java ,TestMemberInner.java)
    必须要先构造外部类对象,再根据外部类对象构造内部类对象。
    生成成员内部类对象形式: Inner2 i2=new MemberInner().new Inner2();
    一个外部类对象可以生成多个成员内部类对象,一个成员内部类对象一定是由某一个外部类对象生成的。
    成员内部类不能有静态属性

    内部类和外部类的实例变量可以共存。
    在内部类中访问实例变量:this.属性
    在内部类访问外部类的实例变量:外部类名.this.属性。

    在外部访问时,外部类.内部类作声明,new 外部类(得到外部类对象).new 内部类(得到内部类对象)
      例:MemberInner.Inner2 i2=new MemberInner().new Inner2();

       局部式:
        局部内部类:定义在外部类的方法中。(课堂代码:MemberInner.java)

    与局部变量类似,在局部内部类前只能用abstract或final修饰符,但一般不加此修饰符,避免对继承产生影响。其范围为定义它的代码块。

    局部内部类不仅可以访问外部类实例变量,还可以访问外部类的局部常量,但是要求外部类的局部变量是final的。
    实际上是为内部类添加了一个属性,这个属性就是外部类的final局部变量
    在类外不可直接访问局部内部类(保证局部内部类对外是不可见的)。
    在方法中才能调用其局部内部类。

        匿名内部类: 特殊的局部内部类,用来继承一个类或者实现一个接口,我们只需要这个局部内部类的一个对象。
      匿名内部类不能定义构造方法
      匿名内部类在编译的时候由系统自动起名Out$1.class。
      如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。
      因为匿名内部类无构造方法,所以其使用范围非常的有限。

 复习前6章
  封装:private 属性
      public 方法
      构造器调方法
  继承:复用代码方式
     必须子类是什么父类
     共享代码,维护简单
     
     子             父

           继承
     类 -----------类(单个)
         extends

           实现
     类------------接口(多个)
         implements
 
           多继承
     接口----------接口(多个)
           extends

   多态:同一种东西具备多种形态
      1、简单多态:比如:7可以当成int,double,byte都可以
      2、方法多态:重写(覆盖)、重载
      3、参数多态(重要):依赖于简单多态和类多态,在传参的时候可以传出n种类的参数
      4、类多态(接口):Set set=new HashSet();
  
  几种实用类:
    Object:equals,hashCode,toString,clone
    String(不可改变的字符序列)
    StringBuffer
    StringBuilder
    
  集合:Set,List,Map
 
  反射:Class,Field,Method,Constructor
 
 

回复

使用道具 举报

 楼主| 发表于 2008-8-13 23:18:47 | 显示全部楼层

                               core java day08 总结

如何更好的去重写hashCode和equals方法? (参见文本文档:hashcode.txt)
  public boolean equals(Object o){
   if(o==null){
    return false;
   }else if(this.getClass()==o.getClass()){
    Person p = (Person)o;
    return this.id==p.id;
   }else{
    return false;
   }
  }   
      
  public int hashCode(){
   int temp = this.getClass().hashCode();
   return temp+this.id*43;
  }
      
      
一道面试题:(课堂代码:day08.TestNull.java)
   
   
异常:
  异常不等同于错误。
  异常就是在程序中由于某些特定的因素(内在或外在)导致程序无法继续执行,但不能影响虚拟机正常运行。
  java异常机制:
      coding---->出现了异常
           1、先生成一个异常对象(由虚拟机或程序员生成)
           2、异常对象逐层上抛
           3、当有处理代码时,调用处理代码(通常放在catch语句中)同时异常不再上抛。
           4、当main方法也不处理的时候,代码到此执行完毕,即虚拟机终止了此程序。
    异常的分类:
        java.lang.Throwable有两个子类:Error和Exception。
        Exception中的方法:
            public void printStackTrace(); 异常对象大百科,处理时必调的方法。
            public String getMessage();  用来说明异常的信息。
            public Throwable getCause();   用的非常少
       
               Throwable
                          |
                  -----------------------
                  |                   |
               Error               Exception
               错误            |
        非常严重                  |                   
       程序员不能处理,没办法         |
                      -----------------------------
                                |                       |
              (运行时异常)RuntimeException            非Runtime异常                   
                          未检查异常                  已检查异常
                        由于程序员疏忽造成的            不可避免的
                           可避免的                    必须处理,强制处理
                   可处理,可不处理,允许不处理
                   不处理在编译的时候可以通过,但运行时仍会有问题
                  
                  
   几种普通的运行时异常:      
       java.lang.ArithmeticException:算术异常,由于数学运算发生的异常
       java.lang.NullPointerException(常见) :空指针异常,发生这种异常,肯定是用null.了,这个是最常见的。
    java.lang.ArrayIndexoutofBoundsException(常见):数组下标越界异常,超出数组长度发生的异常,这是正的超出,比如定义了10个,访问第11个时发生的异常
       java.lang.SecurityException:安全异常
       java.lang.NegativeArraySizeException:也是数组下标越界异常,这是负的超出,比如访问下标为-1

  异常的处理:(课堂代码:FirstException.java,TestStack.java,TestFinally.java)
     try{
     
       可能出错语句
       正常语句   //若发生异常,此语句便不会执行。
         
     }catch(异常类 e){ 
       对异常的处理代码
       
     }finally{
     
       必须执行的语句  
     }
     
    允许try--->catch,try--->finally,try---->catch---->finally。只有try块就会报错了。
  
    可以有多个catch语句块,但catch中异常对象的顺序,次序由小到大,子类必须放在父类的前面
    
    try语句不一定能全部执行,try块中声明的变量在catch语句块中是不能访问的。
    
    finally中写的代码是肯定会被执行的。    
    
  一个面试题,三个单词的区别: 
    final---->修饰符,最终的类,最终的方法,最终的变量
    fianlly---->异常处理中必然要执行的语句块关键字
    finalize--->Object的一个方法,配合gc,垃圾回收
    
    异常的try{}catch处理是很消耗内存的,尽可能不用。
    所以对于RuntimeException最好用if-else判断,取代try{}catch
    
    当调用Integer.parseInt(s),若s的值是abc的话就不能转化为整数了,会出现数字格式异常(java.lang.NumberFormatException)。
    
    throw与throws的区别: (课堂代码: TestThrows.java)
      throw:后跟的是异常对象,代表抛出对象,出现在方法内
      throws:后跟异常类型,出现在方法的参数列表后面。在方法的()和{}之间,代表本方法不处理异常,只抛出。
      
      throw与throws没有必然的联系,不是一定要一起出现的,throws可能抛也可能不抛,而throw是一定会抛的。
      注意:方法的调用者不能抛出比被调用的方法更小的异常种类 
       
     throws与try{}catch的区别:
       throws:是抛出,没有真正的处理,通常叫做异常的转移
       try{}catch: 是真正的处理异常,解决异常,中止抛出。
    
   方法重写时异常的抛出:(课堂代码: SuperA.java,Sub.java)
       方法的重写中,如果子类的方法抛出的异常是父类方法抛出的异常的父类型,那么编译就会出错:子类无法覆盖父类。 
     结论:子类方法不能比父类方法抛出更大的异常类型。子类抛出的异常或者与父类抛出的异常一致,或者是父类抛出异常的子类型。或者不抛出异常。
        如果父类型无throws时,子类型也不允许出现throws。此时只能使用try catch。
        
     IOException必须要处理,处理方式可以用throws和try{}catch
     
   自定义异常:(课堂代码: AgeException.java,Person.java)
       1、继承Exception
       2、写构造器(2个)一个无参,一个有参
     
  异常总结:
    异常的处理有两种方式:
        1、try{}catch{}finally{}   真正的处理
        2、throws 转移
    调试异常:
      1、记忆
      2、留心
    
    
1.4添加的断言:            
    断言关键字:assert
    格式:assert 布尔表达式:String;
       如果布尔表达式为false,String会显示。
    
    断言默认是关闭的,需要用-ea 开启  ,用-da关闭
    assert用于调试。不能继承性的打开
    -ea是全部打开,-ea:类名   可以单独打开一个类。
  
第八章:图形用户界面(GUI)   (课堂代码:TestJFrame.java)
  
AWT
  java.awt.*  
  组件:Component 和 MenuComponent   是根
  容器:Container      存放其它组件的组件,也是组件的子类
  布局管理器:LayoutManager   控制组件在容器中的位置和大小
  
  例:计算器中的窗口就是容器,菜单是菜单组件,文本框是组件,按钮也是组件。
  
  AWT的包结构:
    java.awt.Component(组件类)
      常用的:
        Button(按钮) TestField(文本框--单行)   TextArea(多行文本) Label(标签---显示文本)
        anel(面板,不可独立的容器)  Frame(窗口)   Dialog(对话框)
    java.awt.Container(容器类) 
      常用的: Window(窗口,可以独立的容器)    
   
    java.awt.MenuComponent(菜单组件)
      常用的:
        MenuBar(菜单条)  Menu(菜单)   MenuItem(菜单项)
        
    窗口是独立存在的,面板不能独立存在,是要依附于窗口而存在的。
    
    Frame是一个窗体,Dialog是对话框
    
Swing:java.swing.*

  Swing的结构:
  
     Swing是AWT的增强版,5.0加大了Swing的能力。Swing是AWT的子类。
     
     JTable (表格)
      JTree (树状结构)
     JComboBox   (选项卡)
     
     Swing组件多,组件功能强,支持AWT的功能--事件
         
     AWT学习用
     Swing商用
     
     AWT不是百分百跨平台的,Swing是纯java写的,百分百跨平台,是轻量级组件,不依赖于操作系统。
  
  
  AWT的好处   
     AWT的速度比Swing较快,1.4时体现明显
     Applet小应用程序。用这个做动态。不需要插件
     AWT更接近于操作系统的显示效果
  AWT的坏处:
     非纯JAVA,不能很好的跨平台
     Applet很少应用
     支持它的组件较少
  Swing的好处:
     纯JAVA
     跨平台
     支持更多的功能
     得到了很多公司的支持
  Swing的坏处:
     不支持Applet,需要插件
     消耗内存,速度慢
     Bug多
     与操作系统相比感观上不太好。     
  
  构造图形界面的步骤
    1、选择一个容器   JFrame
    2、设置容器的布局管理器
    3、向容器添加组件
    4、事件的监听 
     
  布局管理器:对于任何一个容器类中都有setLayout()方法,用容器对象调用这个方法,来设置容器的布局管理器(LayoutManager这是一个接口,所有布局管理器都实现了这个接口)。

   可用的布局管理器:
      所有的布局管理器实现了一个接口java.awt.LayoutManager
      
    FlowLayout:  (课堂代码:TestFlow.java)
    
        流式布局管理器。不会改变每一个组件原有大小,即窗口的大小改变时,组件的大小不会随之改变
        特点:组件大小不变,顺序从左到右,对齐方式(左对齐,右对齐,居中),自动换行
        默认的对齐方式是居中。
        FlowLayout(int align);设置对齐方式
        FlowLayout(int align,int hgap,int vgap); hgap是水平间距,vgap是垂直间距。
          
          anel系列的默认布局管理就是FlowLayout。
         后来的组件会挡住前面的组件。
         
    BorderLayout:(课堂代码:TestBorder.java)
        方位布局管理器。
        JFrame的默认布局管理器
        后来的组件会挡住前面的组件。
        只允许水平扩展。
        
        默认加载在中间(Middle),每个部分只能放一个组件
            
    GridLayout:(课堂代码:TestGrid.java)
    
        网格布局,通过行列,间距,来用网格分割,把组件放入如网格中,先行后列摆放组件。可以保证每个组件的大小都是一样的,但忽略了组件原来的尺寸。
          jf.setLayout(new GirdLayout(3,2));  //把容器平均的分为3行2列,先左后右,先上到下的顺序排列

回复

使用道具 举报

 楼主| 发表于 2008-8-13 23:19:01 | 显示全部楼层

                                core java day09 总结

布局管理器的另两种:
  CardLayout:  (课堂代码:TestCardLayout.java)
    卡片布局,组件重叠放置。
    它将容器中的每个组件看作一张卡片。一次只能看到一张卡片
    当容器第一次显示时,第一个添加到 CardLayout 对象的组件为可见组件。
    public void first(Container parent)翻转到容器的第一张卡片。
    public void next(Container parent)翻转到指定容器的下一张卡片。如果当前的可见卡片是最后一个,则此方法翻转到布局的第一张卡片。
    public void previous(Container parent)翻转到指定容器的前一张卡片。如果当前的可见卡片是第一个,则此方法翻转到布局的最后一张卡片。
    public void last(Container parent)翻转到容器的最后一张卡片。
    public void show(Container parent,String name)翻转到已添加到此布局的具有指定 name 的组件。如果不存在这样的组件,则不发生任何操作。
    
  GridBagLayout:  (课堂代码:TestGridBag.java)
    GridBagLayout 类是一个灵活的布局管理器。相当于董事长,不是实质性的管理。
    GridBagConstraints 相当于总经理,是实质性的管理者。
    每个由 GridBagLayout 管理的组件都与 GridBagConstraints 的实例相关联。
    组件可以跨行跨列的网格布局。
    定位:   
      public int gridx 水平位置。组件显示区域的开始边指的是水平、从左到右容器的左边缘和水平、从右到左容器的右边缘。
      public int gridy 垂直位置。指定位于组件显示区域的顶部的单元格,其中最上边的单元格为 gridy=0。
    行列操作:
      public int gridwidth行。指定在组件显示区域的一行中的单元格数。
      public int gridheight列。指定在组件显示区域的一列中的单元格数。
      GridBagConstraints.REMAINDER 换行
    设置如何改变组件大小:
      GridBagConstraints.NONE不扩充
      GridBagConstraints.HORIZONTAL水平扩展
      GridBagConstraints.VERTICAL 垂直扩展
      GridBagConstraints.BOTH 完全扩充
      
    接口标识着布局管理器。LayoutManager是所有布局管理器都实现的接口。LayoutManager2比LayoutManager增加了些东西,即是加强版。
   
菜单: (课堂代码:TestMenu.java)
 awt:
   MenuBar 
     public JMenu add(JMenu c)将指定的菜单追加到菜单栏的末尾。
   Menu
     JMenu(String s) 构造一个新 JMenu,用提供的字符串作为其文本。
     public JMenuItem add(JMenuItem menuItem)将某个菜单项追加到此菜单的末尾。返回添加的菜单项。
     
   MenuItem
     public JMenuItem()创建不带有设置文本或图标的 JMenuItem
     public JMenuItem(String text)创建带有指定文本的 JMenuItem。
   
   
AWT事件模型(AWT,Swing的后台)(课堂代码:TestButtonEvent.java)

  构造图形界面的步骤
    1、选择一个容器   JFrame
    2、设置容器的布局管理器
    3、向容器添加组件
    4、事件的监听 
    
  事件的三要素:
    事件源:产生事件
    事件对象:用来描述事件的   -----一个系列的类
    事件的监听:用来处理事件的  -----一个系列的接口
    
  事件源是事件的产生者,事件是一个事件的讲述者,事件监听者处理事件
  
  比如单击按钮:按钮是事件,点击是事件,现在是找方法、找处理类。
 
  观察者设计模式:
    java.awt.Event 事件源
    EventObject  事件对象
    EventListener 事件监听者
    
  JAVA的事件处理机制:委派式的(松耦合)
    点击按钮---->组件自身会产生事件对象,但不一定负责处理,转而指派监听处理
    
    java.awt.AWTEvent
       ActionEvent(AWT事件王,所有按钮的单击,所有菜单的执行,文本框(单行)的回车,JList双击,JCheckbox)             
          AdjustmentEvent
          ComponentEvent
             ContainerEvent
             FocusEvent(光标事件)
             InputEvent
                KeyEvent(键盘事件)
                MouseEvent(鼠标事件)
             WindowEvent窗口事件
          ItemEvent
          TextEvent(文本框、文件区域事件)               
                                                               
        
         JTextArea,JTextField 这两个的文本改变不会产生TextEvent事件  
        
       事件        监听接口             处理方法
       Action    ActionListener    actionPerformed(ActionEvent)
      
       Window    WindowListener    WindowClosing(WindowEvent) 
                      windowOpened(WindowEvent)
                  windowIconified(WindowEvent)
                  windowDeiconified(WindowEvent)
                  windowClosed(WindowEvent)
                  windowedActivated(WindowEvent)
                  windowDeactivated(WindowEvent)
   
  AWT事件模型步骤    
   1、作界面:
      选JFrame
      选组件
      选布局
   2、写监听
      实现接口
      重写方法、实例变量
   3、注册监听    
      addActionListener  
     
  jb1.addActionListener(this); //this在方法中代表的调用者,this在构造器中代表即将构造的对象。 
  
  常见问题:
     1、API的查找:敢于尝试
     2、当某一个变量需要在多个方法中使用时,可以把这个变量当做属性声明  
     
  java.awt.event.WindowListener: (课堂代码:TestWindowListener2.java)  
     7个方法需要重写,但只用1个

     适配器:(课堂代码:TestWindowListener.java)
        就是一个重写了所有监听接口中方法的类。
        提供了适配器做监听的途径。
        
        ActionListener就不需要适配器,因为它只有一个方法。
        
      AWT中经常使用匿名内部类(继承适配器)做监听。                                         
                                      
    
      
    

回复

使用道具 举报

 楼主| 发表于 2008-8-13 23:19:16 | 显示全部楼层

                                core java day10 总结
JFC的组成部分:
  AWT,Swing,Java 2D,Drag and Drop,Accessibility
  
常用组件:
  JButton :按钮
  JRadioButton单选按钮
  JTextField:单行文本域
  JTextArea:多行文本区
  JPasswordField:密码输入框
  JScrollBar滚动条
  JScrollPane:带滚动条的面板,使用一个多行文本域作为参数创建滚动窗体
  JComboBox:下拉选择框,下拉列表

  JRadioButton:单选按钮
  JCheckBox:多选按钮
  JList:多行列表,滚动列表
  JLabel:标签
  JEditorPane:可编辑各种内容的文本组件,显示结构化文档
  Border:边框

  JMenuBar:菜单条
  JMenu:菜单
  JMenuItem:菜单项
  JPopupMenu:弹出式菜单
  JCheckBoxMenultem勾选菜单
  
  JSlider:滑动条
  JProgressBar:进度条
  JTabbedPane:分层面板
  JSplitPane:分隔面板
  JToolBar:工具条

  JFileChooser:文件选择器
  JColorChooser:颜色选择器

  
对文本的操作都是这两个:
  setText()设置文本区域
  getText()取得文本区域的内容
  
JTextComponent的方法:
  copy()复制 cut()剪切 paste()粘贴 getSelectedText()   setSelectionStart()选择开始位置    setSelectionEnd() 选择结束位置  selectAll()全选
  replaceSelection()查找替换    getText()取文本框或文本域的内容  setEditable()设置为不可编辑   setCaretPosition()设置 TextComponent 的文本插入符的位置

  JTextField(String text, int cols) text是初始内容,cols是显示文字的数量

 记事本程序:(课堂代码:TestTextArea.java)
   
  JFileChooser  FileDialog 
  
  观察者模式:(课堂代码:BanYi.java,Me.java)
    MVC:
     M--模型   组件
     V--视图
     C--控制
     VC---UI代理,Swing
     
   监听:
     监听
    A------B----->发生某些事情
    |
    |
    |
   相应的处理
   
   
   适配器模式:(课堂代码:Mi.java,Rou.java,MAdapater.java)
   
       作用:把两个不相关的类结合到一起,完全遵守开闭原则(开闭原则----对扩展开放,对修改关闭)
       继承--->代码重用
       组合--->代码重用
       此时组合优于继承
      
       在不修改原代码时满足新的需要
      
    
   java.math.BigDecimal 可以精确运算,用于商业   (课堂代码:TestNumber.java)
   BigDecimal b1=new BigDecimal("0.05");  构造时要记得用字符串构造才可运算,用double型不能精确运算,sun的一个bug.
 
   作业:计算器 (课堂代码:TestNumber.java)  
   
      记事本 (课堂代码:TestSream.java)
        读文件:FileInputStream
        写文件:FileOutputStream
    
    Swing.Timer 计时器,每隔一段时间启动一次ActionListener,时间以毫秒为单位。
   (课堂代码:TestTimer.java)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表