构造器中可要调用本类的方法,但要调用的非static方法必须声明为private或final
来源:互联网 发布:linux如何删除隐藏文件 编辑:程序博客网 时间:2024/05/29 10:27
在Java程序中,我们是可以在构造方法中调用本类的方法和成员变量的,但是要注意一点,当我们需要调用一个非static的方法时,该方法不应该可以被子类覆盖,应该用final修饰或将其变成private,这虽然语法上没有具体要求,但是若不遵守这个约定,会导致异常情况发生。
具体原因我们看以下测试代码:
Father.java
public class Father { public void invokeInConstructor(){ System.out.println("调用了父类中的invokeInConstructor方法"); } public Father(){ System.out.println("父类构造方法"); this.invokeInConstructor(); }}
Son.java
public class Son extends Father { //普通成员变量初始化的时间在调用父类构造方法之后,调用子类构造方法之前。 private Date date = new Date(); //子类覆盖了父类的方法,并且在其中调用了子类的成员变量 @Override public void invokeInConstructor(){ System.out.println("在子类中已经初始化了的date对象:" + date); } public Son(){ super(); } //使用main函数测试 public static void main(String[] args) { System.out.println("==========构造父类=========="); Father father = new Father();//构造父类 System.out.println("==========构造子类=========="); Son son = new Son(); }}执行结果:
可以看到,当我们在构造子类时,会先调用父类的构造方法,而父类的构造方法中调用的是invokeInConstructor,该方法在子类中被覆盖,因为多态特性,父类构造器实际上调用的是子类的invokeInConstructor方法,而该方法中调用了在执行父类构造器时还未来得及初始化成员变量(该成员变量会在子类构造器调用之前执行),这会导致抛出空指针异常等等后果。
阅读全文
0 0
- 构造器中可要调用本类的方法,但要调用的非static方法必须声明为private或final
- java 反射调用 私有构造类中 private static final 属性的方法
- Java的构造方法能不能为private,何时可以将构造方法声明为private?
- 声明一个父类A,它只有一个非默认构造方法;声明A的子类B,B具有默认构造方法及非默认方法,并在B的构造方法中调用基类A的构造方法。
- static方法与非static方法相互调用的方式
- 为什么匿名内部类调用的方法内局部变量必须为final
- 为什么匿名内部类调用的方法内局部变量必须为final
- 为什么匿名内部类调用的方法内局部变量必须为final
- 为什么匿名内部类调用的方法内局部变量必须为final
- static 方法和非静态方法的调用
- private与static的方法是不是默认为final的测试
- C里是const java用final 被声明为final的方法或类不能被继承
- java -private,this,static关键字 和构造方法,final关键字
- ruby 绕过private方法的限制,直接调用private方法
- 构造函数,密封类密封方法,子类调用父类的构造方法, Projector,类的实例化声明
- 为了避免无法确定该调用的构造函数而需将main函数设为先于类的构造而执行,故将其声明为static
- 为了避免无法确定该调用的构造函数而需将main函数设为先于类的构造而执行,故将其声明为static
- 为什么java的子类中必须调用父类的构造方法
- 判断JavaScript对象为null或者属性为空
- python005 Python3 注释
- 天神下凡
- 杭电 OJ 1194 Beat the Spread!
- 公钥和私钥
- 构造器中可要调用本类的方法,但要调用的非static方法必须声明为private或final
- iOS之蓝牙
- androidstudio中给LinearLayout加外边框
- JUnit单元测试--IntelliJ IDEA
- PAT L1-017. 到底有多二
- (不再跟新,markdown在移动端体验太差)spring , spring的事务管理 , 为什么要事务管理
- Sudoku
- 机器学习七 回归分析
- 李超线段树