类初始化和实例初始化

一、类初始化过程

  1. 一个类要创建实例需要先加载并初始化该类

    • main方法所在的类需要先加载和初始化
  2. 一个子类要初始化需要先初始化父类
  3. 一个类初始化就是执行< clinit>()方法
    • < clinit>()方法由静态类变量显示赋值代码和静态代码块组成
    • 类变量显示赋值代码和静态代码块代码从上到下顺序执行
    • < clinit>()方法只执行一次

二、实例初始化过程

  1. 实例初始化就是执行()方法

    • < init>()方法可能重载有多个,有几个构造器就有几个方法
    • < init>()方法由非静态实例变量显示赋值代码和非静态代码块、对应构造器代码组成
    • 非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行,而对应构造器的代码最后执行
    • 每次创建实例对象,调用对应构造器,执行的就是对应的方法
    • 方法的首行是super()或super(实参列表),即对应父类的方法

三、方法的重写Override

  1. 哪些方法不可以被重写

    • final方法
    • 静态方法
    • private等子类中不可见的方法
  2. 对象的多态性
    • 子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码
    • 非静态方法默认的调用对象是this
    • this对象在构造器或者说方法中就是正在创建的对象

四、代码及结果

代码
/*
父类的初始化<clinit>
1. 父类静态成员变量(写在前,先执行)
2. 父类静态代码块(写在后,后执行)

父类的实例初始化<init>:
1. super()
2. 父类的非静态成员变量(写在前,先执行)
3. 父类的非静态代码块(写在后,后执行)
4. 父类的无参构造
*/
public class Father {
    private int i = initI();
    private static int j = initJ();

    static {
        System.out.print("(1)");
    }

    public Father() {
        System.out.print("(2)");
    }

    {
        System.out.print("(3)");
    }

    public int initI() {
        System.out.print("(4)");
        return 1;
    }

    public static int initJ() {
        System.out.print("(5)");
        return 1;
    }
}
/*
子类的初始化<clinit>
1. 子类静态成员变量(写在前,先执行)
2. 子类静态代码块(写在后,后执行)

先初始化父类:(5)(1)
初始化子类:(10)(6)

子类的实例初始化<init>:
1. super()   (9)(3)(2) (子类重写了父类的方法,所以这里会调用子类的方法)
2. 子类的非静态成员变量(写在前,先执行)  (9)
3. 子类的非静态代码块(写在后,后执行)  (8)
4. 子类的无参构造 (7)

非静态方法前面其实有一个默认的对象this
this在构造器(或<init>)它表示的是正在创建的对象,因为这里是在创建Sub对象,所有initI()执行的是子类重写的代码(面向对象多态)
*/
public class Son extends Father {
    private int i = initI();
    private static int j = initJ();

    static {
        System.out.print("(6)");
    }

    public Son() {
        System.out.print("(7)");
    }

    {
        System.out.print("(8)");
    }

    public int initI() {
        System.out.print("(9)");
        return 1;
    }

    public static int initJ() {
        System.out.print("(10)");
        return 1;
    }

    public static void main(String[] args) {
        Son s1 = new Son();
        System.out.println();
        Son s2 = new Son();
    }
}
结果
(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)
(9)(3)(2)(9)(8)(7)

原文地址:https://www.cnblogs.com/shaoyu/p/12400869.html

时间: 2024-11-01 21:28:19

类初始化和实例初始化的相关文章

Java静态初始化,实例初始化以及构造方法

首先有三个概念需要了解: 一.静态初始化:是指执行静态初始化块里面的内容. 二.实例初始化:是指执行实例初始化块里面的内容. 三.构造方法:一个名称跟类的名称一样的方法,特殊在于不带返回值. 我们先来看一段程序结果: package com; class Book{ public static int booksum=0;//静态变量 static{//这是静态初始化块 print(); System.out.println("this is static block"); } {//

Java类的实例化的初始化过程

A a = new A(); new 创建对象过程: 1.类加载 代码验证 2.给对象在内存(堆)中分配空间(给属性赋值): 3.属性赋默认值: byte,short.int,long ->0 float  ->0.0f double ->0.0 boolean  ->false String ->null char ->'\u0000' 4.给属性赋初始值:(用等号'=') 5.调用构造方法(方法和类名相同,没有返回类型) 6.将对象在堆区中的首地址返回给引用a /*

【Simple Java】什么是Java实例初始化块

在本篇文章,我将会使用一个例子展示什么是实例变量初始化块,实例初始化块和静态初始化块,然后说明在Java中实例初始化块是如何工作的. 执行顺序 查看下面的代码,你知道哪个先执行吗? package simplejava; class Foo { // instance variable initializer String s = "abc"; // constructor public Foo() { System.out.println("constructor call

Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

1.执行顺序 1.1.一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量.初始化块.构造器). 示例如下:(结果见注释) 1 class A { 2 public A() { 3 System.out.println("Constructor A."); 4 } 5

【解惑】类与对象的初始化问题

★ 类常量 Java类常量(final修饰) 的值在编译阶段就已经写入了class文件的常量池中(可见<Class文件内容及常量池 >).该类在JVM中运行的任何阶段都不可能改变这个常量值.这也就形成了Java常量定义的两个语法规定:(1) Java类常量必须在类中声明的时候就赋给特定的值.(2) Java类常量绝对不允许赋第二次值. 下面是Java类常量的初始化代码: Java代码 //代码1: 类常量的初始化 public class Init{ //定义类常量ITEM,声明的同时必须赋值

java-双大括号实例初始化的反模式

今天在看springboot的batch时, 看到这样一段代码, 直接把我看懵了, 于是找了一下, 发现这 两个大括号 {{  叫实力初始化器 FlatFileItemReader<Person> reader = new FlatFileItemReader<>(); // 设置 csv文件的路径 reader.setResource(new ClassPathResource("people.csv")); // 对cvs文件的数据和领域模型做对应映射 re

2.24 Java基础总结 ①访问权限②static③静态方法④实例初始化块⑤静态初始化块

①访问权限②static③静态方法④实例初始化块⑤静态初始化块一.访问权限 默认是同包protected是有关系的,即同包和不同包的子类private只有本类,public全部   本类   同包 不同包       子类 非子类 子类 非子类 private √         默认(同包) √ √ √     protected √ √ √ √   public √ √ √ √ √ 二.static静态成员变量,类级别,全类共享一个Person.country = "中国":一般用

Java显示的静态初始化和非静态实例初始化

静态初始化只执行一次,实例初始化每次创建实例都会执行. 1.创建一个Spoon类: package com.samsung.wx; public class Spoon { static { System.out.println("显示的静态初始化"); } { System.out.println("非静态实例初始化"); } public void f1(int i) { System.out.println(i); } } 2.测试代码: package co

Java 类与对象的初始化

面试的时候,经常会遇到这样的笔试题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和静态块,它们只包含一些简单的输出字符串到控制台的代码,然后让我们写出正确的输出结果.这实际上是在考察我们对于类的初始化知识的了解. 首先,我们先看看下面的代码,这就是很经典的考察方式. public class InitField { public static void main(String[] args) { SuperInitField p = new SuperInitField();