Java中类及方法的加载顺序

代码展示 

请运行下面代码,查看运行结果,并带着问题,尝试第二次debug程序。

class A {private static int numA;private int numA2;static {System.out.println("A的静态字段 : " + numA);System.out.println("A的静态代码块");}{System.out.println("A的成员变量  : " + numA2);System.out.println("A的非静态代码块");}public A() {System.out.println("A的构造器");}
}class B extends A {private static int numB;private int numB2;static {System.out.println("B的静态字段 : " + numB);System.out.println("B的静态代码块");}{System.out.println("B的成员变量 : " + numB2);System.out.println("B的非静态代码块");}public B() {System.out.println("B的构造器");}
}public class Box {public static void main(String[] args) {A ab = new B();System.out.println("---");ab = new B();}
}

执行结果:

结论

由此,可以看出类中各成员初始化的顺序是:

父类的静态字段——>父类静态代码块——>子类静态字段——>子类静态代码块——>

父类成员变量(非静态字段)——>父类非静态代码块——>父类构造器——>子类成员变量——>子类非静态代码块——>子类构造器

另外,在静态代码块中不能访问成员变量,想想这是为什么?它是否与成员的初始化顺序有必然的联系?


 有参构造的执行情况

面试的时候遇到了这样一个问题:

class A {private static int numA;private int numA2;static {System.out.println("A的静态字段 : " + numA);System.out.println("A的静态代码块");}{System.out.println("A的成员变量  : " + numA2);System.out.println("A的非静态代码块");}public A() {System.out.println("A的构造器");}public A(int n) {System.out.println("A的有参构造");this.numA2 = n;}
}class B extends A {private static int numB;private int numB2;static {System.out.println("B的静态字段 : " + numB);System.out.println("B的静态代码块");}{System.out.println("B的成员变量 : " + numB2);System.out.println("B的非静态代码块");}public B() {System.out.println("B的构造器");}public B(int n) {System.out.println("B的有参构造");this.numB2 = n;}
}public class ClassLoad {public static void main(String[] args) {B anotherB = new B(1);// 思考有参构造的输出结果}
}

如上代码,当调用了子类B的有参构造时,父类的构造器先执行肯定是确定无疑,但是是执行哪个构造器呢?

执行结果如下:

执行结果中可以看到,父类A依然是执行了无参构造,也就是说,如果子类构造器中未显式指定父类构造器,那么将会默认执行父类的无参构造,此时,如果你重载了一个父类的有参构造而没有指定无参构造,那么编译将不会通过!!

例如错误代码如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新手入门教程-------Spring Boot中集成RabbitMQ

AMQP:是Advanced Message Queuing Protocol的简称,高级消息队列协议,是一个面向消息中间件的开放式标准应用层协议。 定义了以下特性: 消息方向消息队列消息路由(包括:点到点和发布-订阅模式)可…

Java 多线程 —— ReentrantLock 与 Condition

引言 ReentrantLock 是 JUC 下的一个功能强劲的锁工具,支持公平锁、非公平锁,以及多等待队列的 Condition 。 也常常被称为“手动锁”。本篇博客主要分析它的使用方法以及 Condition 实现的一个生产者消费者模式。 一、可替代 synchronized 的手动锁 …

Rabbitmq+Springboot设计秒杀应用

秒杀业务的核心是库存处理,用户购买成功后会进行减库存操作,并记录购买明细。当秒杀开始时,大量用户同时发起请求,这是一个并行操作,多条更新库存数量的SQL语句会同时竞争秒杀商品所处数据库表里的那行数据&#xff0c…

Java8————Stream API

引言 Java8 加入了java.util.stream包,这个包中的相关API将极大的增强容器对象对元素的操作能力。 它专注于对集合对象进行各种便利、高效的聚合操作,或大批量数据处理。 Stream API借助于同样新出现的Lambda表达式,极大的提高了编程效率和…

MySQL数据库知识点总结

数据库: 数据库索引的好处:索引是对数据库表中的一个或多个列的值进行排序的结构,这样检索或者查询某条记录的时候就不在是顺序查找,而是使用特定的查找方式进行查找,如通过二分查找或者是hash值来查找,提高…

Java8 函数式对齐约定————Eclipse自定义代码风格

引言 Java8 的函数式代码风格在Stream的使用上尤为突出。尽管我们可以通过连续调用函数完成一系列操作,但是其可读性并不能保证,还需要有与之相辅的Code Style。例如,请尝试阅读下面两段完全相同的代码: 未遵守约定格式&#xf…

Java核心篇之JVM--day3

Java核心篇之JVM--day3 Java JVM详解--通俗易懂教程 JVM:Java虚拟机的简称。 谈到JVM,通常会聊到三个问题: 1. 什么时候触发Java GC? 2. 对什么东西进行Java GC? 3. 如何进行Java GC? 首先解决第…

使用springboot来实现WebLog

使用websocket技术实时输出系统日志到浏览器端,实现WebLog boot-websocket-log: spring boot系统中使用websocket技术实时输出系统日志到浏览器端,因为是实时输出,所有第一时间就想到了使用webSocket,而且在spring boot中&#…

设计模式---观察者模式介绍与理解

设计模式---观察者模式介绍与理解: 观察者模式原理:类似于定牛奶业务 1. 奶站,subject:登记注册,移除,通知(register,remove,notify) 2. 用户,…

CRS-4995: The command ‘start resource’ is invalid in crsctl.

ntp时间调整后,节点1,advm 和acfs offline 处理办法: /u01/app/12.2.0.1/grid/bin/crsctl stop crs /u01/app/12.2.0.1/grid/bin/crsctl start crs 曾经尝试如下命令不起作用 /u01/app/12.2.0.1/grid/bin/acfsload start /u01/app/12.2…

抽象工厂模式升级版————泛型化实现

引言 今天回看之前总结的抽象工厂模式的实现《Java常用设计模式————抽象工厂模式》,聚焦于抽象工厂模式的缺点,试着改进了一下。 回顾一下抽象工厂模式的缺点: 在添加新的产品类型时,难以扩展抽象工厂来生产新种类的产品。…

发生在“注解”@的那些事儿

注解: 自定义注解: 注解和类,接口一样,属于一种数据类型 注解可以放在类,方法,属性上面 注解可以有属性,也可以没有属性 注解有作用范围 ( 源码期间(String&#…

Java常用设计模式————建造者模式

引言 建造者模式(Builder Pattern)使用多个简单对象一步一步构建成一个复杂的对象。这种类型的设计模式属于建造型模式,它提供了一种创建对象的最佳方式。 一个Builder会一步步构建最终的对象。该Builder类是独立于其他对象的。 实现概要 …

使用动态代理解决网站字符集编码问题:(之前通过拦截器)

使用动态代理解决网站字符集编码问题:(之前通过拦截器) 设计模式: 在软件开发的过程中,遇到相识的问题,将问题的解决方式抽象为模型(套路) 单例模式(静态代码只会执行一…

设计模式---简单工厂设计模式

先定义一个抽象类Animal: 定义两个动物类继承这个类: 定义一个专门生产动物的工程类: 最后定义一个测试类: 按照这个动物工厂类,你会发现,如果动物一多的话,就需要写很多重复的方法,…

Java 多线程 —— ThreadLocal

一、引言 ThreadLocal是Java帮助实现线程封闭性的典型手段。 作用:提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量的传递复杂度。同时也用来维护线程中的变量不被其他线程干扰。 …

设计模式---适配器设计模式

设计模式---适配器设计模式 什么事适配器: 1. 在使用监听的时候,需要定义一个类事件监听器接口 2. 通常接口中有多个方法,而程序中不一定所有的方法都用到,但又必须重写,很繁琐 3. 适配器简化了这些操作&#xff0c…

Java并发编程实战————售票问题

引言 现有一个需求如下: 有10000张火车票,每张票都有一个编号,同时有10个窗口对外售票,如何确保车票的正常售卖? 程序一:使用List 问题的解决办法都是从我们最最熟悉的角度思考。程序一,我们…

多线程相关知识

多线程相关知识 两个线程进行通信:通过等待(wait)唤醒(notify)机制 三个或三个以上线程进行通信:通过notifyAll()方法 /* * 1. 在同步代码块中,用哪个对象锁&#xff0c…

Eclipse集成PyDev5.2.0开发插件

引言 在进行Python学习的时候,希望不使用IDLE进行开发,但是其他的IDE如PyCharm可能需要一段短暂时间的上手,因为开发过Java,所以使用能够集成到Eclipse上的PyDev插件进行开发应该会好一些。 但是在安装PyDev的时候发生了一些问题…