Java學習之類的屬性(轉)
Java學習之類的屬性(轉)[@more@] Public、private、protected顯示了三種類中的屬性和服務的型別,public是可以隨意訪問的、private是外界不能訪問的(顯示了資料的封裝性)、protected說明資料是受保護的。下面就來詳細講述一下這三個究竟有什麼區別。
首先要了解一下包的概念。有若干個類,它們相互之間有一定的關係,那麼就可以定義一個包容納這些類,包不僅僅只能包含類,它可以擁有類、介面、構件、節點、協作,包內還可以包含包。
現在就讓我們來具體討論一下這三個種類的不同之處。
作為public的類和屬性是可以被外界任意呼叫的,無論是在類中,還是跨越類的訪問(如果不屬於同一個包,就要呼叫import語句,新增包名),這一點是非常好理解的。
Private的屬性和方法是最自私的,它定義的屬性和方法只能在本類中使用,到類外,是無論如何都不能被使用的,如:
class Date
{
private int day;
public void tomorrow()
{
this.day = this.day + 1;
}
}
public class DateUser
{
public static void main(String args[])
{
Date mydate = new Date();
mydate.day = 21; //注意這句話是錯的
}
}
在這個程式中,建立了一個Date類的物件mydate,這是可以的,但是由於類Date中的day是私有變數,所以,建立的這個物件 mydate不能透過mydate.day來訪問這個屬性,如果在其它類中要使用這個私有變數,那麼只能透過Date中的public的方法來訪問這個屬性,這樣,就很好的保證了資料的封裝性,就像物件導向中提到的報刊亭的故事一樣,購買報刊的人不能自己伸手進去拿報紙或是找零錢,而只能由報刊亭內部人員來處理這些事情一樣。在上面的例子中,大家可以發現,類Date中的預設方法(Date())並沒有定義它的型別,這就意味著它是友好的,也就是意味著它在本包內是public的,而在外包內是private的。但是一旦把它的型別定義為private,那麼連Date mydate = new Date()也會出錯,這是因為預設的構建器已經被定義為private型別,也就是即使是本包內的其他類也不能訪問了。
對於protected就要考慮到包的概念,如果有兩個類,如:Date和DateUser兩個類分別位於不同的包內,而DateUser是繼承Date 類的一個類,那麼如果要使DateUser中的方法訪問Date中的方法或屬性,除了使用import將包匯入,還需要考慮所要訪問的方法和屬性是什麼型別的,一般而言,跨包訪問,public的方法和屬性都一定可以訪問,但是考慮到如果將需要使用的方法和屬性都修改成public的話,那麼就可以允許任何事物訪問,就不具有安全性,為了這個事情的考慮,新增了protected,如果將需要訪問的方法和屬性定義為protected,那麼其它的類無法訪問,而外包的DateUser透過import就可以訪問這些屬性和方法了,即保證了資料的安全性,也保證了資料被很好的使用。範例如下:
package a.b;
public class Sample
{
protected void doing();
}
import a.b.*;
public class Sample1 extends Sample
{
public static void main(String args[])
{
Sample1 x=new Sample1();
x.doing();
}
}
首先要了解一下包的概念。有若干個類,它們相互之間有一定的關係,那麼就可以定義一個包容納這些類,包不僅僅只能包含類,它可以擁有類、介面、構件、節點、協作,包內還可以包含包。
現在就讓我們來具體討論一下這三個種類的不同之處。
作為public的類和屬性是可以被外界任意呼叫的,無論是在類中,還是跨越類的訪問(如果不屬於同一個包,就要呼叫import語句,新增包名),這一點是非常好理解的。
Private的屬性和方法是最自私的,它定義的屬性和方法只能在本類中使用,到類外,是無論如何都不能被使用的,如:
class Date
{
private int day;
public void tomorrow()
{
this.day = this.day + 1;
}
}
public class DateUser
{
public static void main(String args[])
{
Date mydate = new Date();
mydate.day = 21; //注意這句話是錯的
}
}
在這個程式中,建立了一個Date類的物件mydate,這是可以的,但是由於類Date中的day是私有變數,所以,建立的這個物件 mydate不能透過mydate.day來訪問這個屬性,如果在其它類中要使用這個私有變數,那麼只能透過Date中的public的方法來訪問這個屬性,這樣,就很好的保證了資料的封裝性,就像物件導向中提到的報刊亭的故事一樣,購買報刊的人不能自己伸手進去拿報紙或是找零錢,而只能由報刊亭內部人員來處理這些事情一樣。在上面的例子中,大家可以發現,類Date中的預設方法(Date())並沒有定義它的型別,這就意味著它是友好的,也就是意味著它在本包內是public的,而在外包內是private的。但是一旦把它的型別定義為private,那麼連Date mydate = new Date()也會出錯,這是因為預設的構建器已經被定義為private型別,也就是即使是本包內的其他類也不能訪問了。
對於protected就要考慮到包的概念,如果有兩個類,如:Date和DateUser兩個類分別位於不同的包內,而DateUser是繼承Date 類的一個類,那麼如果要使DateUser中的方法訪問Date中的方法或屬性,除了使用import將包匯入,還需要考慮所要訪問的方法和屬性是什麼型別的,一般而言,跨包訪問,public的方法和屬性都一定可以訪問,但是考慮到如果將需要使用的方法和屬性都修改成public的話,那麼就可以允許任何事物訪問,就不具有安全性,為了這個事情的考慮,新增了protected,如果將需要訪問的方法和屬性定義為protected,那麼其它的類無法訪問,而外包的DateUser透過import就可以訪問這些屬性和方法了,即保證了資料的安全性,也保證了資料被很好的使用。範例如下:
package a.b;
public class Sample
{
protected void doing();
}
import a.b.*;
public class Sample1 extends Sample
{
public static void main(String args[])
{
Sample1 x=new Sample1();
x.doing();
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-950912/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 零基礎學習 Python 之細說類屬性 & 例項Python
- 揭秘Java反射:如何輕鬆獲取類的屬性及父類屬性Java反射
- Hive學習之常見屬性配置Hive
- 深入剖析 Java 類屬性與類方法的應用Java
- [JAVA] 只知物件屬性,不知類屬性?就算類答應,static都不答應Java物件
- Python 類的屬性與例項屬性Python
- CALayer學習--contentsCenter屬性
- PHP 手冊 (類與物件) 學習筆記二:屬性PHP物件筆記
- [java IO流]之 Properties屬性集Java
- Python列印類的屬性Python
- CMake 屬性之全域性屬性
- 學習Rust:派生derive屬性Rust
- java 只列印實體類裡的 非 null 屬性JavaNull
- Matlab_GUI學習筆記(三)——常用物件的屬性之FigureMatlabGUI筆記物件
- java學習:Java中的其它類Java
- 【python】物件導向之類成員(屬性)Python物件
- java基礎學習之類集框架(十)Java框架
- CMake 屬性之目錄屬性
- CMake 屬性之目標屬性
- Day30--類的屬性
- Java基礎之IO轉換流學習Java
- 鄧洋前端學習——Flex佈局之flex-basis屬性前端Flex
- educoder上的實訓題目(學習-Java包裝類之Byte類)Java
- 前端學習-vue影片學習007-標籤的ref屬性前端Vue
- JavaScript中的物件學習筆記(屬性操作)JavaScript物件筆記
- WPF依賴屬性的正確學習方法
- 學習CSS的background屬性及其取值(實踐)CSS
- Java反射-屬性Java反射
- java工具類之編碼轉換工具類Java
- C# 隨機給一個全部資訊都未知的類型別,如何獲取該類的類名、屬性個數、屬性名、屬性的資料型別、屬性值?C#隨機資料型別
- React學習手記2-屬性校驗和預設屬性React
- 重學java之類的定義Java
- Scala的類、屬性、物件欄位物件
- 類的靜態屬性和方法
- 類的結構之一:屬性
- (JavaScript學習記錄):jQuery 屬性操作JavaScriptjQuery
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- PHP中的MySQLi擴充套件學習(二)mysqli類的一些少見的屬性方法PHPMySql套件
- java的兩個bean之間複製屬性,所有屬性中替換某幾個字元JavaBean字元