1. 什么是构造器
1.1 构造器的概念
构造器通常也叫构造方法或者构造函数。
简单点说,就是C++中的构造函数,但是在java中是没有析构函数的,java提供了垃圾回收器,对于不再使用的资源会自动释放,这点比C++简单。那我们来重新梳理下构造函数需要care的点。
1.2 构造器的作用
构造器是用来初始化成员属性和成员方法的,在创建对象的时候会被自动调用。
2. 构造方法和实例方法的区别
构造方法和实例方法主要区别于三个方面:修饰符、返回值、命名
- 修饰符
和实例方法一样,构造器可以有任何访问的修饰符,public、private、protected、或者default,都可以对构造方法进行修饰。不同于实例方法的是,构造器不能有任何非访问性质的修饰符,如: static、final、synchronized、abstract等都不能修饰构造方法。
- 返回值
实例方法可以返回任何类型的值或者无返回值(void),而构造方法是没有返回类型的,void也不行
来个示例看下:
1. public class VoidConstructor { 2. 3. VoidConstructor(){ 4. // 构造器 5. } 6. 7. void VoidConstructor() { 8. // void 方法,不是构造器 9. } 10. }
3. 构造器的特点
- 构造器必须与类同名【若同一个源文件中有多个类,则构造器必须与公共类同名】
- 构造器支持重载
- 构造器没有返回值,没有返回类型
- 若不添加构造器,编译器会默认提供空的构造器
4. 构造函数的继承
1.子类中无构造函数,可直接继承父类中无参构造函数,前提是左右变量均为public
如下:父类Student中有空构造函数Student(),子类Pupil中有空构造函数Pupil(),后者会继承前者。
注:在本例中,父类中的name、height都是public的,如果是private就无法直接继承。
1. package javastudy; 2. 3. public class ConfunDemo5 { 4. 5. public static void main(String[] args) { 6. Pupil z=new Pupil(); 7. z.show(); 8. } 9. } 10. class Student{ //父类Student 11. public String name; 12. public int height; 13. public Student() 14. { 15. this.name=""; 16. this.height=0; 17. } 18. } 19. class Pupil extends Student{ //子类Pupil 20. private int score; 21. public Pupil(){ //无参构造函数Pupil()直接继承了父类中的无参构造函数Student() 22. score=0; 23. } 24. public void show(){ 25. System.out.print("姓名:"+name+"\n身高:"+height+"\n分数:"+score); 26. } 27. }
输出:
姓名:
身高:0
分数:0
2、子类中无参构造函数继承父类中无参构造函数时,父类参数是private的,无法直接
需要在父类中使用get方法来调用私有变量值。
1. package javastudy; 2. 3. public class ConfunDemo5 { 4. 5. public static void main(String[] args) { 6. Pupil z=new Pupil(); 7. z.show(); 8. } 9. } 10. class Student{ //父类Student 11. private String name; 12. private int height; 13. public Student() 14. { 15. this.name=""; 16. this.height=0; 17. } 18. public String getName(){ 19. return name; 20. } 21. public int getHeight(){ 22. return height; 23. } 24. } 25. class Pupil extends Student{ //子类Pupil 26. private int score; 27. public Pupil(){ //无参构造函数Pupil()直接继承了父类中的无参构造函数Student(),但是父类中的name、height是private的 28. score=0; 29. } 30. public void show(){ 31. System.out.print("姓名:"+getName()+"\n身高:"+getHeight()+"\n分数:"+score); //输出时,直接用get方法名。 32. } 33. }
3、使用super调用父类的构造函数
super必须写在方法的首行
1. package javastudy; 2. 3. public class ConfunDemo5 { 4. 5. public static void main(String[] args) { 6. Pupil z=new Pupil("隔壁老王",111,222); 7. z.show(); 8. 9. Pupil w=new Pupil(); 10. w.show(); 11. } 12. } 13. class Student{ //父类Student 14. public String name; 15. public int height; 16. public Student() 17. { 18. this.name=""; 19. this.height=0; 20. } 21. public Student(String n,int m) 22. { 23. name=n; 24. height=m; 25. } 26. } 27. class Pupil extends Student{ //子类Pupil 28. private int score; 29. public Pupil(){ 30. super("孙悟空2",501); //使用super调用父类Student(String n,int m)方法,同时传递实际数值。super必须写在方法的首行。如果这里写super(),则调用的是父类中的Student()方法。 31. score=0; 32. } 33. public Pupil(String x,int y,int z){ // 34. super(x,y); //使用super调用父类Student(String n,int m)方法,其中super中的参数名称必须与构造函数中的参数名称一致。 35. score=z; 36. } 37. public void show(){ 38. System.out.println("姓名:"+name+"\n身高:"+height+"\n分数:"+score); 39. } 40. }
输出:
姓名:隔壁老王
身高:111
分数:222
姓名:孙悟空2
身高:501
分数:0
参考链接:
https://blog.csdn.net/qq_41620160/article/details/79443524
https://www.cnblogs.com/ibelieve618/p/6365631.html
https://baijiahao.baidu.com/s?id=1660565391219190318&wfr=spider&for=pc