java 非静态 初始化_Java非静态代码块和实例初始化过程
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非静态代码块和实例初始化过程相关推荐
- java代码讲解_Java基础系列-代码块详解
注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 前言 Java基础系列,尽量采用通俗易懂.循序渐进的方式,让大家真正理解Java基础知识! 代码块 ...
- java类静态初始化_Java静态代码块和类初始化、实例初始化过程
1. 静态代码块 静态代码块:定义在类中方法外,使用static修饰 ①可以为类变量(静态变量)初始化 ②静态代码块在第一次使用这个类之前执行,即在类初始化时执行,且只执行一次 ③若有多个静态代码块, ...
- java静态变量、静态方法、代码块、main方法
文章目录 一.类变量 / 静态变量(static) 二.类方法 / 静态方法(static) 三.main方法 四.代码块 (一)static代码块 (二)普通代码块 五.属性初始化.代码块.构造器的 ...
- 【JAVA类与对象----5(static、代码块)】
一.为什么使用static class Student{private String name; //姓名private int age; //年龄private String classroom; ...
- java无法从静态上下文_java - “非静态方法无法从静态上下文中引用”背后的原因是什么?...
java - "非静态方法无法从静态上下文中引用"背后的原因是什么? 这个问题在这里已有答案: 无法从静态上下文引用非静态变量 ...
- 牛客网Java刷题知识点之什么是代码块、普通代码块、静态代码块、同步代码块、构造代码块以及执行顺序...
不多说,直接上干货! 这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号({})将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说代码块是不能单独运行的,它必须要有运行 ...
- 代码块(普通代码块、构造代码块、静态代码块、同步代码块)、初始化(类初始化、对象初始化)
普通代码块:类里的代码块,方法里的代码块,语句代码块,{} 构造代码块:直接写在类里方法外的代码块,用来对实例对象进行初始化 静态代码块:语法上,在构造代码块前加一个static,用来对类进行初始化 ...
- java创建静态对象_java - 以静态方式创建对象
初始化操作的一般顺序是(在加载类之后和首次使用之前): 静态(类)代码块按顺序出现在代码中, 对象代码块按顺序出现在代码中(初始化块和赋值). 构造函数 当然我不会将构造函数和函数体引用为上面的代码块 ...
- java 代码块(局部代码块、实例代码块、静态代码块、同步代码块)
1 引言 代码块是类的成分之一:成员变量,方法,构造器,代码块,内部类. 在Java中,使用 { } 括起来的代码被称为代码块(Code block) 1.1 代码块的分类 根据其位置和声明的不同,可 ...
最新文章
- Atitit main函数的ast分析 数组参数调用的ast astview解析
- docker学习------centos7.5下的swarm集群可视化构建
- Feign深入学习(一)
- Java多线程的几种写法
- 通过路由远程计算机重启,华为无线路由器三种常用重启的方法
- java 异步读写_Java异步与AIO
- python基本语句
- C# 浅拷贝与深拷贝(复制)
- Java中的Flyweight设计模式
- 亲,你们都在家办公吗?啥感受?hahaha
- 关于浏览器中copy, cut, paste捕获的总结
- 网易交互设计师微专业C5 交互设计测试与评估
- 周志华与「深度森林」
- 水库河道应急广播系统解决方案
- Mac - 当前位置打开终端
- UE4 Slate七 Slate本地化, UE4编辑器如何做的本地化
- 频繁gc是什么意思_CPU飙高,频繁GC,怎么排查?
- c 语言从指针得到对象,c – 获取指向由智能指针指向的对象的指针 – Ivalue错误...
- 4成药企要退出,他们的药代知道吗?
- mysql 替换 斜杠_Mysql like查询语句中,结果包含反斜杠 \ 字符的,需要替换成四个反斜杠 \\\\...
热门文章
- AliOS Things 基于组件化思想的多bin特性
- Quorum 和唱票那回事
- 对话阿里云:开源与自研如何共处?
- 利用 Docker 在不同宿主机做 CentOS 系统容器 | 原力计划
- 使用AWS CloudWatch 调优Lambda函数 | 技术头条
- 名企程序员被裁实录:早上还在改 Bug,晚上就成下岗工
- python复制列表元素_Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解...
- mysql复杂查询sql_mysql – 复杂的SQL查询,很多很多
- location 拦截所有_电脑广告拦截软件 Adguard Premium
- php _trait,php Trait的使用