摘要:三類的初始化時機類的初始化即虛擬機為類的靜態(tài)變量賦予初始值這和準備階段設(shè)置默認初始值為是不一樣的。類的主動使用種創(chuàng)建類的實例用語句創(chuàng)建實例調(diào)用類的靜態(tài)變量或?qū)o態(tài)變量賦值這和是有區(qū)別的在定義一個類的時候里面只能放方法和屬性,這是規(guī)定死了的。
一般在進行分析的時候,會從三個方面進行分析:類、方法(構(gòu)造方法、成員方法)、變量(成員變量(靜態(tài)變量、實例變量)、局部變量)。
一、static修飾符:被static修飾的變量和方法,被類的所有實例所共享。加載類時只分配一次內(nèi)存。
靜態(tài)變量:可以直接通過類名來訪問 Person.a;
靜態(tài)方法:可以直接通過類名來訪問 Person.say();靜態(tài)方法內(nèi),可以訪問靜態(tài)變量,但是不能使用this關(guān)鍵字且不能訪問實例變量,因為被所有實例所共有,無法判斷屬于哪個實例對象
靜態(tài)代碼塊:java虛擬機在加載類時就執(zhí)行代碼塊
二、final修飾符:有final修飾表示最終(不可再修改)的意思:
final類:不能被繼承(即沒有子類);
final方法:不能被子類的方法覆蓋(final不用來修飾構(gòu)造方法,父類與子類之間的構(gòu)造方法不存在覆蓋關(guān)系,final修飾是沒有意義的);
final修飾的變量:即常量,常量只能被賦值一次,之后不能改變。
靜態(tài)常量屬于編譯時常量(final static int a=2*3;在編譯的時就能計算出具體的值),在編譯的時候?qū)⑦@個值就放入到常量池中,a被訪問時類是不會被初始化的(這是類的被動使用)。訪問類的靜態(tài)變量或靜態(tài)方法的時候類會被初始化(這是類的主動使用)。而靜態(tài)變量只會在類初始化的時候才會被賦值)。具體細節(jié)請參考“類的生命周期”---加載(堆區(qū)、方法區(qū))--連接(驗證、準備(靜態(tài)變量分配內(nèi)存、設(shè)置默認初始值為0)、解析(符號引用替換為直接引用,即指針指向方法區(qū)的內(nèi)存位置))--初始化(程序?qū)︻惢蚪涌?b>主動使用的時候才會被初始化。
類的初始化即java虛擬機為類的static靜態(tài)變量賦予初始值(這和準備階段設(shè)置默認初始值為0是不一樣的)。只有類的主動使用才會初始化類。
1.類的主動使用(6種):創(chuàng)建類的實例:用new語句創(chuàng)建實例 Person ps=new Person();
調(diào)用類的靜態(tài)變量或?qū)o態(tài)變量賦值:
public class Person{ static int a=2*3; //這和final static int a=2*3;是有區(qū)別的 static{ //Java在定義一個類的時候里面只能放方法和屬性,這是規(guī)定死了的。System.out.println()是在調(diào)用一個叫println的函數(shù),這里是函數(shù)的調(diào)用而不是類里面定義一個函數(shù)。所以需要用static代碼塊 System.out.println("init Person"); //static聲明的靜態(tài)代碼塊,使得類在初始化的時候會被調(diào)用而不需要創(chuàng)建實例對象。它這時候就不在任何一個方法中。 } }
調(diào)用的時候?qū)懀?/p>
System.out.println("a="+Person.a); //這樣就可以在不new一個Person實例的情況下,來初始化Person類了。
調(diào)用類的靜態(tài)方法
調(diào)用java API中的反射方法:Class.forName("Person");
初始化子類的時候會先初始化父類(但"父類"是接口的時候,不會先初始化它所實現(xiàn)的接口的,只有在程序在使用接口的靜態(tài)變量時才會使靜態(tài)接口初始化)
java虛擬機啟動時被標明為啟動類的類
2.類的被動使用:
final類型的靜態(tài)變量在編譯的時候能計算出值(即編譯時常量,在編譯的時候?qū)⑦@個值就放入到常量池中了):
注: final類型的靜態(tài)變量在編譯的時候不能計算出變量的值(即運行時常量)的時候是會被初始化的
final static int a=2*3; //變量a是編譯時常量 final static int a=(int)Math.random(); //變量a不是是編譯時常量(即運行時常量)
"父類"是接口的時候,不會先初始化它所實現(xiàn)的接口的,只有在程序在使用接口的靜態(tài)變量時才會使靜態(tài)接口初始化
ClassLoader類的loadClass("Person")方法的時候,只是對類的加載,不是初始化。Class.forName("Person");才會初始化
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68862.html
摘要:三類的初始化時機類的初始化即虛擬機為類的靜態(tài)變量賦予初始值這和準備階段設(shè)置默認初始值為是不一樣的。類的主動使用種創(chuàng)建類的實例用語句創(chuàng)建實例調(diào)用類的靜態(tài)變量或?qū)o態(tài)變量賦值這和是有區(qū)別的在定義一個類的時候里面只能放方法和屬性,這是規(guī)定死了的。 一般在進行分析的時候,會從三個方面進行分析:類、方法(構(gòu)造方法、成員方法)、變量(成員變量(靜態(tài)變量、實例變量)、局部變量)。 一、static修...
摘要:程序入口方法淺析方法的方法簽名方法簽名講解修飾符類由虛擬機調(diào)用,為了沒有限制可以自由的調(diào)用,所以采用修飾符。返回值主方法被調(diào)用,將返回值返回給沒有任何意義,因此該方法沒有返回值,所以使用。 java程序入口main()方法淺析 main()方法的方法簽名 public static void main(String[] args) 方法簽名講解 ?public修飾符:java類由jav...
摘要:應(yīng)用在修飾類名,類成員,方法,參數(shù),構(gòu)造器中。接口修飾符構(gòu)造器修飾符方法修飾符字段修飾符參數(shù)修飾符最基本的修飾符作用在類上當(dāng)此修飾符修飾類。作用在構(gòu)造器上在構(gòu)造器上,只允許使用三種修飾符,。當(dāng)此修飾符修飾構(gòu)造器。 1、什么是修飾符? 指的是一種標識類型以及類型成員的訪問范圍的聲明。 應(yīng)用在修飾類名,類成員,方法,參數(shù),構(gòu)造器中。 2、修飾符的有幾種? ...
摘要:使用創(chuàng)建的字符串對象是運行時創(chuàng)建出來的,它被保存在運行時內(nèi)存區(qū),即堆內(nèi)存,不會放入常量池中。類成員創(chuàng)建的對象實例中根本不會擁有對應(yīng)類的類變量。抽象類的構(gòu)造器不能用于創(chuàng)建實例,主要是用于被其子類調(diào)用。 Java提供了final關(guān)鍵字來修飾變量,方法和類,系統(tǒng)不允許為final變量重新賦值,子類不允許覆蓋父類的final方法,final類不能派生子類。 Abstract 和 inte...
類的更多方面 本節(jié)介紹依賴于使用對象引用的類的更多方面以及你在前面的對象部分中了解到的點運算符。 從方法返回值 方法返回到調(diào)用它的代碼。 完成方法中的所有語句。 到達return語句。 或拋出異常(稍后介紹)。 以先發(fā)生者為準。 你在方法聲明中聲明方法的返回類型,在方法體內(nèi),使用return語句返回值。 聲明為void的任何方法都不返回值,它不需要包含return語句,但它可能會這樣做,在這種...
閱讀 607·2021-11-18 13:12
閱讀 1323·2021-11-15 11:39
閱讀 2484·2021-09-23 11:22
閱讀 6220·2021-09-22 15:15
閱讀 3668·2021-09-02 09:54
閱讀 2320·2019-08-30 11:10
閱讀 3252·2019-08-29 14:13
閱讀 2918·2019-08-29 12:49