java中子类调用父类构造方法,注意事项

 

继承有个特点,就是子类无法访问父类的private字段或者private方法。例如,Student类就无法访问Person类的nameage字段:

class Person {
    private String name;
   
private int age;
}

class Student extends Person {
    public String hello() {
       
return "Hello, " + name; // 编译错误:无法访问name字段
    }
}

这使得继承的作用被削弱了。为了让子类可以访问父类的字段,我们需要把private改为protected。用protected修饰的字段可以被子类访问:

class Person {
    protected String name;
   
protected int age;
}

class Student extends Person {
    public String hello() {
       
return "Hello, " + name; // OK!
    }
}

因此,protected关键字可以把字段和方法的访问权限控制在继承树内部,一个protected字段和方法可以被其子类,以及子类的子类所访问,后面我们还会详细讲解。

2.super的使用

super关键字表示父类(超类)。子类引用父类的字段时,可以用super.fieldName。例如:

class Student extends Person {
    public String hello() {
       
return "Hello, " + super.name;

扫描二维码关注公众号,回复: 11762126 查看本文章

    }
}

 

 

上面的代码执行会有编译错误,student构造方法,无法调用Person的构造方法。

解析:任何class的构造方法,必须先构造发父类的构造方法。如果没有明确的调用父类的构造方法,编译器会自动帮我们加一句super(),所以Student类的构造方法实际上是这样

 

那么问题就出在父类即Person类没有默认的构造方法,子类即Student必须显示调用重载以后的构造函数,即

 

Student类中的写法为

uploading.4e448015.gif正在上传…重新上传取消

总结:如果父类没有默认的构造方法,子类必须显示地调用super()并给出参数,让编译器定位到一个合适的构造方法。同时,子类不会继承任何父类的构造方法,子类默认的构造方法是编译器自动生成的,不是继承的

 

 

猜你喜欢

转载自blog.csdn.net/zl1107604962/article/details/105439625