package com.asia.DesignPatterns;
/**
* @author asia
* @Title:
* @Package
* @Description: 类的实例化
* @date 2019/8/3123:25
*/
public class ClassInstantiation {
/*
类的主动使用(七种):
1.创建类的实例
2.访问某个类或接口的静态变量,或者对该静态变量赋值
3.调用类的静态方法
4.反射(Class.forName(类名))
5.初始化一个子类:就是初始化一个子类也会初始化他的父类
*/
public static void main(String[] args) {
StaticMethod();
System.out.println("-------------------------");
StaticMethod();
}
/**
* 类的普通变量相当于构造代码块
* 类的静态变量相当于静态代码块
*/
static ClassInstantiation t=new ClassInstantiation();
/**
* 类一加载,会先初始化静态引用
* 所以执行顺序是:
* 静态实例化,会先调动构造代码块和构造变量,
* 静态代码块
* 静态变量
* 静态方法
类的加载-->构造代码块
类的加载-->普通变量
类的加载-->构造器
类的加载-->构造器调用a=110 b=0
类的加载-->静态代码块
类的加载-->静态变量
类的加载-->静态方法
*/
static {
System.out.println("类的加载-->静态代码块");
}
{
System.out.println("类的加载-->构造代码块");
}
ClassInstantiation(){
System.out.println("类的加载-->构造器");
System.out.println("类的加载-->构造器调用a="+a+"\tb="+b);
}
public static void StaticMethod(){
System.out.println("类的加载-->静态方法");
}
int a=f1();
static int b=f2();
private int f1() {
System.out.println("类的加载-->普通变量");
return 110;
}
private static int f2() {
System.out.println("类的加载-->静态变量");
return 112;
}
}
/**
* 类的加载顺序
* 类的加载-->静态代码块
* 类的加载-->构造代码块
* 类的加载-->构造器
* 静态代码块只会初始化一次
*/
class Foo{
public Foo(){
System.out.println("类的加载-->构造器");
}
static {
System.out.println("类的加载-->静态代码块");
}
{
System.out.println("类的加载-->构造代码块");
}
}
/**
* 1.加载:查找并加载类的二进制数据
* 2.连接 一验证:确保被加载的类的正确性 一准备:为类中的静态变量分配内存,并初始化为默认值 一解析: 把类中的符号引用转换为正确引用,
* 3.初始化:为类的静态变量赋予正确的初始值
* 注意 在加载顺序中
* 类的普通变量相当于构造代码块
* 类的静态变量相当于静态代码块
* 静态的本质:类加载时就开辟空间了,而普通引用是实例化后,就是创建构造器时才有空间
*类的加载顺序
* 类的初始化-->静态变量
* 类的初始化-->普通变量
* 类的初始化-->构造器
*/
class Foo2{
int a=f1();
static int b=f2();
private int f1() {
System.out.println("类的加载-->普通变量");
return 5;
}
private static int f2() {
System.out.println("类的加载-->静态变量");
return 5;
}
public Foo2(){
System.out.println("类的加载-->构造器");
}
}
类的加载
最新推荐文章于 2022-12-07 23:54:33 发布