package com.hspedu.codeblock_;
public class Course385 {
public static void main(String[] args) {
// 代码块
Movie movie = new Movie("你好李焕英");
System.out.println("========================");
Movie movie2 = new Movie("唐探3", 100, "陈思诚");
}
}
class Movie {
private String name;
private double price;
private String director;
// 代码块
/*
* 1、构造器都会执行相同的代码语句
* 2、相同的部分可以提出到代码块
* 3、不管调用哪一个构造器都会优先调用代码块
* 4、代码块优先于构造器执行
* 5、代码块可以用static修饰,也可以不修饰
* */
{
System.out.println("广告开始..");
System.out.println("电影开始..");
}
public Movie(String name) {
System.out.println("《" + name + "》");
this.name = name;
}
public Movie(String name, double price) {
System.out.println(name + ", " + price);
this.name = name;
this.price = price;
}
public Movie(String name, double price, String director) {
System.out.println("《" + name + "》" + ", " + price + ", " + director);
this.name = name;
this.price = price;
this.director = director;
}
}
package com.hspedu.codeblock_;
public class Course386 {
public static void main(String[] args) {
// 代码块细节
/*
* 1、static代码块:静态代码块,作用是对类的初始化,随着类加载而执行
* 并且只会执行一次。如果是非静态代码块则每次创建对象,就会执行一次
* 2、类什么时候被加载?(重要)
* 1)new创建对象实例
* 2)new创建子类对象实例
* 3)使用类的静态成员(静态属性、静态方法)
* 3、非静态代码块,在创建对象实例时,会隐式调用,
* 如果只使用类的静态成员则不会执行非静态代码块
*
* */
// (1)new实例化对象加载
AA aa = new AA();
System.out.println("======================");
// (2)new子类实例化加载,而且父类先加载,子类后加载
AA aa2 = new AA();
System.out.println("======================");
// (3)调用静态成员,类加载,执行静态代码块(父类会先加载,先执行父类的静态代码块)
System.out.println(Cat.n1);
System.out.println("======================");
// 静态代码块只会在类加载时执行一次,同AA类执行效果一样
// DD d1 = new DD();
// DD d2 = new DD();
System.out.println(DD.n1); // 只调用静态成员不会执行非静态代码块,静态代码块在第一次类加载时调用
}
}
class Animal {
static {
System.out.println("Animal类的静态代码块");
}
}
class Cat extends Animal {
public static int n1 = 999;
static {
System.out.println("Cat类的静态代码块");
}
}
class AA extends BB {
// 静态代码块
static {
System.out.println("AA类的静态代码块1");
}
public AA() {
System.out.println("AA对象创建");
}
}
class BB {
static {
System.out.println("BB类的静态代码块1");
}
public BB() {
System.out.println("BB对象创建");
}
}
class DD {
public static int n1 = 100;
static {
System.out.println("DD类的静态代码块");
}
// 类加载和非静态代码块的执行没有关系
{
System.out.println("DD类的非静态代码块");
}
}
package com.hspedu.codeblock_;
public class Course387 {
public static void main(String[] args) {
// 代码块细节 2
/*
* 4、在同一个类中创建对象的调用顺序:
* (1)先调用静态代码块和静态属性的初始化:调用顺序按照代码定义的顺序执行
* (2)然后调用非静态代码块和非静态属性初始化:调用顺序同样按照定义的顺序执行
* (3)最后调用构造器方法
* 原因分析:类加载在对象创建之前,静态成员在类加载时调用执行,非静态成员在创建对象执行
* */
//
A a = new A();
}
}
class A {
// 非静态代码块
{
System.out.println("A类的非静态代码块"); // 3
}
// 静态属性初始化
private static int n1 = getN1();
// 非静态属性初始化
private int n2 = getN2();
// 静态代码块
static {
System.out.println("A类的静态代码块 static"); // 2
}
// 静态方法
public static int getN1() {
System.out.println("getN1方法被调用 static"); // 1
return 100;
}
// 非静态方法
public int getN2() {
System.out.println("getN2方法被调用"); // 4
return 200;
}
public A() {
System.out.println("对象A创建"); // 5
}
}
package com.hspedu.codeblock_;
public class Course388 {
public static void main(String[] args) {
// 代码块细节 3
/*
* 5、构造器前隐藏了super(..);和调用非静态代码块,先执行super再执行非静态代码块
* 存在继承关系执行顺序:
* 父类静态 => 子类静态 => 父类非静态 => 父类构造器 => 子类非静态 => 子类的构造器
*
* */
new BBB();
}
}
class AAA {
{
System.out.println("AAA非静态代码块");
}
static {
System.out.println("AAA static block");
}
public AAA() {
System.out.println("创建AAA类对象");
}
}
class BBB extends AAA {
{
System.out.println("BBB非静态代码块");
}
static {
System.out.println("BBB static block");
}
public BBB() {
System.out.println("创建BBB类对象");
}
}
package com.hspedu.codeblock_;
public class Course389 {
public static void main(String[] args) {
// 代码块细节 3
/*
* 6、创建子类对象时,代码块执行顺序:
* (1)先执行父类的静态代码块和静态属性初始化
* (2)再执行子类的静态代码块和静态属性初始化
* (3)父类的普通代码块和普通属性初始化(父类非静态成员)
* (4)父类的构造器
* (5)子类的普通代码块和普通属性初始化(子类非静态成员)
* (6)子类的构造器
*
* 7、静态代码块只能调用静态成员,非静态代码块可以调用任意成员
* */
/*
* 创建对象:
* 1、进行类的加载
* 1.1先加载父类A02,再加载B02(静态代码块和静态属性初始化和类加载相关)
* 2、创建对象
* 2.1先执行非静态代码块和非静态属性初始化
* 2.2再执行构造器内的语法
* (有继承会执行super()方法)
* */
new B02();
System.out.println("====================");
new C02();
}
}
class A02 {
private static int n1 = getVal01();
static {
System.out.println("A02静态代码块"); // 2
}
{
System.out.println("A02非静态代码块"); // 5
}
public int n3 = getVal02();
public static int getVal01() {
System.out.println("getVal01"); // 1
return 10;
}
public int getVal02() {
System.out.println("getVal02"); // 6
return 10;
}
public A02() {
System.out.println("A02构造器执行"); // 7
}
}
class B02 extends A02 {
private static int n3 = getVal03();
static {
System.out.println("B02的静态代码块"); // 4
}
public int n5 = getVal04();
{
System.out.println("B02的非静态代码块"); // 9
}
public static int getVal03() {
System.out.println("getVal03"); // 3
return 10;
}
public int getVal04() {
System.out.println("getVal04"); // 8
return 10;
}
public B02() {
System.out.println("B02构造器执行"); // 10
}
}
class C02 {
private int n1 = 100;
private static int n2 = 200;
private void m1() {
}
private static void m2() {
}
// 静态代码块只能使用静态成员
static {
// System.out.println(n1);
System.out.println(n2);
// m1();
m2();
}
// 非静态代码块都可以调用
{
System.out.println(n1);
System.out.println(n2);
m1();
m2();
}
}