如果有两个类 Employee 和 EmployeeTest 分别在Employee.java和EmployeeTest.java(其中有main方法)中定义, EmployeeTest 依赖于 Employee ,则要编译运行有两种方法:
(1)使用通配符调用Java编译器: java Employee*.java ,所有与通配符匹配的源文件都会被编译为类文件。
(2)直接编译EmployeeTest.java: java EmployeeTest.java ,Java编译器发现EmployeeTest.java使用了 Employee 类时会查找名为Employee.class的文件,如果没有找到就会搜索Employee.java进行编译。如果Employee.class文件存在,但是Employee.java比它更新,也会重新编译这个文件。
Employee.java:
public Employee(String n, double s, int year, int month, int day) { name = n; salary = s; LocalDate hireDay = LocalDate.of(year, month, day); }
这种方式与传入 LocalDate 类型参数相比哪种更好?
实例方法都会获得一个隐式参数,这个参数就是调用方法的对象的引用,在方法中使用this关键字可以获取这个引用参数,在方法内会在实例方法调用和域前自动添加this引用。
是否将某个方法设置为内联方法是Java虚拟机的任务,即时编译器会监视调用那些简洁、经常被调用、没有被重载以及可优化的方法。
不要编写返回引用可变对象的访问器方法,如需返回一个可变对象的引用,应该首先对它进行克隆(clone)。
实例方法可以访问所属类的所有对象的私有数据。
final 修饰符大都应用于基本类型域或不可变类的域(如果类中的每个方法都不会改变对象,这种类就是不可变类,String类就是一个不变类)。
静态变量使用的比较少,静态常量用的比较多。最好不要将域设计为public,但公有常量(即final域)却没问题。
两种情况使用静态方法:
(1)方法不需要访问对象状态,所需参数都是显式参数。
(2)方法只需要访问类的静态域。
使用静态工厂方法而不是构造器创建对象的两种情况:
(1)构造器的名字必须与类名相同,但是希望使用更有意义的不同方法名创建对象。
(2)构造器无法改变所构造的对象类型,但静态工厂方法可以返回不同的类型,如所构造类型的子类对象。
每一个类都可以有一个main方法,这是一个常用于对类进行单元测试的技巧。
按值调用(call by value)表示方法接收的是调用者提供的值,按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。Java使用按值调用,对按引用调用的反例:
public static void swap(Employee x, Employee y) { Employee temp = x; x = y; y = temp; }
初始化域时可以调用方法。
域初始化顺序:
(1)初始化为默认值(0、false或null)。
(2)按照声明的顺序,依次执行所有域初始化语句和初始化块。
(3)如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
(4)执行构造器的主体。
从编译器的角度看,嵌套的包之间没有任何关系。
编译器在编译源文件时不检查目录结构,如果它不依赖于其他包,就不会出现编译错误。但最终程序无法运行,除非将所有文件移动到正确的位置上。如果包与目录不匹配,虚拟机就找到类。
类路径是所有包含类文件的路径的集合,可以包含目录或jar文件的路径,