类:属性、方法、构造器、代码块
package com.test1.java;
/*
* 1.代码块作用:用来初始化类、对象
* 2.如果有修饰,只能用static
* 3.静态代码块vs非静态代码块
* 4.静态代码块
* 内部可以有输出语句
* 随着类加载而执行,只执行一次(只加载一次类)
* 作用:初始化类的信息
* 多个静态代码块,按照声明顺序执行
* 静态代码块优先于非静态执行
* 5.非静态代码块
* 内部可以有输出语句
* 随着对象创建而执行
* 每创建一个对象,就执行一次代码块
* 多个非静态代码块,按照声明顺序执行
* 作用:在创建对象时,对对象属性初始化
*/
public class BlockTest {
public static void main(String[] args) {
String desc = Person.desc;//输出:staticblock。∵加载类,静态代码块也被加载并执行,但静态方法加载不执行
System.out.println(desc);//输出:爱学习
Person person = new Person();//输出:block。随着对象创建而执行
Person person1 = new Person();//输出:block。随着对象创建而执行
System.out.println(person.age);//输出为1
String desc1 = Person.desc;//无输出,静态代码块只执行一次
}
}
class Person{
//属性
String name;
int age;
static String desc = "我是一个人";
//构造器
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//非静态代码块
{
System.out.println("block");
age = 1;
}
//静态代码块
static{
System.out.println("static block");
desc = "爱学习";
}
//方法
public void eat() {
System.out.println("吃饭");
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age + "]";
}
public static void show() {
System.out.println("hello");
}
}
例子分析
一
加载LeafTest类------new Leaf()-----public Lesf()-------super(“哈哈”)------public Mid(“哈哈”)-----this()-------public Mid()-----super()------public Root()------super()------Object类------Object类中的静态代码块+Root静态代码块+Mid静态代码块+Leaf静态代码块--------main()------new Leaf()-----public Lesf()-------super(“哈哈”)------public Mid(“哈哈”)-----this()-------public Mid()-----super()------public Root()----------super()------Object类------Object类中的非静态代码块和相关语句------Root类中的非静态代码块和相关语句(代码块优先方法执行)-----Root类中的非静态代码块和相关语句-----Leaf类中的非静态代码块和相关语句
package com.test1.java;
class Root{
static {
System.out.println("Root的静态代码块");
}
{
System.out.println("Root的非静态代码块");
}
public Root() {
System.out.println("Root的无参构造器");
}
}
class Mid extends Root{
static {
System.out.println("Mid的静态代码块");
}
{
System.out.println("Mid的非静态代码块");
}
public Mid() {
System.out.println("Mid的无参构造器");
}
public Mid(String msg) {
this();
System.out.println("Mid的带参构造器:" + msg);
}
}
class Leaf extends Mid{
static {
System.out.println("Leaf的静态代码块");
}
{
System.out.println("Leaf的非静态代码块");
}
public Leaf() {
super("哈哈");
System.out.println("Leaf的无参构造器");
}
}
public class LeafTest {
public static void main(String[] args) {
new Leaf();
}
}
输出结果
二
package com.test1.java;
class Father {
static {
System.out.println("1111111");
}
{
System.out.println("222222");
}
public Father() {
System.out.println("33333");
}
}
public class Son extends Father{
static {
System.out.println("4444444");
}
{
System.out.println("555555");
}
public Son() {
System.out.println("666666");
}
public static void main(String[] args) {
System.out.println("777777");
System.out.println("*********");
new Son();
}
}