当前位置:文档之家› 构造方法

构造方法

Java构造方法一、构造方法及其作用new一个对象的时候要用到构造函数,例如Hello hello = new Hello();这时调用的是Hello的无参数构造方法;Hello hello = new Hello("hi");这个是调用Hello有参数构造方法,如果Hello类中已经有了一个有参数的构造方法,这时再使用Hello hello = new Hello();来创建对象的时候就会出错,这就是为什么强调写了有参数的构造方法就最好加一个无参数的构造方法.特点:1、构造方法名一定与类同名2、构造方法无返回值类型(void 也不行),不能被static、final、synchronized、abstract、native等修饰。

因为构造方法用于初始化一个新建的对象,所以用static修饰没有意义。

多个线程不会同时创建内存地址相同的同一个对象,因此用synchronized修饰没有必要。

3、构造方法可以没有(默认一个无参构造方法),也可以有多个构造方法,他们之间构成重载关系,表达对象的多种初始化行为4、如果定义有参构造函数,则无参构造函数将被自动屏蔽5、构造方法不能被继承,但子类可以通过super调用父类的构造方法6、构造方法不能手动调用,在创建类实例的时候自动调用构造方法作用:在多数情况下,初始化一个对象的最终步骤是去调用这个对象的构造方法。

构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。

二、默认构造方法在JAVA中如果不写构造方法的话,会默认加上一个无参数的构造方法,但是如果已经有了一个有参数的构造方法,那么无参数的构造方法就不会默认被加上。

此时创建无参数对象时,报错。

publicclass Sample1 {}publicclass Sample2 {public Sample2(int a) {System.out.println("My Constructor");}}publicclass Sample3 {public Sample3() {System.out.println("My Default Constructor");}}// 可以调用Sample1类的默认构造方法来创建Sample1对象:Sample1s1 = new Sample1(); // 合法// Sample2类没有默认构造方法,因此以下语句会导致编译错误:Sample2 s2 = new Sample2(); // 编译出错// Sample3类显式定义了默认构造方法,因此以下语句是合法的。

Sample3 s = new Sample3();三、构造方法的调用构造方法被调用的几种方式:(1)当前类的其他构造方法,通过this语句调用它用this(参数列表)的形式,不可以直接使用类名进行调用,必须作为构造方法的第一条语句;注意:只能在一个构造方法中用this语句来调用类的其他构造方法(不能通过方法名直接调用),而不能在实例方法中用this语句来调用类的其他构造方法(在实例方法中利用new语句调用)。

以下构造方法是非法的:public Employee(){String name="无名氏";this(name); //编译错误,this语句必须作为第一条语句}以下对构造方法的调用方式是非法的:public Employee() {String name= "无名氏";Employee(name); //编译错误,不能通过方法名来直接调用构造方法}(2)当前类的子类的构造方法通过super语句调用它,必须为第一条语句;(3)在程序中通过new语句调用它。

提示:构造方法是点不出来的。

1.当前类中构造方法(构造方法重载)的调用this(参数)publicclass Person {private String name;privateint age;public Person() {this("Dick", 12);}public Person(String n) {this(n, 12);}public Person(String n, int a) {name = n;age = a;}}2.子类调用父类的构造方法(1)首先要说明的是由于先有父类后有子类,所以生成子类对象之前首先要调用父类的构造方法。

当子类的构造方法没有用super语句显式调用父类的构造方法,那么通过这个构造方法创建子类对象时,Java虚拟机会自动先调用父类的默认构造方法。

当子类的构造方法没有用super语句显式调用父类的构造方法,而父类又没有提供默认构造方法时,将会出现编译错误。

(2)假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。

父类的构造方法不能被子类继承。

子类可以通过super语句调用父类的构造方法。

用super语句来调用父类的构造方法时,必须遵守以下语法规则。

(1)在子类的构造方法中,不能直接通过父类方法名调用父类的构造方法,而是要使用super语句。

以下代码是非法的:publicMyException(String msg){Exception(msg); //编译错误}(2)使用super语句时,必须放在最前面。

以下代码是非法的:publicMyException(){String msg= "Something wrong";super(msg); //编译错误,super语句必须作为构造方法的第一条语句}class Base {}class Derived extends Base {publicstaticvoid main(String[] args) {Derived d = new Derived();}}// 下面我自己显式地加上了缺省构造方法:class Base {Base() {System.out.println("父类构造方法");}}class Derived extends Base {Derived() {System.out.println("子类构造方法");}publicstaticvoid main(String[] args) {Derived d = new Derived();}执行结果如下:说明了先执行父类的构造方法,然后是子类的构造方法。

父类构造方法子类构造方法如果Base class有多个constructor,而Derived class也有多个constructor,这时子类中的构造方法缺省调用哪个父类的构造方法呢?class Base {Base() {//父类默认构造方法System.out.println("base constructor");}Base(int i) {System.out.println("base constructor int i");}}class Derived extends Base {Derived() {System.out.println("derived constructor");}Derived(int i) {System.out.println("derived constructor int i");}publicstaticvoid main(String[] args) {Derived d = new Derived();Derived t = new Derived(9);}}执行结果如下:答案是调用父类的缺省(无参)构造方法。

base constructorderived constructorbase constructorderived constructor int i下面如果将Base 类的缺省(无参)构造方法注释掉,则出错。

说明子类中的构造方法找不到显式写出的父类中的缺省构造方法,所以出错。

那么如果你不想子类的构造方法调用你显式写出的父类中的缺省构造方法怎么办呢?class Base {Base(int i) {System.out.println("base constructor int i");}}class Derived extends Base {Derived() {super(8);System.out.println("derived constructor");}Derived(int i) {super(i);System.out.println("derived constructor int i");}publicstaticvoid main(String[] args) {Derived d = new Derived();Derived t = new Derived(9);}}执行结果如下:base constructor int iderived constructorbase constructor int iderived constructor int isuper(i)表示父类的构造方法Base(i)结论:如果当子类构造方法被调用,它的父类没有显式声明构造方法,由编译器自动产生;或是父类自己显示声明了一个缺省(无参)构造方法,那么在执行子类构造方法之前将先执行父类的缺省构造方法。

如果父类没有缺省(无参)构造方法;或是子类要调用父类带参构造方法,则需在子类构造方法的第一句代码中使用super(实参)来调用。

在创建子类的对象时,java虚拟机首先执行父类的构造方法,然后再执行子类的构造方法,在多级继承的情况下,将从继承树的最上层得父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确的初始化。

如果子类的构造方法中没有用super语句显示调用父类的构造方法,那么通过这个构造方法创建子类对象时,java虚拟机会自动先调用父类的默认构造方法,而此时若父类没有默认构造方法时,就是编译出错。

class Person {private String name = "";privateint age = 0;public Person() {//显示声明缺省构造函数System.out.println("person无参数构造函数");}public Person(String name, int age) {//带参数的构造函数 = name;this.age = age;System.out.println("person 2 参数的构造函数");}}class Student extends Person {private String school;private String grade;public Student() {System.out.println("student 无参数的构造函数");}public Student(String name, int age, String school) {System.out.println("student 3 参数的构造函数");}public Student(String name, int age, String school, String grade) { super(name, age);this.school = school;this.grade = grade;System.out.println("student 4 参数的构造函数,super().");}}publicclass Test {publicstaticvoid main(String[] args) {System.out.println("st1:");Student st2 = new Student();System.out.println("---------------------------");System.out.println("st2:");Student st = new Student("zhangshan", 76, "武大");System.out.println("---------------------------");System.out.println("st3:");Student st3 = new Student("lisi", 24, "武大", "研究生");}}输出如下:st1:person无参数构造函数student 无参数的构造函数---------------------------st2:person无参数构造函数student 3 参数的构造函数---------------------------st3:person 2 参数的构造函数student 4 参数的构造函数,super().**************************************四、重载构造方法当通过new语句创建一个对象时,在不同的条件下,对象可能会有不同的初始化行为。

相关主题