类的成员四:代码块(或初始快)
1.代码块的作用:用来初始化类、对象
2.代码块如果有修饰,只可以使用static来修饰
3.即分为静态代码块 和 非静态代码块
4.静态代码块 static {.....}
- 内部可以有输出语句
- 随着类的加载而执行,而且只执行一次
- 如果一个类中定义了多个静态代码块,则按照他们声明的顺序来执行
- 静态代码块的执行要先于非静态代码块的执行
- 作用:初始化类的信息
- 静态代码块内只能调用静态属性和静态方法,不能调用非静态的属性和方法
5.非静态代码块 {....}
- 内部可以有输出语句
- 随着对象的创建而执行
- 每创建一个对象,就执行一次非静态代码块
- 如果一个类中定义了多个非静态代码块,也按照他们声明的顺序来执行
- 作用:可以在创建对象时,对对象的属性等初始化
- 非静态代码块既可以调用静态的属性和方法,又可以调用非静态的属性和方法
对属性可以赋值的位置
①默认初始化
②显式初始化
③构造器中初始化
④有了对象以后,可以通过 “对象.属性”或 “对象.方法” 的方式进行赋值
⑤在代码块里赋值
属性先后赋值顺序:① ----->② / ⑤------->③------>④
执行顺序:由父及子,静态先行
package com.hlq.daimakuai;
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调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:"
+ msg);
}
}
class Leaf extends Mid{
static{
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf(){
//通过super调用父类中有一个字符串参数的构造器
super("尚硅谷");
System.out.println("Leaf的构造器");
}
}
public class LeafTest{
public static void main(String[] args){
new Leaf();
System.out.println();
new Leaf();
}
}
代码练习:
package com.hlq.daimakuai;
public class BlockTest {
public static void main(String[] args) {
String desc = Person.desc;
System.out.println(desc);
Person p1 = new Person();
}
}
class Person{
String name;
int age;
static String desc = "我是一个人";
//构造器
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
//静态代码块
static{
System.out.println("wei li li da han han!!!");
desc = "我是一个热爱学习的好青年";
info();
// eat();
// age = 10;错误的 不能调用非静态属性和方法
}
{
System.out.println("wei li li da han han?????????");
info();
eat();
age = 10;
}
//方法
public void eat(){
System.out.println("魏丽丽吃屁");
}
public static void info(){
System.out.println("魏丽丽是个大傻子");
}
}
main()方法的说明:
- main()方法作为程序入口
- main()方法也是一个普通的静态方法
- main()也可以作为我们与控制台交互的一种方式 (之前都是使用Scanner)