类的加载顺序(例题)
1、很重要!!!
例子:
package Servlet.day0811.am;
public class StaticTest {static StaticTest st=new StaticTest();static{System.out.println("静态代码块");}public StaticTest(){System.out.println("构造器");System.out.println(st);m1();} public static void m1(){System.out.println("m1静态方法");System.out.println(st);}{System.out.println("普通代码块");}public static void main(String[] args) {System.out.println("main开始");StaticTest.m1();System.out.println("main结束");}
}
-------------------------------------结果如下-------------------------------------
普通代码块 (先加载普通代码块)
构造器 (再加载构造器)
null (输出构造器中的st,此时并未加载静态属性,所以输出null)
m1静态方法 (构造器中的m1方法,输出m1静态方法)
null (m1方法中的st,此时st仍然未被加载)
静态代码块 (加载静态代码块)
main开始 (main方法开始,st在这时候被加载(分配内存))
m1静态方法 (调用静态方法m1)
Servlet.day0811.am.StaticTest@d1f24bb (st已经被加载过了,所以为对象对应的地址)
main结束 (main方法结束)++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2、1、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化2、只有在调用new方法时才会创建类的实例3、类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始化块部分,然后是父类的构造方法;再执行本类继承的子类的初始化块,最后是子类的构造方法4、类实例销毁时候,首先销毁子类部分,再销毁父类部分
public class Dervied extends Base{private String name="dervied";public Dervied(){System.out.println(new Base().i);tellName();printName();}static{System.out.println("子类静态代码块");}public void tellName(){System.out.println("Dervied tell name : "+name);} public void printName(){System.out.println("Dervied print name : "+name);}public static void main(String[] args) {new Dervied();}
}
class Base{public int i=99;private String name="111";static{System.out.println("父类静态代码块");}{System.out.println("父类非静态代码块");}public Base(){tellName();printName();}public void tellName(){System.out.println("Base tell name : "+name);} public void printName(){System.out.println("Base print name : "+name);}
}
-------------------------------------结果如下-------------------------------------
父类静态代码块
子类静态代码块
父类非静态代码块
Dervied tell name : null
Dervied print name : null
父类非静态代码块
Base tell name : 111
Base print name : 111
99
Dervied tell name : dervied
Dervied print name : dervied
++++++++++++++++++++++++++做如下修改++++++++++++++++++++++++++++
将main方法里面new Dervied( ) 改为:System.out.println("hello");
结果为:
父类静态代码块
子类静态代码块
hello
============================================================
3、
class Farther{
public static int a=2;
public int b=3;
{
System.out.println("非静态代码块:b="+b);
}
static{
a=4;
System.out.println("静态代码块:a="+a);
}
public Farther(){
System.out.println("父类构造器");
this.s();
}
public void s(){
System.out.println("父类方法");
}
}
public class Son extends Farther{
public Son(){
System.out.println("子类构造器");
}
public static void main(String[] args) {
Farther f=new Son();
f.s();
}
public void s(){
super.s();
System.out.println("子类方法");
}
}
-------------------------------------结果如下-------------------------------------
静态代码块:a=4
非静态代码块:b=3
父类构造器
父类方法
子类方法
子类构造器
父类方法
子类方法
==========================================================
4、
public class InitializeDemo {
private static int k=1;
private static InitializeDemo t1=new InitializeDemo("t1");
private static InitializeDemo t2=new InitializeDemo("t2");
private static int i=print("1");
private static int n=99;
static{
print("静态代码块");
}
private int j=print("j");
{
print("非静态代码块");
}
public InitializeDemo(String str){
System.out.println(k++ + " : "+ str +" i="+i+" n="+n);
++i;
++n;
}
public static int print(String str){
System.out.println(k++ + " : "+ str +" i="+i+" n="+n) ;
++n;
return ++i;
}
public static void main(String[] args) {
new InitializeDemo("init");
}
}
-------------------------------------结果如下-------------------------------------
1 : j i=0 n=0
2 : 非静态代码块 i=1 n=1
3 : t1 i=2 n=2
4 : j i=3 n=3
5 : 非静态代码块 i=4 n=4
6 : t2 i=5 n=5
7 : 1 i=6 n=6
8 : 静态代码块 i=7 n=99
9 : j i=8 n=100
10 : 非静态代码块 i=9 n=101
11 : init i=10 n=102
转载于:https://blog.51cto.com/12181171/1958973
类的加载顺序(例题)相关推荐
- 类的加载顺序和静态代码块和匿名代码块的区别
静态代码块和匿名代码块的区别 静态块: static { } 匿名块: { } 静态块只在类第一次被加载的时候执行一次,一般用于进行初始化工作; 匿名块在每一次创建本 ...
- 查看was中项目类的加载顺序
https://blog.csdn.net/zhouyong0/article/details/7970557 查看was中项目类的加载顺序
- Spring:@AutoConfigurexxx注解-控制配置类的加载顺序
1.美图 2.概述 控制配置类的加载顺序(@AutoConfigureAfter.@AutoConfigureBefore.@AutoConfigureOrder) AutoConfigureAfte ...
- java 类的加载顺序
类的加载顺序 public class ClassA {public static ClassA classa = new ClassA();static{System.out.println(&qu ...
- Java内部类以及类的加载顺序(一)
java内部类以及类的加载顺序(一) Java 类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类.根据定义的方式不同,内部类分为四大类静态内部类,成员内部类,局部内部类,匿 ...
- 类的加载顺序和对象的实例化
直接就在JDK8中用代码来验证吧. import lombok.extern.slf4j.Slf4j;@Slf4j public class Printer {private String s;pub ...
- java类验证和装载顺序_Java类的加载顺序
1.有继承关系的加载顺序 关于关键字static,大家 都知道它是静态的,相当于一个全局变量,也就是这个属性或者方法是可以通过类来访问,当class文件被加载进内存,开始初始化的时候,被static修 ...
- java类的加载顺序题目_Java 类的加载顺序(题)
引例 public class A extends B { public int a = 100; public A() { super(); System.out.println(a); a = 2 ...
- Java类的加载顺序
一.知识 静态: (1) 父类静态成员和静态代码块 (2) 子类静态成员和静态代码块 非静态: (3) 父类非静态成员和非静态代码块 (4) 父类构造函数 (5) 子类 非静态成员和非静态代码块 (6 ...
最新文章
- 第三课.运算符与表达式
- Apache与nginx的优缺点对比
- java数组类型转换_java数据类型转换和数组总结
- 如何在ubuntu下安装source insight
- spring的PathMatchingResourcePatternResolver基于ant通配符匹配路径遍历项目所有xml文件
- java生成16位随机数_java中如何产生一个16位数字组成的随机字符串?谢谢各位了...
- 很全的路由器默认初始密码集合.txt_UpSet——集合关系可视化神器
- hive复合数据类型之struct
- java web html5区别_html5和html有什么区别啊?
- sql server权限_保护SQL Server审核的访问权限
- swift瀑布流实现_蘑菇街PC首页瀑布流实践
- python部署到linux打开ie_Linux上部署python+selenium+webdriver常见问题解决方案
- 阿铭Linux_网站维护学习笔记201903022
- 还想打马赛克掩盖身份?人工智能让你告别打码时代
- Python numpy.ones函数方法的使用
- 基于边缘检测和透视变换的文档图像校正
- ARM和NEON指令
- 美团 YOLOv6 ORT/MNN/TNN/NCNN C++推理部署
- 基于javaweb的医院分诊挂号住院管理系统(java+springboot+freemarker+mysql)
- opencv 的 ROI 和 COI