笔记 <Core Java2 卷1>第四章 对象和类

来源:互联网 发布:淘宝怎么搜二手 编辑:程序博客网 时间:2024/04/30 15:50

1、UML :Unified Modeling Language,统一建模语言。用来回执描述类关系的类图。


2、很多程序员喜欢把每个类放在单独的源文件里。

       例如:Emloyee类放在Employee.java里,EmployeeTest类放在EmployeeTest.java里。

       多个源文件的编译方式有两种。

       (1)使用通配符来调用Java编译器:javac Employee*.java

       (2)直接键入需要编译的源文件名:javac EmployeeTest.java

            此时Employee.java文件不会被显示编译。当Java编译器发现EmployeeTest.java使用了Employee类时会自动寻找Employee.class文件;如果没有找到这个文件,就自动寻找Employee.java文件并编译它;若发现Employee.java文件的时间戳比Employee.class的时间戳更新的话,Java编译器会自动重新编译这个文件。


3、不要编写返回指向可变对象的引用的访问方法。

       例如:

                 class Emloyee

                 {  ...

                     public Date getHireday()

                     {   return hireday;  }

                     private Date hireday;  // 在类外声明一个Date对象并进行修改操作,会改变hireday的私有状态

                     ...

                 }

       如果需要返回一个指向可变对象的引用,可以使用克隆(一个对象放在新位置的精确拷贝)

       例如:

                 class Employee

                 {  ...

                     public Date getHireday()

                     {  return (Date)hireday.clone();  }

                     private Date hireday;

                    ...

                 }

 

4、被final修饰的变量不能被修改,但除了本地方法。

       例如:System类中有一个setOut方法(本地方法),可以把System.out设置成另外一个流。

       原因:本地方法并不是在Java程序设计余元中实现的,它可以绕过Java语言的控制访问机制。


5、工厂方法:处理在不指定对象具体类型的情况下创建对象的问题(利用静态方法)。

      工厂方法模式:定义一个创建对象的借口,但让实现这个借口的类决定实例化哪个类,工厂方法让类的实例化推迟到自雷中进行。


6、每一个类都可以有一个main方法,用来单元测试。

      例如:单独测试Employee类,可以执行:java Employee。

                  测试EmployeeTest类时,可以执行:java EmployeeTest,此时Employee类中的main方法永远不会被执行。


7、方法参数:

      (1)基本类型:方法不能改变基本类型的参数,进行传值调用。

           例如:public static void trippleValue(double x)

                       {  x = x*3;  }

                       double percent = 10;

                       trippleValue(percent);

                       /* 调用该方法后的执行过程:

                           (1) x 被初始化为percent值的一个拷贝

                           (2) x 被增值到3倍,x = 30,但percent=10

                           (3)方法结束,参数变量x不再使用

                        */

      (2)对象引用:方法能改变对象参数的状态;不能让对象参数指向新的对象。

           例如:public static void trippleSalary(Emploee x)

                       {   x.raiseSalary(200);  }

                       Employee harry=new Employee(..);

                       trippleSalary(harry); // 可以成功执行

                       /* 方法得到对对象引用的一个拷贝,原来的对象变量和这个拷贝指向的是同一个对象  */

                       public static void swap(Employee a,Employee b)

                       {  Employee temp=a; a=b; b=temp;  }  //无法成功执行

                       /* 方法并没有改变存储在变量a和变量b中的对象引用 */


8、初始化块:在调用构造函数之前先被运行。

      调用构造函数后的详细执行过程:

      (1)初始化块所有数据字段为默认值;

      (2)按照在类声明中出现的次序一次执行所有字段初始化语句和初始化块;

      (3)如果构造函数的第一行代码调用了另一个构造函数,执行被调用的构造函数主体;

      (4)执行构造函数主体。

      初始化块:对静态字段的初始化,在类第一次被加载时执行。

      例:利用初始化块,在没有main的情况下写出打印程序。

              public class hello

              {  

                   static

                   {   Sysytem.out.println("HelloWorld!";)   }

              } 

              /*  在类被加载时就会打印“HelloWorld!”,系统会给出main没有定义的错误消息,可以通过在初始化块末尾添加System.exit(0)来避免这条消息  */


9、访问其他包中的public类:

       (1)使用import引入特定的类或者包,只能使用*符号引入该层包下的类。

            如果引入的包内存在类名冲突的情况,需要增加一条import语句说明情况。

            例如:import java.util.*;

                        import java.sql.*;

                        import java.util.Date; // java.util和java.sql里都有Date类,告诉编译器到底使用哪个Date类

       (2)使用完整的包名调用。

            例如: java.util和java.sql里都有Date类,同时两个Date类都需要用到。        

                        java.util.Date deadline = new java.util.Date();

                        java.sql.Date today = new java.sql.Date(); 


10、把类加入包中,用点分隔符。例如:package com.horstmann.corejava

        若不使用默认包:

       (1) 编译:javac com/horstmann/corejava/Employee.java   ( 编译器对文件操作,需要使用/ 文件分隔符 )

       (2)运行:java com.horstmann.corejava.Emloyee   ( java解释器装载类,需要使用 . 分隔符 )

       编译器编译源文件时并不检查目录,若某源文件并未包含在指定目录下,且它并不依赖于其他包,那么编译不会出错;然而由于虚拟机无法找到便已产生的类文件,使得程序无法运行。


11、包作用域:

         默认修饰符修饰类时,默认同包中的其他类可以访问类。但若使用默认修饰符修饰类内变量来说,这种默认是不合理的,变量要么显示标记要么私有。

         注意:为保护封装,必须记得写上为变量添上private修饰符。


12、文档注释:

        (1)类注释:放在所有的import语句之后,直接放在class定义之前。

             例:/**

                           @author name

                           @version text

                           @since text

                           @deprecated text ( 说明此类、变量或变量不应再被使用)

                           @see link ( 添加超级链接如@see com,horstmann.corejava.Employee#raiseSalary(double),指向Employee中raiseSalary方法用#分隔类和方法)

        (2)方法注释:紧靠着放在它所描述的方法前面。

             例:/**  

                           Raise the salary of an employee

                           @param variable description (通一个方法的所有@param标记必须放在一起)

                           @return class description 

                           @throws class description

                      */

        (3)字段注释:只对共有字段产生文档,通常指静态常量。

        (4)提取注释:

             - 切换到所要生成的文档的源文件的目录;

             - 文件放在默认包中运行命令:javadoc -d docDirectory *.java

             - 对于单个包,运行命令:javadoc -d docDirectory nameOf Package

             - 对于多个包,运行命令:javadoc -d docDirectory nameOf Package1 nameOf Package2 .....


12、类设计技巧:

        (1)一定要让数据私有

        (2)一定要初始化数据

        (3)一定不要在类中使用过多的基本类型

        (4)并非所有字段都需要独自的字段访问方法和更改方法

        (5)为类定义使用标准格式 

        (6)分解职责太多的类

        (7)让类和方法的名字反映它们的职责


0 0
原创粉丝点击