一、引言 ( 简单介绍构造方法的特点)
在 Java 中,面向对象编程中的继承机制允许子类继承父类的属性和方法。当涉及到构造方法时,有一些特定的规则需要遵循。以下是在继承中构造方法访问的一些关键特点:
构造方法的访问特点
1、构造方法的调用顺序:
子类构造器会隐式或显式地调用其直接父类的构造器。
如果没有显式调用父类的构造器,那么编译器会默认添加一个对无参构造器的调用 super();。
调用父类构造器的语句必须是子类构造器的第一条语句。
2、显式调用父类构造器:
可以使用 super() 显式调用父类的无参构造器。
使用 super(参数列表); 显式调用父类的某个带参数的构造器。
如果父类没有无参构造器,那么必须显式调用有参构造器。
3、构造器链:
当父类构造器被调用时,它可能会继续调用更上层的父类构造器,形成一个构造器调用链。
这个链最终会到达继承层次结构的最顶层——Object 类,因为所有 Java 类都是直接或间接继承自
二、构造方法访问特点
1.父类中构造的方法不会被子类继承,因为这个会违反方法的定义规则,子类的方法名与类名不一致,会报错。
2.子类中所有的构造方法都默认会先访问父类中的无参构造,再去执行自己。
3.那为什么会会有这一步?
很简单,因为父类里面的变量都是可以被子类共有的,这一步就相当于给父类中的变量做了初始化,如果每一个这个默认,那子类调用时就会没有初始值了。子类在初始化的时候,可能会用到父类的数据,如果没有对父类进行初始化,那就子类无法使用父类的属性!
三、怎么调用父类构造方法 ?
子类方法的第一步都是:super(),这个是默认的,即使不写也是会存在的。且必须是在第一行。
package 继承练习2; public class person { String name; int age; public person(){ System.out.println("无参构造开始"); } public person(String name, int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
假设这个是定义的一个Person类,这里面的属性都可以被子类继承并使用,接着我们在定义一个student的子类来继承Person
package 继承练习2; public class student extends person{ public student(){ System.out.println("子类的空参构造"); } public student( String name,int age){ super(name, age); } }
然后再定义一个Test测试类来运行程序
package 继承练习2; public class Test { public static void main(String[] args) { // student s= new student("zhangsan",11); student s2 =new student(); // System.out.println(s.name+" "+s.age); } }
当我们运行程序的时候,得到结果是这样的,很明显这符合,在空参的情况的,会先出初始化父类,然后再执行子类的方法。
至于,如何调用父类的构造方法,把上面的代码注释去调即可。值得注意的是,在子类中全参的构造方法中,因为已经在父类中存在,所以在用的时候是supr(name,age)。
四、总结