public、private、static的差別

Designed by Freepik
這不是豆知識...
很慚愧的寫程式十年了,還是沒有很懂,
想不到在巴哈姆特電玩資訊站,看到版友的教學,
紀錄一下,希望自己能記住。

資料來源巴哈姆特

圖片來源Designed by Freepik


public class MyClass
{
    public MyClass()
    {
        //建構子
    }

    public void MyMethod_Public()
    {
        //public方法
    }

    private void MyMethod_Private()
    {
        //private 方法
    }
}
上面的例子中,MyClass是個類別,簡單來說是設計圖
正常情況下,你不可能把設計圖拿來用吧?
而是需要把設計圖裡面的東西做成真正的物品後,才能使用
因此你常會看到一個語法:
MyClass class = new MyClass();

class就是MyClass的實作,也就是真正的物品,一般習慣上叫他物件
物件生成後,就可以使用他的public內容,例如class.MyMethod_Public();
MyMethod_Private()只有自己可以用,相信這你已經大致了解


MyClass()稱作建構子,預設已經是public MyClass() { } 所以有些程式碼裡你會找不到他
建構子主要用法是初始化,也會用來傳遞一些參數(可以先不用懂)
舉個例子,假設今天你是上帝,你想要創造人類
因此你先簡單的設計了一張設計圖
public class Human
{
    //略
}

但你又突然想到,每個人都長的一樣實在太無趣了
你希望每個人出生的時候智商就有差別,因此你增加了建構子
並宣告一個int來保存IQ,而IQ高低是天生的,所以無法後天更改
(假設啦...,畢竟一個槌子往腦袋打就有可能變智障)
public class Human
{
    private int myIQ = 100;
    public Human(int IQ)
    {
        myIQ = IQ;
    }
}

因為myIQ是private,因此你無法從外部更改他,但可以在實作他的時候做設定
Human human = new Human(170);
這樣就可以實作出智商170的人類了


如果上面的東西你還沒搞懂,可以先休息一下再重看
這是基本的物件概念,一定要搞懂
接下來就是public、private、static的簡單說明
public、protected、private可理解為權限
protected牽涉到繼承,你可以先不用理會他
public表其他人都可以使用,而private只有自己可以使用


哪時用public,哪時用private?
簡單來說,一般情況下,你不希望別人使用的東西,就設成private
假設我今天設定了一個戶頭的class
裡面有你的錢,沒人希望錢被亂動吧?所以設成private
public class Account
{
    private float money = 100;
}

但如果你今天又不太在乎隱私問題,給別人知道你也多少錢也無所謂
但還是不想給別人拿錢,因此你寫了一個方法讓別人知道你有多少錢
public class Account
{
    private float money = 100;

    public float GetMoneyAmount()
    {
        return money;
    }
}

藉由GetMoneyAmount();,別人可以知道你有多少錢,但又能保護你的錢


這時新手的疑問又來了,這程式只有我自己寫啊,全設public不就好了?
簡單的理由有兩個:養成習慣、方便閱讀
你難保以後有跟別人合作的機會,到時你跟別人合作就麻煩了
別人也不是你肚子裡的蛔蟲,有可能誤會你命名的意思,結果改到重要的參數
結果就是跑出非預期的結果,甚至是bug
再者,修改程式碼的時候,你可以更快的知道某參數或方法是用來幹嘛的
而別人要用你的物件的時候(以最上面的範例為例)
class後按「.」只會跑出他可以用(想用)的東西,在搜尋上也會快上許多


最後簡單說明static,這牽扯到記憶體的部分(stack、heap、static)
一樣可以先不用管記憶體的部分,但要先了解static功用
簡單來說,static是所有類別共通
public class Test
{
    public int a = 0;
    public static int b = 0;
}

Test test1 = new Test();
Test test2 = new Test();
test1.a = 1;
test1.b = 1;
print(test2.a);
print(test2.b);

最後印出來的會是0和1
然後你嘗試Test.a,你會發現沒這東西,因為每個類別的a都不一樣,他不知道你在說啥
但是Test.b確有用,因為他知道b是通用的,每個類別為Test的物件的b都是只同一個b



最後附上懶人包
1. class是類別,也就是設計圖,可藉由建構子產生出實體來使用
2. public可給所有人用,private只有自己能用,但可藉public的方法來得到private的值
3. static是class共通,所有new出來的物件看到的static都是同一個

沒有留言:

張貼留言

技術提供:Blogger.