java 非静态 初始化_Java非静态代码块和实例初始化过程
1 非靜態代碼塊
非靜態代碼塊特點
①可以為實例變量(非靜態的屬性)初始化
②每次創建對象的時候,都會執行一次,且先于構造器執行
③若有多個非靜態的代碼塊,那么按照定義的順序從上到下依次執行
④代碼塊中既可以調用非靜態的變量和方法,也可以可以調用靜態的變量和方法
測試代碼:
public class BlockTest {
public static void main(String[] args) {
MyClass my1 = new MyClass();
//MyClass my2 = new MyClass("java");
}
}
class MyClass {
private String str;
{
System.out.println("非靜態代碼塊1");
}
public MyClass() {
System.out.println("無參構造");
}
public MyClass(String str) {
this.str = str;
System.out.println("有參構造");
}
{
System.out.println("非靜態代碼塊2");
}
}
運行結果:
非靜態代碼塊1
非靜態代碼塊2
無參構造
2 實例初始化
實例初始化過程:創建對象時,為對象進行初始化的操作
①為成員變量顯式賦值
②執行非靜態代碼塊
③執行構造器
Java編譯器會把這三個部分的代碼,合成一個叫做 ([形參列表]) 實例初始化方法
即編譯后的.class字節碼信息中,是沒有構造器這個概念。
([形參列表]) 實例初始化方法的代碼就是由三個部分組成:
①成員變量顯式賦值的代碼
②非靜態代碼塊中的代碼
③構造器中的代碼
其中①和②按定義順序依次執行,③最后執行。
而且,有幾個構造器,就會有幾個實例初始化方法。那么當你創建對象的時候,調用對應的構造器時,其實執行的是對應的實例初始化方法 ([形參列表])
代碼示例:
public class InitTest {
public static void main(String[] args) {
Demo d1 = new Demo();
//Demo d2 = new Demo("java");
}
}
class Demo{
{
System.out.println("非靜態代碼塊1");
}
private String str = assign();//調用方法,為str進行顯式賦值
public Demo(){
System.out.println("無參構造");
}
public Demo(String str){
this.str = str;
System.out.println("有參構造");
}
{
System.out.println("非靜態代碼塊2");
}
public String assign(){
System.out.println("為成員變量賦值");
return "hello";
}
}
3 子類實例初始化
(1)先執行父類的實例初始化方法
它由三部分組成:
成員變量的顯式賦值
非靜態代碼塊
構造器
(2)再執行子類的實例初始化方法
它由三部分組成:
成員變量的顯式賦值
非靜態代碼塊
構造器
super()或super(實參列表) 表面是調用父類的構造器,其實是調用父類對應的實例初始化方法
super()或super(實例列表) 表面是在子類構造器的首行,其實是在子類實例初始化方法的首行
代碼示例:
public class InitTest2 {
public static void main(String[] args) {
Son s = new Son();
}
}
class Father {
private String strFather = assignFather();
{
System.out.println("父類的非靜態代碼塊");
}
public Father(){
System.out.println("父類的無參構造");
}
public String assignFather(){
System.out.println("父類的assignFather()");
return "father";
}
}
class Son extends Father {
private String strSon = assignSon();
{
System.out.println("子類的非靜態代碼塊");
}
public Son(){
//super() ==> 調用父類的實例初始化方法,而且它在子類實例初始化方法的首行
System.out.println("子類的無參構造");
}
public String assignSon(){
System.out.println("子類的assignSon()");
return "son";
}
}
運行結果:
父類的assignFather()
父類的非靜態代碼塊
父類的無參構造
子類的assignSon()
子類的非靜態代碼塊
子類的無參構造
子類為成員變量顯式賦值方法重寫父類顯式賦值方法時,調用的子類重寫的方法,代碼示例:
public class InitTest3 {
public static void main(String[] args) {
Son s = new Son();
}
}
class Father {
private String strFu = assign();
{
System.out.println("父類的非靜態代碼塊");
}
public Father(){
System.out.println("父類的無參構造");
}
public String assign(){
System.out.println("父類的assign()");
return "father";
}
}
class Son extends Father {
private String strSon = assign();
{
System.out.println("子類的非靜態代碼塊");
}
public Son(){
//super() ==>調用父類的實例初始化方法,而且它在子類實例初始化方法的首行
System.out.println("子類的無參構造");
}
public String assign(){
System.out.println("子類的assign()");
return "son";
}
}
運行結果:
子類的assign()
父類的非靜態代碼塊
父類的無參構造
子類的assign()
子類的非靜態代碼塊
子類的無參構造
總結
以上是生活随笔為你收集整理的java 非静态 初始化_Java非静态代码块和实例初始化过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 收到一个机器人txt微盘_经阁-第一章
- 下一篇: 两表格合并_六个高效办公Excel小技巧