1. 程式人生 > >為什麼可以通過類名呼叫靜態方法?

為什麼可以通過類名呼叫靜態方法?

JVM載入類:
所有的類都是在對其第一次使用時,動態載入到JVM中的。當程式建立第一個類的靜態成員的引用時,就會載入這個類,進而可以得到該類的型別資訊,而型別資訊可以在程式執行時發現和使用型別資訊。這個證明構造器也是類的靜態方法,即使在構造器之前並沒有使用static關鍵字。因此,使用new操作符建立類的新物件也會被當做對類的靜態成員的引用。

為什麼通過類名可以呼叫靜態方法?
靜態變數在類的初始化一次後,系統就不會為該變數開闢新的記憶體空間。而每new一個類的物件,系統就會重新在堆記憶體中開闢一個新空間來存放該類的例項物件,並且棧中也會有一個新的引用變數去指向它。 靜態方法也是類似,但是有一點要強調,靜態方法只中不能呼叫非靜態方法。因為被static修飾的方法會首先被Classloader物件先載入進記憶體,而這個時候可能其它的非靜態方法或者變數還沒有被載入進來。

相關推薦

為什麼可以通過呼叫靜態方法?

JVM載入類: 所有的類都是在對其第一次使用時,動態載入到JVM中的。當程式建立第一個類的靜態成員的引用時,就會載入這個類,進而可以得到該類的型別資訊,而型別資訊可以在程式執行時發現和使用型別

static修飾變數的通過呼叫的測驗

package myHomework; public class D21_static { static int s=1512340101; public static void main(S

例項呼叫靜態方法(Java)

前言 第一次看到在Java中可以通過類例項呼叫靜態方法,當然不推薦這麼做,避免出現意想不到的問題,接下來會講到,但是在C#中通過類例項呼叫靜態方法在編譯時就不會通過,這裡做下記錄。 類例項呼叫靜態方法 首先我們來看一個簡單的例子說明為何不能通過類例項呼叫靜態方法,我們知道未例項化的物件去呼叫對應方法或者欄位時

靜態方法只能通過調用嗎?

作者 tail tails http source 方法調用 地址 new net 靜態方法調用的三種方式: 1、new xx().靜態(); //使用對象調用,不推薦2、xx.靜態(); //類名調用,正規調用方法,推薦 3、靜態(); //本類的靜態方法在本類調用,直

static{}(即static塊),會在被載入的時候執行且僅會被執行一次,一般用來初始化靜態變數和呼叫靜態方法

這裡是一個工具類,因為連線配置資訊只需要執行一次就行所以採用static塊 static塊會最先執行 package com.my.jedis; import java.io.IOException; import java.io.InputStream; import

ndk多執行緒需要獲取JNIEnv 或c通過+包建立物件使用如下方法

JavaVM* mJavaVM; static pthread_key_t mThreadKey; static void Android_JNI_ThreadDestroyed(void* value) { JNIEnv *env = (JNIEnv*)

C# 反射,通過方法調用方法

inf tle dba nbsp tel str ati param ren   在 C# 代碼中,有些時候只知道方法的名字(string),需要調用該方法,那麽就需要用到 C# 的反射機制。下面是一個簡單的 demo。 1 using System; 2

C#反射通過的字符串獲取生成對應的實例

.net cor 右鍵 名稱 () rgs 命名空間 color line 在.net core 1.1環境下 今天項目中遇到這個問題了,稍微查了一下並沒有現成的樣例。自己實現了。 1 static void Main(string[] args) 2

封裝一個通過獲取對象的函數

技術分享 由於 ges http 技術 通過 ie9 element html dom 由於HTML DOM 的getElementsByClassName()不兼容ie9以下瀏覽器,所以需要封裝一個通過類名獲取對象的函數getElementsByClass()。參數cla

使用形容詞給的命名方法

變量 類名 簡單 log 大寫 nts 鏈式 英語 cnblogs 程序命名有很多方法,也有很多爭論,有的人喜歡用下劃線分隔,有的人喜歡用大小寫分隔(駝峰),有人告訴你全局變量要全大寫,有的人說用g_作前綴。 我覺得重點不是大小寫或分隔符,而是使用不同詞性的詞來命名。 變量

異常處理流程圖+多線程Thread流程圖+非靜態方法調用

處理流 inf out com 分享 int private 靜態方法 ring 異常處理完整流程 main方法調用非靜態方法 public class Demo{   public static void main(String[] args){  

Python進階-----通過的內置方法__str__和__repr__自定制輸出(打印)對象時的字符串信息

對象 pre 信息 控制臺 定制 def -- 執行 ini __str__方法其實是在print()對象時調用,所以可以自己定義str字符串顯示信息,在該方法return一個字符串,如果不是字符串則報錯print(obj) 等同於-->str(obj) 等同於

靜態中,靜態方法靜態變數的執行順序按出現執行

package com.study; public class StaticCode { static { i = 33;// i's value is from 0 to 33 g(); } static int i = 1;

python中例項方法,例項屬性,方法屬性,靜態方法的總結

class Game(object): #歷史最高分 top_score = 0 def __init__(self,player_name): self.name = player_name @staticmethod def show

Java抽象中的靜態方法

抽象類中是可以有靜態方法的,在被子類繼承後可以通過子類的例項化物件呼叫;也可以直接通過抽象類和子類的類名來呼叫,就像其他的靜態方法一樣。同樣的靜態變數也可以使用相同的方法訪問。 例項: package classTest; abstract class Person0 { publi

C# 多執行緒呼叫靜態方法或者靜態例項中的同一個方法-方法內部的變數是執行緒安全的

 C#  多執行緒呼叫靜態方法或者靜態例項中的同一個方法-方法內部的變數是執行緒安全的       using System;using System.Threading;using System.Threading.Tasks;using Sys

反射:通過反射物件呼叫構造方法

import java.lang.reflect.Constructor; /** * @author 萬星明 * @version 建立時間:2018年10月26日 上午11:38:22 *

typeof(C# 參考)C# 反射 通過建立例項

C# 反射 通過類名建立類例項2011-12-24 上午 12:34“反射”其實就是利用程式集的元資料資訊。 反射可以有很多方法,編寫程式時請先匯入 System.Reflection 名稱空間,假設你要反射一個 DLL 中的類,並且沒有引用它(即未知的型別): A

C# 反射通過例項化

在面向物件程式設計的時候,會遇到這樣的問題,一個父類有多個子類,需要建立一個父類的物件,再後面根據條件去把該物件例項化具體的某個子類,然後進行操作。當然用if else 或者switch來做也可以,但是後期擴充套件性不好,特別是要把這些類封裝成dll提供給被人用

C#反射 獲取程式集資訊和通過建立例項

C#反射獲取程式集資訊和通過類名建立類例項 。 System.Reflection 名稱空間:包含通過檢查託管程式碼中程式集、模組、成員、引數和其他實體的元資料來檢索其相關資訊的型別。 Assembly 類:表示一個程式集,它是一個可重用、無版本衝突並且可自我描述的公共語言