2012-04-17 73 views
1

下面的代碼說明了情況:Java是否完全遵循面向對象的編程模型?

class Human { 

private String heart = "default heart"; 

    public void control(Human h) { 

      h.heart = "$%^&*@@!#^"; 
     } 

    public String getHeart() { 
    return heart; 
    } 
    } 

public class HumanTest { 

    public static void main(String[] args) { 

    Human deb = new Human(); 
    Human kate = new Human(); 

    System.out.println(deb.getHeart()); 
    kate.control(deb); 
    System.out.println(deb.getHeart()); 

    } 

} 

這裏心臟[私有變量] DEB的不幸得到了修改。 :)

Java允許代碼在沒有任何錯誤的情況下運行。但是,是否有理由讓對象有權訪問其他對象的私有成員,即使代碼在同一個類中? 不應該Java不允許這樣做?

據我所知,私人意味着限制超出類源代碼的訪問。但是在上面的源代碼中應用了相同的概念。結果是災難性的,因爲一個人的心不能被任何隨機的人修改。

+1

很少有語言是純粹的OOP。所有你需要閱讀的是'public static void main'來實現main運行時沒有Object。 – 2012-04-17 13:27:43

+0

你的問題根本不在於OOP。它是關於Java中的訪問控制機制。它沒有是/否的答案。吉姆戈斯林這樣設計的:就是這樣。如果你想知道爲什麼,它可以在語言規範,JVM規範或Jim的頭上。 – EJP 2012-04-17 22:23:04

+0

那麼您希望私人會員使用什麼?如果沒有公共會員使用,那麼你認爲私人會員在哪裏使用。 – Dhananjay 2012-04-18 06:32:39

回答

5

如果結果是災難性的,你不應該編寫這個類,以便它允許它。 「bug」不是由類外部的代碼引起的,而是由類本身的代碼引起的。所以這只是你代碼中的一個錯誤。

如果Java不允許它,你只能通過它們的公共屬性來比較同一類的對象,例如,它會破壞封裝(通過暴露私人東西),和/或非常緩慢(通過強制製作私人屬性的防禦副本,以使其可用於其他對象。

2

某些語言在對象級別封裝,其他語言(Java,C++)在類級別封裝。這聽起來像你習慣於(或剛剛閱讀)在對象級別的封裝。坦率地說,我發現班級更加自然,但也許這只是因爲C++提供了我的類的編程介紹。類級封裝使得一些成語(工廠方法,拷貝構造函數,比較操作符)更容易編寫。使用對象級封裝,您最終將暴露的內容比您真正想要實現這些功能更多。

無論如何,這兩種方式都不是「正確的」 - 它們只是不同而已。

0

這沒有違反面向對象 - 這是關於內部的類的元素封裝。

你可以用這個例子來做這件事似乎很愚蠢,但就我所見,它實際上並不是一件壞事。一個類封裝元素的目的是讓其他類不能修改它們 - 例如他們只能看到類Human的公共接口進行更改。這意味着不止一個人可以在同一個項目上工作,編寫不同的類(或者您可以在不同的時間編寫同一個項目來編寫不同的類),而且他們不需要知道代碼的內部工作方式。

但是,唯一的地方(酒吧反射),你可以直接訪問一個私人領域的人是人。當你編寫Human類時,如果你選擇修改其他Human對象的私有字段,這取決於你 - 但它都包含在一個類中,這是你的設計。如果你以一種不合適的方式來做到這一點,那麼這是你設計中的一個缺陷,而不是Java - 在某些情況下,做到這一點非常合適!

0

嗯,我看到它的方式,這只是我對私人關鍵字的解釋,私人對班級是私人的,可以在班級內部進行訪問。它不限於該課程的實例。因此,你不能在「人類測試」類中做kate.heart =「xpto」,因爲它會試圖破壞它的隱私,但是使用凱特的代碼來改變deb的心臟是允許的,因爲它是在課堂上處理的。

0

Java語言嚴格遵循面向對象的概念。這裏也是正確的。使用你的類的對象,你正在修改你的類的變量。但是直到可以控制他的對象的程序員。

人類的心臟在人類的內部是私人的。但是使用控制方法,您可以從外部訪問它。這就是爲什麼它會被修改。那是什麼問題。?