Java基础-构造器
一、构造函数的定义
构造函数,一般用来初始化成员属性和成员方法,与new运算符一起使用在创建对象的语句中。
特点:
1、构造函数的名称必须与类名相同,包括大小写;
2、不用定义返回值类型。(不同于void类型返回值,void是没有具体返回值类型;构造函数是连类型都没有),不可以写return语句
3、一般函数不能调用构造函数,只有构造函数才能调用构造函数。
4、一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器
5、构造方法可以重载
二、构造函数
1、无参构造函数
无参构造函数类中只定义一个方法。构造器总是伴随着new操作一起调用.。
new对象时,就调用与之对应的构造函数,执行这个方法。
1 public class Constructor { 2 public static void main(String[] args) { 3 Person person = new Person(); 4 } 5 } 6 7 8 class Person{ 9 public Person() { 10 System.out.println("Hello World"); 11 } 12 } 13 14 15 // 输出 16 Hello World
2、有参构造函数
有参构造函数,在new对象时,将实参值传给private变量,相当于完成setter功能。
1 public class Constructor { 2 public static void main(String[] args) { 3 Person person = new Person("xiao", 12); 4 } 5 } 6 7 8 class Person { 9 private String name; 10 private int age; 11 12 public Person(String name, int age) { 13 this.name = name; 14 this.age = age; 15 } 16 }
注意,一个对象建立后,构造函数仅只运行一次。如果想给对象的值再赋新的值,就要使用set和get方法,此时是当做一般函数使用。
3、默认构造函数
当一个类中没有定义构造函数时,系统会给该类中加一个默认的空参数的构造函数,方便该类初始化。只是该空构造函数是隐藏不见的。
如下,Person(){}这个默认构造函数是不可见的。
1 class Person{ 2 //Person(){} 3 }
4、构造函数的重载
构造函数也是函数的一种,同样具备函数的重载(Overloding)特性。
public class Constructor { public static void main(String[] args) { Person person1 = new Person(); Person person2 = new Person("xiao"); Person person3 = new Person("xiao", 12); } } class Person { private String name; private int age; Person() { System.out.println("A:name=" + name + ", age=" + age); } Person(String n) { name = n; System.out.println("B:name=" + name + ", age=" + age); } Person(String n, int a) { name = n; age = a; System.out.println("C:name=" + name + ", age=" + age); } }
三、构造函数的使用
默认情况下,一个类会有一个默认的构造函数,这个构造函数没有内容也没有返回值,一般都回略去不写。这种情况下,编译器在编译的时候会默认加上一个无参且方法体为空的构造函数。但是,如果类的构造函数被重写了,如上例2.2,Person类已经有了一个有参数有方法体的构造函数,这时编译器就不会再给它默认加上一个无参且方法体为空的构造函数。可以理解为无参的构造函数被覆盖了。这种情况称为没有默认构造函数。
而在函数的继承里,子类必须调用父类的构造函数。但是,子类只能继承父类的默认构造函数。如果父类没有默认的构造函数,那子类不能从父类继承默认构造函数。这时子类必须使用super来实现对父类的非默认构造函数的调用。
在创建对象时,先调用父类默认构造函数对对象进行初始化,然后调用子类自身自己定义的构造函数。
1 class Person { 2 public String name; 3 public int age; 4 5 Person(String n, int a) { 6 name = n; 7 age = a; 8 System.out.println("C:name=" + name + ", age=" + age); 9 } 10 } 11 12 class Student extends Person{ 13 private int score; 14 public Student(){ 15 super("xiao",18); 16 score=0; 17 } 18 public Student(String x,int y,int z){ 19 super(x,y); 20 score=z; 21 } 22 public void show() { 23 System.out.println("姓名:" + name + "\n年龄:" + age + "\n分数:" + score); 24 } 25 } 26 27 28 public class Constructor{ 29 public static void main(String[] args) { 30 Student s1 = new Student(); 31 s1.show(); 32 33 Student s2 = new Student("yun", 15, 100); 34 s2.show(); 35 } 36 }