Java构造器使用方法及注意事项

 更新时间:2017年07月30日 09:04:24   投稿:lqh  
这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方,需要的朋友可以参考下

Java构造器使用方法及注意事项

超类的构造器在子类的构造器运行之前运行,也就是说,在创建对象时,先运行超类中的构造器,然后再运行子类中的构造器,此时,如果在执行超类构造器的时候,构造器执行了可覆盖的方法,那么就会去调用子类中的该方法,而此时子类还未被实例化,此时就有可能出问题。

以一个例子说明:

public class Super {
int age = 10;
protected void say() {
System.out.println("super");
}
public Super() {
override();
}
public void override() {
System.out.println("super override");
}
}
class Sub extends Super {
int age = 9;
private final Date date;
public Sub() {
date = new Date();
}
@Override
public void override() {
System.out.println(date);
}
@Override
protected void say() {
System.out.println("sub");
}
public static void main(String[] args) {
Super sub = new Sub();
sub.override();
// sub.say();
// System.out.println(sub.age);
}
}

创建两个类,一个 Super.java,其中定义一个成员变量 age=10,并且在构造器中调用了 override() 方法。Sub.java 继承了 Super.java,并且在构造方法中初始化了 date。

现在我们执行 main 方法,控制台会打印出什么呢? 是一个 date? 还是两个 date? 答案是先打印出 null,然后打印出具体的 date 值。并且如果在 Sub.java 的 override 方法中调用 date 的任意方法时,会出现 NPE

为什么会这样呢?

我们知道在使用 new 来创建对象的时候,会先检查该类是否继承自父类,如果是,则会先调用父类的构造方法,该案例中,在 new Sub() 时,发现 Sub 是 Super 的子类,于是先调用 Super 的构造方法,在 Super 构造方法中,发现调用了 override 方法,于是又去寻找子类 Sub 是否重写了 override 方法,发现该子类重写了,则调用子类的 override,打印出 date,而此时 date 还未被初始化,所以值为 null。

在父类的构造方法执行完毕后,再执行子类的构造方法,此时 date 被初始化了,所以再次调用 override 方法时,则会正确打印出 date。

当调用 sub.age,会打印出什么呢?是 10 还是 9 ?

其实是打印出 10,创建对象的时候,实例变量有两种类型,前面是声明类型,后面是实际类型

Super sub = new Sub();

sub 的声明类型为 Super,实际类型为 Sub。

当调用成员变量的时候,会先在声明类型中寻找该变量,如果该变量存在,则使用声明类型中的变量值,如果不存在,则在实际类型中去寻找该变量。

而调用方法的话,优先在子类中寻找对应方法,如果子类中不存在,再调用父类中方法。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持,如有疑问请留言,本站还有很多java 的文章,欢迎大家搜索参阅!

相关文章

  • JAVA错误类结果类和分页结果类代码详解

    JAVA错误类结果类和分页结果类代码详解

    这篇文章主要介绍了JAVA错误类结果类和分页结果类代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 深入了解java 8的函数式编程

    深入了解java 8的函数式编程

    函数式编程并不是Java新提出的概念,其与指令编程相比,强调函数的计算比指令的计算更重要;与过程化编程相比,其中函数的计算可以随时调用。下面我们来详细了解一下吧
    2019-06-06
  • 一文详解Spring AOP的配置与使用

    一文详解Spring AOP的配置与使用

    面向切面编程(俗称AOP)提供了一种面向对象编程(俗称OOP)的补充,面向对象编程最核心的单元是类(class),然而面向切面编程最核心的单元是切面(Aspects)。本文就来和大家聊聊AOP的配置与使用,感兴趣的可以了解一下
    2022-11-11
  • java基于C/S模式实现聊天程序(服务器)

    java基于C/S模式实现聊天程序(服务器)

    这篇文章主要为大家详细介绍了java基于C/S模式实现聊天程序的服务器篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • spring cloud 阿波罗 apollo 本地开发环境搭建过程

    spring cloud 阿波罗 apollo 本地开发环境搭建过程

    Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性
    2018-01-01
  • Spring中基于xml配置管理Bean的步骤

    Spring中基于xml配置管理Bean的步骤

    Spring容器通常理解为BeanFactory或者ApplicationContext,我们知道spring的IOC容器能够帮我们创建对象,对象交给spring管理之后我们就不用手动去new对象,这篇文章主要介绍了Spring中基于xml配置管理Bean的步骤,需要的朋友可以参考下
    2023-11-11
  • Springboot基于Redisson实现Redis分布式可重入锁源码解析

    Springboot基于Redisson实现Redis分布式可重入锁源码解析

    这篇文章主要介绍了Springboot基于Redisson实现Redis分布式可重入锁,本文通过案例源码分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 如何通过Java生成一个随机数

    如何通过Java生成一个随机数

    当我们需要在Java中生成随机数时,可以借助JDK中提供的Random类来实现,通过使用Random类,我们可以轻松地生成各种类型的随机数,下面我们就来看看如何利用Random类生成随机数吧
    2023-09-09
  • java导出到excel常用的几种方式总结

    java导出到excel常用的几种方式总结

    导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下,下面这篇文章主要给大家介绍了关于java导出到excel常用的几种方式,需要的朋友可以参考下
    2023-05-05
  • java模拟http的Get/Post请求,并设置ip与port代理的方法

    java模拟http的Get/Post请求,并设置ip与port代理的方法

    下面小编就为大家带来一篇java模拟http的Get/Post请求,并设置ip与port代理的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论