1. 程式人生 > >static靜態方法和靜態變數用法

static靜態方法和靜態變數用法

static 是定義一個靜態物件或靜態變數,關於static 定義的變數或類方法有什麼特性我們看完本文章的相關例項後就見分曉了。

1.建立物件$object = new Class(),然後使用”->”呼叫:$object->attribute/function,前提是該變數/方法可訪問。

2. 直接呼叫類方法/變數:class::attribute/function,無論是靜態/非靜態都可以。但是有前提條件:

A. 如果是變數,需要該變數可訪問。

B. 如果是方法,除了該方法可訪問外,還需要滿足:

b1) 如果是靜態方法,沒有特殊條件;

b2) 如果是非靜態方法,需要改方法中沒有使用$this,即沒有呼叫非靜態的變數/方法,當然,呼叫靜態的變數/方法沒有問題。

然後我們再看一下使用$object->… 和使用class::… 都有什麼區別:

1.使用$object->… ,需要執行建構函式建立物件;

2. 使用class::… 呼叫靜態方法/變數,不需要執行建構函式建立物件;

3. 使用class::… 呼叫非靜態方法/變數,也不需要執行建構函式建立物件。

然後奇怪的地方就出來了,既然2和3都一樣,那靜態方法/變數存在還有什麼意義呢?

靜態 static

宣告類成員或方法為 static ,就可以不例項化類而直接訪問,不能通過一個物件來訪問其中的靜態成員(靜態方法除外)。靜態成員屬於類,不屬於任何物件例項,但類的物件例項都能共享。

例子:

程式碼如下

<?php

Class Person{

// 定義靜態成員屬性

public static $country = "中國";

// 定義靜態成員方法

public static function myCountry() {

// 內部訪問靜態成員屬性

echo "我是".self::$country."人<br />";

}

}

class Student extends Person {

function study() {

echo "我是". parent::$country."人<br />";

}

}

// 輸出成員屬性值

echo Person::$country."<br />"; // 輸出:中國

$p1 = new Person();

//echo $p1->country; // 錯誤寫法

// 訪問靜態成員方法

Person::myCountry(); // 輸出:我是中國人

// 靜態方法也可通過物件訪問:

$p1->myCountry();

// 子類中輸出成員屬性值

echo Student::$country."<br />"; // 輸出:中國

$t1 = new Student();

$t1->study(); // 輸出:我是中國人

?>

執行該例子,輸出:

中國

我是中國人

我是中國人

中國

我是中國人

小結

在類內部訪問靜態成員屬性或者方法,使用 self::(注意不是 $slef),如:

程式碼如下

slef:: $country

slef:: myCountry()

在子類訪問父類靜態成員屬性或方法,使用 parent::(注意不是 $parent),如:

程式碼如下

parent:: $country

parent:: myCountry()

外部訪問靜態成員屬性和方法為 類名/子類名:: ,如:

程式碼如下

Person::$country

Person::myCountry()

Student::$country

但靜態方法也可以通過普通物件的方式訪問。

例子 宣告靜態變數

程式碼如下

<?PHP

function foo(){

static $int = 0;// correct

static $int = 1+2; // wrong (as it is an expression)

static $int = sqrt(121); // wrong (as it is an expression too)

$int++;

echo $int;

}

?>

例子 使用靜態變數的例子

程式碼如下

<?PHP

function Test()

{

static $w3sky = 0;

echo $w3sky;

$w3sky++;

}

?>

現在,每次呼叫 Test() 函式都會輸出 $w3sky 的值並加一。

靜態變數也提供了一種處理遞迴函式的方法。遞迴函式是一種呼叫自己的函式。寫遞迴函式時要小心,因為可能會無窮遞迴下去。必須確保有充分的方法來中止遞迴。一下這個簡單的函式遞迴計數到 10,使用靜態變數 $count 來判斷何時停止:

例子 靜態變數與遞迴函式

程式碼如下

<?PHP

function Test()

{

static $count = 0;

$count++;

echo $count;

if ($count < 10) {

Test();

}

$count--;

}

?>

注: 靜態變數可以按照上面的例子宣告。如果在宣告中用表示式的結果對其賦值會導致解析錯誤

相關推薦

static靜態方法靜態變數用法

static 是定義一個靜態物件或靜態變數,關於static 定義的變數或類方法有什麼特性我們看完本文章的相關例項後就見分曉了。 1.建立物件$object = new Class(),然後使用”->”呼叫:$object->attribute/funct

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

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

靜態方法靜態變數(總結)

1.static方法是類中的一個成員方法,屬於整個類,即使不用建立任何物件也可以直接呼叫! static內部只能出現static變數和其他static方法!而且static方法中還不能使用this....等關鍵字..因為它是屬於整個類! 2.靜態方法效率上要比例項化高,靜態方法的缺點是不自動

C#中的靜態方法靜態變數的一些總結

方法: static 修飾符的方法為靜態方法,反之則是非靜態方法 靜態成員屬於類所有,非靜態成員屬於類的例項所有,無論類建立了多少例項,類的靜態成員在記憶體中只佔同一塊區域。(所有該類的例項都共享這個類的靜態成員) C#靜態方法屬於類所有,類例項化前即可使用,靜態方法只能訪

類中靜態方法靜態變數靜態程式碼塊,構造方法,以及被@PostConstruct修飾的方法執行順序

第一種:當直接呼叫(沒有new物件)靜態方法時候:程式碼塊(靜態變數按照順序)就執行—–方法執行。 第二種建立物件:執行父類靜態程式碼—-執行子類的靜態程式碼—-執行父類構造方法—–執行子類的構造

Vue2.x源碼學習筆記-Vue靜態方法靜態屬性整理

temp next 技術 spa delet 結構 又是 靜態 https Vue靜態方法和靜態屬性,其實直接在瀏覽器中可以查看到的,如下 圈起來的是其靜態屬性,但是有的屬性對象中的屬性的值又是函數。未圈起來的則是函數。 其實它來自如下各個目錄下的js文件 // src

jdk1.8新特性 : 接口中可以有普通方法(非靜態方法)靜態方法 , 顛覆了之前我的理解 : 接口中只能有共有常量抽象方法的概念,後面必須要加一句jdk1.71..7之前

@override 編譯 sys 接口 blank new style nts highlight 看到jdk某些接口中存在default方法,於是... http://shaomeng95.iteye.com/blog/998820 為什麽接口只能是公有常量? p

php中靜態方法靜態屬性的介紹

靜態屬性 size col 實例 生效 訪問類 都是 靜態 self 靜態分為兩個部分:靜態屬性和靜態方法 靜態的東西都是給類用的(包括類常量),非靜態的都是給對象用的 靜態屬性 在定義屬性的時候,使用關鍵字static修飾的屬性稱之為靜態屬性。 靜態方法 使用sta

JAVA基礎(50)---靜態方法靜態程式碼塊

靜態方法                       用static修飾的方法。靜

【PHP】靜態方法呼叫非靜態方法靜態呼叫非靜態方法程式碼解讀

static 關鍵字用來修飾屬性、方法,稱這些屬性、方法為靜態屬性、靜態方法。 在類的靜態方法中是不能直接以$this->test()的方式呼叫非靜態方法的。還有框架中靜態的呼叫非靜態方法是怎麼回事??? 。。。 算了,不知道說啥 具體為啥看程式碼註釋: <?ph

ES6 - 類的靜態方法靜態屬性

一、靜態方法 類的所有方法都定義在類的prototype屬性上面,所有類中定義的方法都會被例項繼承,如果在類方法前面加上static關鍵字就不會被例項繼承了。 靜態方法是直接通過類名來呼叫。 class Person{ constructor(name="xf",age){ t

JDBC配置檔案的讀取方式-非靜態方法靜態方法

非靜態方法讀取 public void getConnection2() throws IOException{InputStream is = getClass().getClassLoader().getResourceAsStream("jdbc.properties

從JVM記憶體管理的角度談談JAVA類的靜態方法靜態屬性

JVM的記憶體分為兩部分: stack(棧)是JVM的記憶體指令區。stack管理很簡單,push一定長度位元組的資料或者指令,stack指標壓棧相應的位元組位移; pop一定位元組長度資料或者指令,stack指標彈棧。stack的速度很快,管理很簡單,並且每次操作的資料或

php面向對象中static靜態屬性靜態方法的調用

style 存放位置 需要 5.4 color UNC size 只有一個 面向對象 關於它們的調用(能不能調用,怎麽樣調用),需要弄明白了他們在內存中存放位置,這樣就非常容易理解了。靜態屬性、方法(包括靜態與非靜態)在內存中,只有一個位置(而非靜態屬性,有多少實例化對象,

PHP的靜態靜態變數用法

本博主轉載前必先親自考證,深惡痛絕百度CP之流,有問題請與我聯絡。 1. 宣告類屬性或方法為static, 就可以不例項化而直接訪問。 2. 靜態屬性不能通過一個類已例項化的物件來訪問(但靜態方法可以)。 3. 由於靜態方法不需要通過物件即可呼叫,所以偽變數$this 在靜態方法中不可用

php——18-靜態屬性靜態方法static

靜態屬性和靜態方法(static) 靜態屬性或方法是和類相關的,而不是和類的某個特定的例項相關,因此這類屬性或方法也稱為“類屬性”或“類方法”; 靜態屬性和方法,在類被呼叫(類被建立或者類中的任何靜態

final關鍵詞 static靜態屬性靜態方法

現在有如下需求:我寫了一個類,你只可以使用,不可以繼承,也不能重寫其中的方法,如果實現?類或者方法一旦宣告final關鍵詞,那麼此類會有如下特點:帶有final關鍵詞的類,不能被繼承。帶有final關鍵詞的方法,不能被子類重寫。 finale關鍵詞宣告類,無法繼承。 1 final class a{

@Autowired註解靜態方法靜態變數的初始化順序

今天在寫專案的時候,遇到這麼一個問題:@Autowired CategoryMapper categoryMapper; private List<Category> categoryList = categoryMapper.selectByExample(

java中靜態靜態變數靜態方法分別有什麼特點?

一、static  請先看下面這段程式:public class Hello{ public static void main(String[] args){ //(1) System.out.println("Hello,world!"); //(2

java靜態方法靜態初始化塊及靜態變數的宣告初始化不能使用泛型的原因

最近學習到了Java中的泛型,對於靜態方法,靜態初始化塊及靜態變數的宣告和初始化不能使用泛型的原因做了一個彙總: 1。因為泛型是要在物件建立的時候才知道是什麼型別的,而物件建立的程式碼執行先後順序是static的部分,然後才是建構函式等等。所以在物件初始化之前static的