1 非静态代码块

非静态代码块特点

①可以为实例变量(非静态的属性)初始化

②每次创建对象的时候,都会执行一次,且先于构造器执行

③若有多个非静态的代码块,那么按照定义的顺序从上到下依次执行

④代码块中既可以调用非静态的变量和方法,也可以可以调用静态的变量和方法

测试代码:

public class BlockTest {

public static void main(String[] args) {

MyClass my1 = new MyClass();

//MyClass my2 = new MyClass("java");

}

}

class MyClass {

private String str;

{

System.out.println("非静态代码块1");

}

public MyClass() {

System.out.println("无参构造");

}

public MyClass(String str) {

this.str = str;

System.out.println("有参构造");

}

{

System.out.println("非静态代码块2");

}

}

运行结果:

非静态代码块1

非静态代码块2

无参构造

2 实例初始化

实例初始化过程:创建对象时,为对象进行初始化的操作

①为成员变量显式赋值

②执行非静态代码块

③执行构造器

Java编译器会把这三个部分的代码,合成一个叫做 ([形参列表]) 实例初始化方法

即编译后的.class字节码信息中,是没有构造器这个概念。

([形参列表]) 实例初始化方法的代码就是由三个部分组成:

①成员变量显式赋值的代码

②非静态代码块中的代码

③构造器中的代码

其中①和②按定义顺序依次执行,③最后执行。

而且,有几个构造器,就会有几个实例初始化方法。那么当你创建对象的时候,调用对应的构造器时,其实执行的是对应的实例初始化方法 ([形参列表])

代码示例:

public class InitTest {

public static void main(String[] args) {

Demo d1 = new Demo();

//Demo d2 = new Demo("java");

}

}

class Demo{

{

System.out.println("非静态代码块1");

}

private String str = assign();//调用方法,为str进行显式赋值

public Demo(){

System.out.println("无参构造");

}

public Demo(String str){

this.str = str;

System.out.println("有参构造");

}

{

System.out.println("非静态代码块2");

}

public String assign(){

System.out.println("为成员变量赋值");

return "hello";

}

}

3 子类实例初始化

(1)先执行父类的实例初始化方法

它由三部分组成:

成员变量的显式赋值

非静态代码块

构造器

(2)再执行子类的实例初始化方法

它由三部分组成:

成员变量的显式赋值

非静态代码块

构造器

super()或super(实参列表) 表面是调用父类的构造器,其实是调用父类对应的实例初始化方法

super()或super(实例列表) 表面是在子类构造器的首行,其实是在子类实例初始化方法的首行

代码示例:

public class InitTest2 {

public static void main(String[] args) {

Son s = new Son();

}

}

class Father {

private String strFather = assignFather();

{

System.out.println("父类的非静态代码块");

}

public Father(){

System.out.println("父类的无参构造");

}

public String assignFather(){

System.out.println("父类的assignFather()");

return "father";

}

}

class Son extends Father {

private String strSon = assignSon();

{

System.out.println("子类的非静态代码块");

}

public Son(){

//super() ==> 调用父类的实例初始化方法,而且它在子类实例初始化方法的首行

System.out.println("子类的无参构造");

}

public String assignSon(){

System.out.println("子类的assignSon()");

return "son";

}

}

运行结果:

父类的assignFather()

父类的非静态代码块

父类的无参构造

子类的assignSon()

子类的非静态代码块

子类的无参构造

子类为成员变量显式赋值方法重写父类显式赋值方法时,调用的子类重写的方法,代码示例:

public class InitTest3 {

public static void main(String[] args) {

Son s = new Son();

}

}

class Father {

private String strFu = assign();

{

System.out.println("父类的非静态代码块");

}

public Father(){

System.out.println("父类的无参构造");

}

public String assign(){

System.out.println("父类的assign()");

return "father";

}

}

class Son extends Father {

private String strSon = assign();

{

System.out.println("子类的非静态代码块");

}

public Son(){

//super() ==>调用父类的实例初始化方法,而且它在子类实例初始化方法的首行

System.out.println("子类的无参构造");

}

public String assign(){

System.out.println("子类的assign()");

return "son";

}

}

运行结果:

子类的assign()

父类的非静态代码块

父类的无参构造

子类的assign()

子类的非静态代码块

子类的无参构造

java 非静态 初始化_Java非静态代码块和实例初始化过程相关推荐

  1. java代码讲解_Java基础系列-代码块详解

    注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 前言 Java基础系列,尽量采用通俗易懂.循序渐进的方式,让大家真正理解Java基础知识! 代码块 ...

  2. java类静态初始化_Java静态代码块和类初始化、实例初始化过程

    1. 静态代码块 静态代码块:定义在类中方法外,使用static修饰 ①可以为类变量(静态变量)初始化 ②静态代码块在第一次使用这个类之前执行,即在类初始化时执行,且只执行一次 ③若有多个静态代码块, ...

  3. java静态变量、静态方法、代码块、main方法

    文章目录 一.类变量 / 静态变量(static) 二.类方法 / 静态方法(static) 三.main方法 四.代码块 (一)static代码块 (二)普通代码块 五.属性初始化.代码块.构造器的 ...

  4. 【JAVA类与对象----5(static、代码块)】

    一.为什么使用static class Student{private String name; //姓名private int age; //年龄private String classroom; ...

  5. java无法从静态上下文_java - “非静态方法无法从静态上下文中引用”背后的原因是什么?...

    java - "非静态方法无法从静态上下文中引用"背后的原因是什么? 这个问题在这里已有答案: 无法从静态上下文引用非静态变量                            ...

  6. 牛客网Java刷题知识点之什么是代码块、普通代码块、静态代码块、同步代码块、构造代码块以及执行顺序...

    不多说,直接上干货! 这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号({})将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说代码块是不能单独运行的,它必须要有运行 ...

  7. 代码块(普通代码块、构造代码块、静态代码块、同步代码块)、初始化(类初始化、对象初始化)

    普通代码块:类里的代码块,方法里的代码块,语句代码块,{} 构造代码块:直接写在类里方法外的代码块,用来对实例对象进行初始化 静态代码块:语法上,在构造代码块前加一个static,用来对类进行初始化 ...

  8. java创建静态对象_java - 以静态方式创建对象

    初始化操作的一般顺序是(在加载类之后和首次使用之前): 静态(类)代码块按顺序出现在代码中, 对象代码块按顺序出现在代码中(初始化块和赋值). 构造函数 当然我不会将构造函数和函数体引用为上面的代码块 ...

  9. java 代码块(局部代码块、实例代码块、静态代码块、同步代码块)

    1 引言 代码块是类的成分之一:成员变量,方法,构造器,代码块,内部类. 在Java中,使用 { } 括起来的代码被称为代码块(Code block) 1.1 代码块的分类 根据其位置和声明的不同,可 ...

最新文章

  1. Atitit main函数的ast分析  数组参数调用的ast astview解析
  2. docker学习------centos7.5下的swarm集群可视化构建
  3. Feign深入学习(一)
  4. Java多线程的几种写法
  5. 通过路由远程计算机重启,华为无线路由器三种常用重启的方法
  6. java 异步读写_Java异步与AIO
  7. python基本语句
  8. C# 浅拷贝与深拷贝(复制)
  9. Java中的Flyweight设计模式
  10. 亲,你们都在家办公吗?啥感受?hahaha
  11. 关于浏览器中copy, cut, paste捕获的总结
  12. 网易交互设计师微专业C5 交互设计测试与评估
  13. 周志华与「深度森林」
  14. 水库河道应急广播系统解决方案
  15. Mac - 当前位置打开终端
  16. UE4 Slate七 Slate本地化, UE4编辑器如何做的本地化
  17. 频繁gc是什么意思_CPU飙高,频繁GC,怎么排查?
  18. c 语言从指针得到对象,c – 获取指向由智能指针指向的对象的指针 – Ivalue错误...
  19. 4成药企要退出,他们的药代知道吗?
  20. mysql 替换 斜杠_Mysql like查询语句中,结果包含反斜杠 \ 字符的,需要替换成四个反斜杠 \\\\...

热门文章

  1. AliOS Things 基于组件化思想的多bin特性
  2. Quorum 和唱票那回事
  3. 对话阿里云:开源与自研如何共处?
  4. 利用 Docker 在不同宿主机做 CentOS 系统容器 | 原力计划
  5. 使用AWS CloudWatch 调优Lambda函数 | 技术头条
  6. 名企程序员被裁实录:早上还在改 Bug,晚上就成下岗工
  7. python复制列表元素_Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解...
  8. mysql复杂查询sql_mysql – 复杂的SQL查询,很多很多
  9. location 拦截所有_电脑广告拦截软件 Adguard Premium
  10. php _trait,php Trait的使用