- 编译多个源文件
我们习惯在每一个源文件中放入一个类,例如将A类放入A.java中,ATest类放入ATest.java中。如果我们这样组织类和源文件,我么有两种编译源程序的方法
- 使用通配符调用Java编译器:javac A+.java 这样与通配符匹配的源文件都将被编译成类文件
- 如果ATest.java使用了A.java,可以使用如下命令 :Javac ATest.java
对于第二种方式Java编译器发现看到ATest.java中使用了A类时,就会查找名称为A.class的文件,如果没有找到这个文件就会自动的搜索A.java,然后对他进行编译,更重要的是:如果A.java版本较已有的A.class文件版本新,Java编译器会自动重新的编译这个文件。
- 隐式参数和显示参数
在Java中使用方法时一般会向方法传递两类参数,隐式参数和显示参数,例如有类 Employee如下:
public class Employee{
private double salary;
...
public void raiseSalary(double byPercent){
double raise=salary*byPercent/100;
salary+=raise;
}
}
...
Employee employee=new Employee();
employee.raiseSalary(5);
...
在使用employee.raiseSalary(5)时,向raiseSalary方法传递了两个参数第一个隐式参数出现在方法名谦的Employee对象,第二个参数为了方法名后面括号中的数值,这时显示参数,在每一个方法中文件自this表示隐式参数,例如,我们可以讲raiseSalary方法改写如下:
...
public void raiseSalary(double byPercent){
double raise=this.salary*byPercent/100;
this.salary+=raise;
}
...
通过这种方式能够将实例域和局部变量区分开来
- 同一个类中方法的访问权限
我们都知道,类中的方法可以访问该类中的所有私有数据,同时这个方法还可以访问属于这个类的所有对象的私有数据!!!!!!例如我们可以像如下定义Employee类的equals方法:
public class Employee{
private String name;
...
public boolean equals(Employee other){
return name.equals(other.name);
}
...
}
可以这样来调用:
...
Employee A=new Employee("A");
Employee B=new Employee("B");
A.equals(B);
...
之所以可以这样使用是因为
一个类的方法可以访问该类的任何一个对象的私有域
- final 和 static
如果将类中的域定义为final,那么构建这个类的对象时必须初始化这样的域,即是:必须确保在这个类的构造器执行了之后,这个域的值被设置,且在后面的针对该对象的操作中不能对他进行修改。
如果将类中的某一个域定义static ,那么该类的所有的实例将共享这个域的数据,不会单独开辟一块空间来保存这个域的数据。例如可以通过如下的方式来为Employee类设置其编号:
class Employee{
...
private int id;
private static int nextId=1;
...
public void setId(){
id=nextId;
nextId++;
}
}
当一个应用中有多个Employee的实例的时候,需要为这些实例设置id时,只需调用其setId方法即可,这时因为netxId是一个静态域,它是多个Emloyess对象所共享的,每setId一次后都会对nextId进行+1的操作,这样每一个Employee对象都能获得正确的编号。
静态方法时不能像对象实施操作的方法,即,这类方法时没有隐式的参数的,因此静态方法不能操作对象,不能再静态方法中访问实例域,但是可以访问类中的静态域。例如:
...
private static int nextId=1;
...
public static int getNextId(){
return nextId;//静态方法访问类的静态域
}
在以下两种情况下使用静态方法:
- 该方法不需要访问对象状态,该方法的所有参数都是通过显示参数提供的(例如Math.pow).
- 该访问只需要访问类的静态域。
- 域的初始化以及构造函数
在一般的类的设计中域是在构造函数中进行初始化的,如果在构造器中没有显示的給域赋予初值,它就会被自动的赋值:数值为0,布尔值为false,对象引用为null.区别于C++不能再申明域时显示的指定域的值,Java却可以这样做,如果给域显示的赋予了值,那么当实例化对象时会在执行构造器之前执行赋值。当
类中没有没有自定义构造函数时,系统会提供一个默认的构造器。同样一个类中也可以重载多个构造器,Java的函数签名是通过函数的参数个数以及参数的类型来确定的,当类中自定义了构造函数时候就不能使用默认的无参构造器来实例化对象。除了
在构造函数中初始化数据域和在
域声明时直接初始化之外还可以通过
初始化块来初始化域,实例化对象时,首先运行初始化块,然后在运行构造器的主题部分。综上所述当调用构造器实例化对象时的处理步骤为:
- 所有数据域被初始化为默认值(0,false,或null)。
- 按照在类声明中刚出现的次序一次执行所有域初始化语句(域声明时直接初始化)和初始化块
- 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
- 执行这个构造器的主体。
关于对于静态域的初始化,如果没有显示的对静态域进行初始化,那么与实例域一样,静态域的默认初始值是0,false或null,也可以通过在声明时直接提供初始化值或者是使用一个静态的初始化块来对静态域进行初始化,实例化对象时所有的静态初始化语句以及静态初始化块都将按照类定义中出现的顺序执行。