一、类的构造方法
在类中除了成员方法之外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。
构造方法的特点 :(1)构造方法没有返回值 ;(2)构造方法的名称要与本类的名称相同。
在定义构造方法时,构造方法没有返回值,但这与普通没有返回值的方法不同,普通没有返回值的方法使用 public void methodEx() 这种形式进行定义,但构造方法并不需要使用 void 关键进行修饰。
语法 :
public book (){
//....构造方法体
}
public :构造方法修饰符
book :构造方法的名称
在构造方法中可以为成员变量赋值,这样当实例化一个本类的对象时,相应的成员变量也将被初始化。
如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。
如果在类中定义的构造方法都不是无参的构造方法,那么编译器也不会为类设置一个默认的无参构造方法,当试图调用无参构造方法实例化一个对象时,编译器会报错。所以只有在类中没有定义任何构造方法时,编译器才会在该类中自动创建一个不带参数的构造方法。
eg :this 可以调用类的成员方法和成员变量,也可以调用类的构造方法。
public class AnyThting{
public AnyThting(){ //定义无参构造方法
this("this 调用有参构造方法"); //使用 this 调用有参构造方法
System.out.println("无参构造方法");
}
public AnyThting(String name){ //定义有参构造方法
System.out.println("有参构造方法");
}
}
可以看到定义了两个构造方法,在无参构造方法中可以使用 this 关键字调用有参的构造方法。但使用这种方式需要注意的是只可以在无参构造方法中的第一句使用 this 调用有参构造方法。
二、静态变量、常量和方法
由 static 修饰的变量。常量和方法被称作静态变量、常量和方法。
有时,在处理问题时会需要两个类在同一个内存区域共享一个数据。例如,在球类中使用了 PI 这个常量,可能出了本类需要这个常量之外,在另外一个圆类中也需要使用这个常量。这时没有必要再两个类中同时创建 PI 常量,因为这样系统会将这两个不在同一个类中定义的常量分配到不同个的内存空间。为了解决这个问题,可以将这个常量设置为静态的,PI 这个常量在内存被共享。
报废声明为 static 的变量、常量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在类或其他类使用类名和“ . ”运算符调用静态成员。
语法 : 类名 . 静态类成员
eg : 创建类,在类中的主方法调用静态成员并在控制台输出。
public class StaticTest{
static double PI =3.1415; //在类中定义静态常量
static int id; //在类中定义静态变量
public static void method1(){ //在类中定义静态方法
// doSomething
}
public void method2(){
System.out.println(StaticTest.PI); //调用静态常量
System.out.println(StaticTest.id); //调用静态变量
StaticTest.method1(); //调用静态方法
}
}
设置了 3 个静态成员,分别为常量、变量和方法,然后再 method2() 方法中分别调用这 3 个静态成员,直接使用“ 类名 . 静态成员 ”形式进行调用即可。
虽然静态成员也可以使用“ 对象 . 静态成员 ”的形式进行调用,但通常不建议用这样的形式,因为这样容易混淆静态成员和非静态成员。
静态数据与静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等,以 static 声明并实现,这样当需要使用时,直接使用类名调用这些静态成员即可。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循着 public 、 private 和 protected 修饰符的约束。
eg :创建类,在类中的主方法调用静态成员并在控制台输出。
public class StaticTest{
static double PI =3.1415; //在类中定义静态常量
static int id; //在类中定义静态变量
public static void method1(){ //在类中定义静态方法
// doSomething
}
public void method2(){ //在类中定义一个非静态方法
System.out.println(StaticTest.PI); //调用静态常量
System.out.println(StaticTest.id); //调用静态变量
StaticTest.method1(); //调用静态方法
}
public static StaticTest method3(){ //在类中定义一个静态方法
method2(); //调用非静态方法
return this; //在 return 语句中使用 this 关键字
}
}
在 eclipse 中输入上述代码后,编译器会报错,这是因为 method3() 方法为一个静态方法,而在其方法体中调用了非静态方法和 this 关键字。在 Java 语言中对静态方法有两点规定 :
(1)在静态方法中不可以使用 this 关键字。
(2)在静态方法中不可以直接调用非静态方法。
在 Java 中规定不能将方法体内的局部变量声明为 static 的。
public class example{
public void method(){
static int i= 0; //这样输入时错误的
}
}
如果在执行类时,希望先执行类的初始化动作,可以使用 static 定义一个静态区域。
public class example{
static{
//some
}
}
当这段代码被执行时,首先执行 static 块中的程序,并且只会执行一次。
三、类的主方法
主方法是类的入口点,它定义了程序从何处开始;主方法提供对程序流向的控制,Java 编译器通过主方法来执行程序。
语法 :
public static void main(String[] args){
//方法体
}
主方法有以下特性 :
(1)主方法是静态的,所以如要直接在主方法中太哦用其他方法,则该方法必须也是静态的。
(2)主方法没有返回值。
(3)主方法的形参为数组。其他 args[0]~args[n] 分别代表程序的第一个参数到第 n 个参数,可以使用 args.length 获取参数的个数。
eg :创建类,在主方法中编写代码,设置程序参数。
public class TestMain{
public static void main(String[] args){ //定义主方法
for(int i = 0 ; i < args.length ; i++){ //根据参数个数做循环操作
System.out.println(args[i]); //循环打印参数内容
}
}
}
假设给它设置 3 个参数 : 参数1 、 参数2 、 参数3
那么运行结果为:
参数1
参数2
参数3