一、非静态代码块

  1、声明格式

【修饰符】 class 类名 {
{
非静态代码块
}
}

  2、非静态代码块中的代码执行时机

    (1)在"每次"创建对象的时候执行

    (2)比构造方法早

    Demo:

 class MyClass{
private String str; public MyClass(){
System.out.println("无参构造2");
}
public MyClass(String str){
this.str = str;
System.out.println("有参构造3");
} {
System.out.println("非静态代码块1");
}
}

    运行结果:先执行非静态代码中输出"非静态代码块1",然后执行无参构造方法输出"无参构造2"。

  3、实例初始化过程

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

    执行顺序:

① 为成员变量显示赋值

② 执行非静态代码块

③ 执行构造器

    图解:

    Java 编译器其实,会把这三个部分的代码,合成一个叫做 <init>(【形参列表】) 实例初始化方法。

    即编译后的 .class 字节码文件中,是没有构造方法这个概念的。

    <init>(【形参列表】) 实例初始化方法的代码就是由三个部分组成:

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

② 非静态代码中的代码

③ 构造器中的代码

    注意:

      1、其中的 ① 和 ② 按顺序执行,而 ③ 一定是它们当中的最后执行的。

      2、有几个构造器,就会有几个实例初始化方法。那么当创建对象的时候,调用对应的构造器时,其实执行的是对应的实例初始化方法 <init>(【...】)

二、继承中的非静态代码块

  1、继承案例

    先来看一个没有非静态的代码块的继承关系:

    Demo:

 public class TestInit {
public static void main(String[] args) {
Father f = new Father();
//执行父类的无参构造 Son s = new Son();
//先执行父类的无参构造,再执行子类的无参构造 Son s2 = new Son("HelloWorld");
//先执行父类的无参构造,再执行子类的有参构造1 Son s3 = new Son("Java", 10);
// 先执行父类的无参构造,再执行子类的有参构造1,然后再执行子类的有参构造2 }
}
//父类
class Father{
public Father(){
System.out.println("父类的无参构造");
}
}
// 子类
class Son extends Father{
private String str;
private int num; public Son(){
//隐含了super(); 子类的构造器中一定会调用父类的构造器,默认调用父类的无参构造
System.out.println("子类的无参构造");
} public Son(String str){
//隐含了super()
this.str = str;
System.out.println("子类的有参构造1");
} public Son(String str,int num){
this(str); //这里有this就不会有super了,然后调用本类中的构造方法
this.num = num;
System.out.println("子类的有参构造2");
}
}

  2、含有非静态代码块的继承关系

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

      它由三部分组成:

① 成员变量的显示赋值

② 非静态代码块

③ 构造方法

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

      它由三部分组成:

① 成员变量的显示赋值

② 非静态代码块

③ 构造方法

    注意:

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

    ② super() 或 super(实参列表) 之前说的是在子类构造器的首行,其实是在子类实例初始化方法的首行,所以会先完成父类的初始化,再进行子类的初始化。

    Demo:

 public class TestInit {
public static void main(String[] args) {
Fu f = new Fu(); //
System.out.println("==========");
Zi z = new Zi(); //
}
} class Fu{
private String strFu = assignFu();
{
System.out.println("(1)父类的非静态代码块");
}
public Fu(){
System.out.println("(2)父类的无参构造");
}
public String assignFu(){
System.out.println("(3)父类的assignFu()");
return "fu";
}
}
class Zi extends Fu{
private String strZi = assignZi();
{
System.out.println("(4)子类的非静态代码块");
}
public Zi(){
//super() ==>调用父类的实例初始化方法,而且它在子类实例初始化方法的首行
System.out.println("(5)子类的无参构造");
} public String assignZi(){
System.out.println("(6)子类的assignZi()");
return "zi";
}
}

   运行结果:

     

      图解:

  

  3、含有非静态代码块的重写继承关系

    Demo:

 public class TestInit {
public static void main(String[] args) {
Ba b = new Ba(); //
System.out.println("============");
Er r = new Er(); //612645,因为子类重写了assign() }
}
class Ba{
private String str = assign();
{
System.out.println("(1)父类的非静态代码块");
}
public Ba(){
System.out.println("(2)父类的无参构造");
}
public String assign(){
System.out.println("(3)父类的assign()");
return "ba";
}
}
class Er extends Ba{
private String str = assign();
{
System.out.println("(4)子类的非静态代码块");
}
public Er(){
//super() ==>调用父类的实例初始化方法,而且它在子类实例初始化方法的首行
System.out.println("(5)子类的无参构造");
} public String assign(){
System.out.println("(6)子类的assign()");
return "er";
}
}

  运行结果:

  

  图解:

  注意:this在构造器中,在实例化初始化方法中,代表的是正在创建的对象,当创建子类对象时,因为子类重写的 assign(),那么执行是子类重写的 assign() 方法。

  

Java 面向对象—非静态代码块的更多相关文章

  1. java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数

    一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构

  2. JAVA程序执行顺序(静态代码块》非静态代码块》静态方法》构造函数)

    总结:静态代码块总是最先执行. 非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行. 父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非 ...

  3. java中静态代码块,非静态代码块,构造函数

    关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...

  4. Java静态代码块与非静态代码块

    静态代码块,格式是 static{ },随着类的加载而加载,且只执行一次. 在程序中,执行的优先级最高. 非静态代码块,格式是{ },在创建对象的时候运行(即new一个对象的时候),每创建一次对象就执 ...

  5. Java非静态代码块和静态代码块

    类中存在两种特殊的代码块,即非静态代码块和静态代码块,前者是直接由 { } 括起来的代码,而后者是由 static{ } 括起来的代码. 非静态代码块在类初始化创建实例时,将会被提取到类的构造器中执行 ...

  6. Java中静态变量、静态代码块、非静态代码块以及静态方法的加载顺序

    在研究单例设计模式的时候,用到了静态变量和静态方法的内容,出于兴趣,这里简单了解一下这四个模块在类初始化的时候的加载顺序. 经过研究发现,它们的加载顺序为: 1.非静态代码块 2.静态变量或者静态代码 ...

  7. 浅谈Java中静态代码块和非静态代码块

    静态代码块: static{} 执行优先级高于非静态的初始化块,它会在类初始化(类初始化这个问题改天再详细讨论)的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员. 非静 ...

  8. Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

    子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A ...

  9. 静态代码块&非静态代码块&构造函数

    总结:静态代码块总是最先执行.非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行.父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态 ...

随机推荐

  1. 【Js】创建对象的6种方式总结、(底部包含属性名为动态的形式)

    一.new 操作符 + Object 创建对象 1 var person = new Object(); 2 person.name = "lisi"; 3 person.age ...

  2. 1.Java介绍

    第一章 走进Java 一.Java技术体系 Java技术体系组成部分:Java程序设计语言.Java虚拟机.Class文件格式.Java API类库 JDK:Java程序设计语言 + Java虚拟机 ...

  3. zzulioj - 2597: 角谷猜想2

    题目链接: http://acm.zzuli.edu.cn/problem.php?id=2597 题目描述 大家想必都知道角谷猜想,即任何一个自然数,如果是偶数,就除以2,如果是奇数,就乘以3再加1 ...

  4. HTML JAVASCRIPT CSS 大小写敏感问题

    html: 大小写不敏感 css: 大小写不敏感 javascript: 大小写敏感 但是 但是 但是 这三者是相互联系的, 所以合在一起使用的时候就产生了变化 ----  TagName, Clas ...

  5. 数学建模之Python操作csv文件

    1.用Python通过csv文件里面的某一列,形成键值,然后统计键在其他列出现的次数. import pandas as pd import numpy as np import csv import ...

  6. PATA1062 Talent and Virtue

    技术要点就是,一个是cmp函数的书写,首先应该分清楚排序关系,然后按照顺序依次排下去. 还有这里有一个巧妙点就是,在结构体中加入了类别这个标签. 学会抽象分类解决,排序比较函数cmp本质工作就是比较结 ...

  7. 洛谷P1578 奶牛牧场(悬线法思想)

    题目 悬线法的思想--即扫描线的思想,每个矩阵必定是由两个障碍来构成左右边界或者上下边界. 如果此两个障碍组成了左右边界,枚举这两个障碍中途更新这两个障碍之间的矩阵上下边界,并且更新最大值. 考虑如何 ...

  8. ##C++ format 格式化字符串

    C++ format 格式化字符串实现方式 1. http://stackoverflow.com/questions/2342162/stdstring-formatting-like-sprint ...

  9. 每日一问:谈谈 volatile 关键字

    这是 wanAndroid 每日一问中的一道题,下面我们来尝试解答一下. 讲讲并发专题 volatile,synchronize,CAS,happens before, lost wake up 为了 ...

  10. Azure DevOps Server 2019 第一个补丁包(2019.0.1 RTW)

    在Azure DevOps Server 2019正式发布后的2周左右时间,微软快速发布了第一个补丁包Azure DevOps Server 2019.0.1 RTW.Azure DevOps Ser ...