构造方法
构造方法的语法规则:
1.方法名必须与类名相同。
2.不要声明返回类型。
3.不能被static,final,synchronized,abstract和native修饰。
(a) 构造方法不能被子类继承,所以用final和abstract修饰没有意义。
(b) 构造方法用于初始化一个新建对象,所以用static修饰没有意义。
(c) 多个线程不会同时创建内存地址相同的同一个对象,因此synchronized修饰没有必要。
(d) Java语言不支持native类型的构造方法。
重载构造方法
Java语言允许在一个构造方法中,用this语句来调用另一个构造方法。
用this语句调用其他构造方法时,必须遵循以下语法规则:
1. 假如在一个构造方法中使用了this语句,那么它必须作为构造方法的第一条语句(不考虑注释语句)。
2. 只能在一个构造方法中用this语句来调用类的其他构造方法,而不能在实例方法中使用this语句来调用累的其他构造方法。
3. 只能用this语句调用其他构造方法,而不能通过方法名来直接调用构造方法。
默认构造方法
默认构造方法即每月参数的构造方法,分为两种:
1. 隐含的默认构造方法。
2. 程序显示定义在默认构造方法。
注意:
如果类中显示定义了一个或多个构造方法,且所定义的构造方法都带参数,则该类就失去了默认构造方法。
子类调用父类的构造方法
父类构造方法不能被子类继承
在子类中通过super语句调用父类的构造方法。
用super语句调用父类的构造方法时,必须遵守以下语法规则:
1. 在子类的构造方法中,不能直接通过父类方法名调用父类的构造方法
2. 假如在子类的构造方法中有super语句,它必须作为构造方法的第一条语句。
说明:
在创建子类对象时,JVM首先执行父类的构造方法,然后再执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化。
如果子类的构造方法没有用super语句显示调用父类的构造方法,那么通过这个构造方法创建子类对象时,JVM会自动先调用父类的默认构造方法。
如果子类的构造方法没有用super语句显示调用父类的构造方法,而父类又没有提供默认的构造方法时,将会出现编译错误。
构造方法的作用域
构造方法只能通过以下方式被调用:
1.当前类的其他构造方法通过this语句调用它。
2.当前类的子类的构造方法通过super语句调用它。
3.在程序中通过new语句调用它。
构造方法的访问级别
构造方法修饰为public,protected,private或 默认。
当构造方法为private级别时,意味着只能在当前类中访问它:在当前的其他构造方法中可以通过this语句调用它,此外还可以在当前类的成员方法通过new语句调用它。
以下场合构造方法为private类型:
(1) 类中仅仅包含了一些共其他程序调用的静态方法,没有任何实例方法。无须实例该类的实例。为了禁止这种类创建这种类的实例。使用private的构造方法。
(2) 禁止类被继承。当一个类的所有构造方法都是private类型时,假如定义了它的子类,那么子类的构造方法无法调用父类的任何构造方法。因此会导致编译错误。
说明:
final类也能防止类被继承。
区别:
- 如果一个类允许其他程序用new语句构造它的实例,但不允许拥有子类,那么就把类声明为final类型。
- 如果一个类既不允许其他程序用new语句构造它的实例,又不允许拥有子类,那么就把类的所有构造方法声明为private类型。
(3) 类需要把构造方法自身实例细节封装起来,不允许其他程序通过new()语句创建类的实例。这个类向其他程序提供获得自身实例的静态方法,这种方法称为静态工厂方法。