1.动态代码块
class Super{
int a = 10;
public void m1(){
System.out.println("m1...");
}
//动态代码块
{
System.out.println("动态代码块开始执行...");
System.out.println("成员属性:"+a);
m1();
System.out.println("动态代码块执行结束...");
}
public Super(){
System.out.println("Super()...对象构建结束");
}
}
等同于普通的成员方法
书写位置:类以内,其他函数以外。最好是书写在属性和方法之后
书写语法:
{
//功能语句
}
执行时机:创建对象时,会触发动态代码块的执行
执行顺序:初始化属性之后,构造方法执行之前
作用:可以给实例属性赋值(给实例属性进行必要的赋值)
2.静态代码块
class Super{
int a = 10;
public void m1(){
System.out.println("m1...");
}
//动态代码块
{
System.out.println("动态代码块开始执行...");
System.out.println("成员属性:"+a);
m1();
System.out.println("动态代码块执行结束...");
}
//静态代码块
static{
System.out.println("静态代码块执行......");
}
public Super(){
System.out.println("Super()...对象构建结束");
}
}
1. 等同于静态方法
书写位置:本类内部
书写语法
static{
//功能代码
}
执行时机:类加载时,会被触发执行一次
执行顺序:在构建对象之前
2.静态成员 ---- 只会被加载一次
静态属性 静态方法 静态代码块
非静态成员
成员变量 成员方法 动态代码块
3.静态代码块内部无法使用类的非静态成员
3.构造方法
作用
构建对象 [JVM构建对象时触发执行]
可以用来给属性赋予最终值
语法
1.无参构造
public 类名(){}
若未手动提供任何一个构造函数,系统默认提供一个无参构造
若手动提供了构造函数,则系统不再提供无参构造
2.有参构造
public 类名(形参列表){
}
3.构造函数存在重载,具体触发哪一个构造函数的执行,取决于 new 类名(实参)
取决于实参的类型,顺序,个数
4.执行顺序
静态代码块>构造代码块>构造函数>普通代码块
分配空间
1.加载父类的静态成员(静态属性,静态方法,静态代码块)
2.加载子类的静态成员(静态属性,静态方法,静态代码块)
----- 静态成员只加载一次
3.初始化父类属性
4.加载执行父类动态代码块
5.触发父类构造函数的执行
6.初始化子类属性
7.加载执行子类的动态代码块
8.触发子类构造函数的执行
------ 第一个子类对象构建结束
若构建多个子类对象 重复执行 345678
public class TestStaticDemo{
public static void main(String[] args){
new Sub();
new Sub();
new Sub();
}
}
class Super{
String field = "父类的成员变量";
static String staticField = "父类的静态属性";
public void m1(){
System.out.println("父类的成员方法");
}
public static void m2(){
System.out.println("父类的静态方法");
}
{
System.out.println(field);
System.out.println("父类的动态代码块");
}
static{
System.out.println(staticField);
System.out.println("父类的静态代码块......");
}
public Super(){
System.out.println("父类的构造方法,父类对象构建结束");
}
}
class Sub extends Super{
String field = "子类的成员变量";
static String staticField = "子类的静态属性";
public void m1(){
System.out.println("子类的成员方法");
}
public static void m2(){
System.out.println("子类的静态方法");
}
{
System.out.println(field);
System.out.println("子类的动态代码块");
}
static{
System.out.println(staticField);
System.out.println("子类的静态代码块......");
}
public Sub(){
System.out.println("子类的构造方法,子类对象构建结束");
}
}
程序的输出结果=========
父类的静态属性
父类的静态代码块......
子类的静态属性
子类的静态代码块......
父类的成员变量
父类的动态代码块
父类的构造方法,父类对象构建结束
子类的成员变量
子类的动态代码块
子类的构造方法,子类对象构建结束
父类的成员变量
父类的动态代码块
父类的构造方法,父类对象构建结束
子类的成员变量
子类的动态代码块
子类的构造方法,子类对象构建结束
父类的成员变量
父类的动态代码块
父类的构造方法,父类对象构建结束
子类的成员变量
子类的动态代码块
子类的构造方法,子类对象构建结束