1.コードブロックの機能:クラスとオブジェクトの初期化に使用されます
* 2.コードブロックが変更された場合、静的にしかできません。
* 3.分類:静的コードブロックと非静的コードブロック
*
* 4。静的コードブロック
*>内部に出力ステートメントがあります*>
クラスのロード時に実行され、1回だけ実行されます
*>機能:クラスの情報を初期化します
*>クラスに複数の静的コードブロックが定義されている場合、それらは宣言順に
実行*>静的コードブロックの実行は、非静的コードブロックの実行よりも優先する必要があります
*>静的コードブロックは、静的プロパティと静的メソッドのみを呼び出すことができ、非静的構造を呼び出すことはできません
*
* 5 。非静的コードブロック
*>内部は出力ステートメントを持つことができ
ます
*>オブジェクトの作成時に実行されます*>オブジェクトが作成されるたびに、非静的コードブロックが実行されます
*>機能:のプロパティを初期化できますオブジェクト作成時のオブジェクト
*>クラスで定義されている場合複数の非静的コードブロックが宣言順に実行され
ます*>静的プロパティ、静的メソッド、または非静的プロパティと非静的メソッドを非静的で呼び出すことができます静的コードブロック
public class BlockTest {
public static void main(String[] args) {
String desc = Person.desc;
System.out.println(desc);
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1.age);
Person.info();
}
}
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("hello, block - 2");
}
{
System.out.println("hello, block - 1");
//调用非静态结构
age = 1;
eat();
//调用静态结构
desc = "我是一个爱学习的人1";
info();
}
//static的代码块
static{
System.out.println("hello,static block-2");
}
static{
System.out.println("hello,static block-1");
//调用静态结构
desc = "我是一个爱学习的人";
info();
//不可以调用非静态结构
// eat();
// name = "Tom";
}
//方法
public void eat(){
System.out.println("吃饭");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public static void info(){
System.out.println("我是一个快乐的人!");
}
}
こんにちは、静的ブロック-2
こんにちは、静的ブロック-1
私は幸せな人です!
私は
こんにちは、ブロック2
こんにちは、ブロック1
食べることを学ぶのが大好き
な人です。私は幸せな人です!
こんにちは、ブロック2
こんにちは、ブロック1
食べる
私は幸せな人です!
1
私は幸せな人です!
父と息子から、最初は静的
//总结:由父及子,静态先行
class Root{
static{
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root(){
super();
System.out.println("Root的无参数的构造器");
}
}
class Mid extends Root{
static{
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid(){
super();
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();
}
}
ルートの静的初期化ブロック
Midの静的初期化ブロック
Leafの静的初期化ブロック
ルートの通常の初期化ブロック
ルートのパラメーターなしコンストラクター
Midの通常の初期化ブロック
Midのパラメーターなしコンストラクター
Midのパラメーターなしコンストラクター、そのパラメーター値:シリコンバレー
リーフの通常の初期化ブロック
Leafコンストラクタールートの通常の初期化ブロック
ルートの非パラメーターコンストラクター
Midの通常の初期化ブロック
Midのパラメーターなしコンストラクター
Midのパラメーターコンストラクター、そのパラメーター値:
通常の初期化ブロックシリコンバレーリーフの
リーフコンストラクター
class Father {
static {
System.out.println("11111111111");
}
{
System.out.println("22222222222");
}
public Father() {
System.out.println("33333333333");
}
}
public class Son extends Father {
static {
System.out.println("44444444444");
}
{
System.out.println("55555555555");
}
public Son() {
System.out.println("66666666666");
}
public static void main(String[] args) { // 由父及子 静态先行
System.out.println("77777777777");
System.out.println("************************");
new Son();
System.out.println("************************");
new Son();
System.out.println("************************");
new Father();
}
}
11111111111
44444444444
77777777777
************************
22222222222
33333333333
55555555555
66666666666
******************* *****
22222222222
33333333333
55555555555
66666666666
************************
22222222222
33333333333