这篇文章主要介绍了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中关于构造器的使用详解相关推荐

  1. java 队列已满_JAVA中常见的阻塞队列详解

    在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事. 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JD ...

  2. java多态的概念_java中多态是什么?概念详解

    对于java中的多态你是怎样理解的呢?很多人表示,自己对于多态的概念不是很清楚,那么下面就让我们一起来详细的了解一下吧. 1.什么是多态? 多态简单的来说就是一种事物的多种存在形态. 在面向对象语言当 ...

  3. java的日期操作_java中对时间的操作详解

    代码演示: //数据库中去的日期 Date s = list.get(0).getSdate(); System.out.println(s);// Tue Apr 28 00:00:00 CST 2 ...

  4. java dateutils详解_java中DateUtils时间工具类详解

    package com.example.administrator.myapp; import java.text.ParseException; import java.text.SimpleDat ...

  5. Java 初始化 代码块_Java中初始化块详解及实例代码

    Java中初始化块详解 在Java中,有两种初始化块:静态初始化块和非静态初始化块. 静态初始化块:使用static定义,当类装载到系统时执行一次.若在静态初始化块中想初始化变量,那仅能初始化类变量, ...

  6. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  7. java 静态 编译_Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别? 总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上 ...

  8. java中迭代器要导包吗_java 中迭代器的使用方法详解

    java 中迭代器的使用方法详解 前言: 迭代器模式将一个集合给封装起来,主要是为用户提供了一种遍历其内部元素的方式.迭代器模式有两个优点:①提供给用户一个遍历的方式,而没有暴露其内部实现细节:②把元 ...

  9. java中math的方法_Java中Math类常用方法代码详解

    近期用到四舍五入想到以前整理了一点,就顺便重新整理好经常见到的一些四舍五入,后续遇到常用也会直接在这篇文章更新... public class Demo{ public static void mai ...

最新文章

  1. python 三角形的三个边长a,b,c ,求三角形的面积?
  2. centos7搭建nexus
  3. PAT:1034 Head of a Gang (30分)
  4. 服务器怎样共享文件夹共享文件夹,服务器怎样共享文件夹共享文件夹
  5. CodeVS 1081 线段树练习 2
  6. opengl与Directx的区别
  7. Nginx location执行顺序和匹配规则
  8. 【Java】Java 对象头 真的是 32位 吗?
  9. 基于ASP.NET的开源Blog程序总结
  10. 以树之名,诉春之情--F1503005班团改金
  11. Windows开发入门:工具-WinDbg的安装和使用教程
  12. 用显卡测试软件蓝屏,简单几步解决w10更新显卡驱动后重启蓝屏的问题
  13. mybatis 父子级树形结构查询
  14. 全国DNS服务器地址备忘录
  15. Mac修改iPhone备份到移动硬盘或其他位置,避免备份空间不足
  16. 搜狗2012校招在线评测_信息编码程序
  17. UI设计培训主要学习哪些内容
  18. AI识别PS篡改图像
  19. 微生物共现网络可视化:实现布局自由
  20. 自考《管理经济学》之宏观理解

热门文章

  1. 工业以太网交换机可以家用吗?
  2. 简要分析电话光端机的常见问题
  3. 【渝粤教育】国家开放大学2018年春季 0275-22T内科护理学 参考试题
  4. 【渝粤教育】国家开放大学2018年春季 0007-22T文书档案管理 参考试题
  5. 【渝粤题库】广东开放大学 英语语法与基础写作 形成性考核 (2)
  6. java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. zbrush常用笔刷_ZBrush中常用笔刷综合简介
  8. SELECT执行过程,MySQL聚合函数,多行分组函数,GROUP BY HAVING,详细完整可收藏
  9. (1.1)HarmonyOS鸿蒙中Ability概念及意义
  10. java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner