电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解java中的static關鍵字

瀏覽:87日期:2022-08-30 17:18:08

Java中的static關鍵字可以用于修飾變量、方法、代碼塊和類,還可以與import關鍵字聯合使用,使用的方式不同賦予了static關鍵字不同的作用,且在開發中使用廣泛,這里做一下深入了解。

靜態資源(靜態變量與靜態方法)

被static關鍵字修飾的變量和方法統一屬于類的靜態資源,是類實例之間共享的。被static關鍵字修飾的變量、方法屬于類變量、類方法,可以通過【類名.變量名】、【類名.方法名】直接引用,而不需要派生一個類實例出來。

靜態資源分類存放的好處

JDK把不同的靜態資源放在了不同的類中而不是把所有的靜態資源放在一個類里面,這樣做主要有3點好處:

1.不同的類有自己的靜態資源,就可以實現靜態資源分類。比如,和數學相關的靜態資源就放在了java.lang.Math中,和日歷相關的靜態資源就放在java.util.Calendar中,將組織形式固定為【類>靜態資源】,使得代碼的邏輯結構變得清晰。

2.因為靜態資源的組織形式固定為了【類>靜態資源】的形式,也就有效避免的靜態資源在全局重名的問題。比如在A類中有一個name屬性,B類中也有一個name屬性,如果放在一起會重復,但是分類放開則不會重復了,因為實際上這兩個屬性的全名是A.name和B.name。

3.分類有助于避免因為靜態資源都放在一個類中導致該類體積過大的問題,方便了管理與協同維護。

靜態資源容易混淆的三個點

靜態資源的知識點比較簡單,但是還是有三點比較容易混淆:靜態方法能不能引用非靜態資源?靜態方法能不能引用靜態資源?非靜態方法能不能引用靜態資源?要弄明白這三個問題,就要先了解靜態資源在JVM中的加載機制。

實際上,雖然說靜態資源是屬于類的,但在JVM中卻是獨立于類的存在。因為從JVM類加載機制的角度來講,靜態資源是類初始化的時候加載的,而非靜態資源則是派生類的時候才加載的。類的初始化早于類的派生(new)。比如,在Class.forName('xxx')方法中,就是初始化了一個類,但是并不是派生出一個實例,而只是加載了這個類中的靜態資源。因此對于一個靜態資源來說,它是不可能知道一個類中有哪些非靜態資源的。但是對于非靜態資源來說就不一樣了,由于它是派生實例之后才產生的,因此屬于類的這些東西它都能識別得到。至此,上面三個問題的答案已經呼之欲出了:

1.靜態方法能不能引用非靜態資源?答案是不能,非靜態資源是派生實例之后才產生的,對于在初始化階段就存在的靜態資源來說,根本識別不到。

2.靜態方法能不能引用靜態資源?答案是可以,因為靜態資源都是在類初始化的時候一同加載的,自然都能互相識別得到。

3.非靜態方法能不能引用靜態資源?答案是可以,因為非靜態方法就是實例方法,在派生類實例之后產生,而靜態資源已經在類初始化的時候已經存在了,自然能在引用靜態資源的時候成功識別。

靜態塊

靜態塊也是static關鍵字的重要應用之一,作用是初始化一個類的時候做特定的操作。和靜態變量、靜態方法同樣,靜態塊里面的代碼只會執行一次,且只在初始化類的時候執行。靜態塊同樣很簡單,只有三個小細節要特別提及:

靜態資源的加載順序是嚴格按照靜態資源的定義順序來加載的。

public class A{ private static int a = B(); static { System.out.println('進入A類的靜態塊'); } public static void main(String[] args) { new A(); } public static int B() { System.out.println('進入A類靜態變量a.B()靜態方法中'); return 1; }}

在這里,因為靜態變量a的定義順序在靜態塊之前,因此在a先被初始化的時候靜態方法B先于靜態塊被調用執行,打印的結果是:

進入A類靜態變量a.B()靜態方法中進入A類的靜態塊

靜態代碼塊對于定義在它之后的靜態變量,可以賦值,但是不能訪問。

public class A{ static { c = 3; System.out.println(c); } private static int c;}

上面這段代碼會在第6行報錯:Cannot reference a field before it is defined。這個特性理解起來可能比較奇怪,個人的理解是給靜態方法賦值并不是實時的,Java遇到賦值語句的時候會先將這些個賦值語句緩存起來,等所有靜態資源都識別完成之后再統一進行賦值。

靜態代碼塊是嚴格按照父類靜態代碼塊->子類靜態代碼塊的順序加載的,且只加載一次。

public class A{ static { System.out.println('A類的靜態代碼塊'); } public A() { System.out.println('A類的構造器'); }}

public class B extends A{ static { System.out.println('B類的靜態代碼塊'); } public B() { System.out.println('B類的構造器'); } public static void main(String[] args) { new B(); new B(); }}

上面代碼的結果是:

A類的靜態代碼塊B類的靜態代碼塊A類的構造器B類的構造器A類的構造器B類的構造器

靜態內部類

一般情況下,static是關鍵字是不能用于修飾類的,只有在該類是內部類的情況下才能使用static修飾,且只能修飾一個,這樣的內部類被稱為靜態內部類(匿名內部類)。靜態內部類只有在一些特殊的場景中才能用得上,比如像線程池ThreadPoolExecutor中的四種拒絕機制CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy就是靜態內部類。

與import關鍵字聯合使用

import static是JDK1.5之后的新特性,這兩個關鍵字聯合使用可以指定導入某個類中的指定靜態資源,并且不需要使用類名.資源名,可以直接使用資源名。

import static java.lang.Math.*;public class A{ public static void main(String[] args) { System.out.println(sin(2.2)); }}

這么寫意味著導入了java.lang.Math包下的所有靜態資源,因此在main函數里就可以直接使用sin(2,2)而不需要使用Math.sin(2,2)了。另外使用這種語法要特別注意的是,這里要寫import static java.lang.Math.*,最后的【.*】不可少,有了這兩個字符才意味著導入的是Math下的所有靜態資源,寫成import static java.lang.Math是有問題的。當然,我們也可以指定只導入某個靜態資源,比如只導入Math下sin這個方法而不導入Math下的所有靜態資源。

import static java.lang.Math.sin;public class A{ public static void main(String[] args) { System.out.println(sin(2.2)); }}

使用import static這樣的語法可以有效簡化一些操作,比如在頻繁使用Math類下靜態資源的地方可以少寫很多【Math.】,但是這樣卻降低了代碼的可讀性,因為這樣就模糊了該靜態資源的來源,弱化了分類的概念。

以上就是詳解java中的static關鍵字的詳細內容,更多關于java static關鍵字的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 杭州厂房降温,车间降温设备,车间通风降温,厂房降温方案,杭州嘉友实业爽风品牌 | 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 皮带输送机-大倾角皮带输送机-皮带输送机厂家-河南坤威机械 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 螺旋叶片_螺旋叶片成型机_绞龙叶片_莱州源泽机械制造有限公司 | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 动物解剖台-成蚊接触筒-标本工具箱-负压实验台-北京哲成科技有限公司 | 伟秀电气有限公司-10kv高低压开关柜-高低压配电柜-中置柜-充气柜-欧式箱变-高压真空断路器厂家 | 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 交通信号灯生产厂家_红绿灯厂家_电子警察监控杆_标志杆厂家-沃霖电子科技 | 客服外包专业服务商_客服外包中心_网萌科技 | 二次元影像仪|二次元测量仪|拉力机|全自动影像测量仪厂家_苏州牧象仪器 | 馋嘴餐饮网_餐饮加盟店火爆好项目_餐饮连锁品牌加盟指南创业平台 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 成都租车_成都租车公司_成都租车网_众行宝 | 温控器生产厂家-提供温度开关/热保护器定制与批发-惠州市华恺威电子科技有限公司 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 光环国际-新三板公司_股票代码:838504 | pbt头梳丝_牙刷丝_尼龙毛刷丝_PP塑料纤维合成毛丝定制厂_广州明旺 | 防弹玻璃厂家_防爆炸玻璃_电磁屏蔽玻璃-四川大硅特玻科技有限公司 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 紫外线老化试验箱_uv紫外线老化试验箱价格|型号|厂家-正航仪器设备 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 球磨机,节能球磨机价格,水泥球磨机厂家,粉煤灰球磨机-吉宏机械制造有限公司 | 镀锌角钢_槽钢_扁钢_圆钢_方矩管厂家_镀锌花纹板-海邦钢铁(天津)有限公司 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | 防水套管-柔性防水套管-刚性防水套管-上海执品管件有限公司 | 塑料托盘厂家直销-吹塑托盘生产厂家-力库塑业【官网】 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 |