国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 解析Java編程中對于包結構的命名和訪問

解析Java編程中對于包結構的命名和訪問

2020-03-13 13:10爪哇小博 JAVA教程

這篇文章主要介紹了Java編程中對于包結構的命名和訪問,是Java入門學習中的基礎知識,需要的朋友可以參考下

包的命名
包的名字應該避免與其他包沖突,所以選擇一個既有意義又唯一的名字是包設計的一個重要方面。但是全球的程序員都在開發包,根本就沒有辦法獲知誰采用了什么包名,因此選擇唯一的包名是一個難題。如果我們確定某個包只在我們的組織內部使用,那么我們就可以讓內部仲裁者(internal arbiter)來確保項目之間不會發生名字沖突。

  但是對于整個世界而言,這種方法是不實際的。包的標識符都是簡單的名字,一種比較好的能夠確保包名唯一的方法是使用Internet域名。如果我們所就職的公司的名字為Magic.lnc,該公司的域名為magi c.com,那么屬性包的聲明就應該是:

  package com.magic.attr; 注意,這里的域名構成元素是按常規域名的倒序排列的。

  如果我們采用這種慣用法,那么除了在我們的組織內部可能會產生沖突外,我們所采用的包名就不會與其他任何人的包名沖突了。如果我們的組織內部確實產生了沖突(可能是大型的企業),那么我們可以使用更具體的域名來進一步限定。許多大型公司都有內部子域名,如east和europe,可以使用這樣的子域名來進一步限定包的名字:

?
1
package corn. magic.japan.attr;

  使用這種方案可能會使包的名字變得很長,但是相對比較安全。使用這種技巧的程序員不會選擇相同的包名,而不使用這種技巧的程序員也不會選擇我們所采用的名字。

包的訪問
在聲明包中的頂層類和頂層接口的可訪問性時,有兩種選擇:包訪問權限(package)和公共訪問權限(public)。用public修飾的類或接口可以被包外的代碼所訪問,而沒有用public修飾的類型則具有包作用域:它們可以被同一個包中的其他代碼所訪問;但對于包外的代碼,甚至是子包中的代碼,它們都是隱藏的。我們在聲明類型時,應該只把其他程序員需要使用的那些類型聲明為public的,而隱藏那些屬于包的實現細節的類型。這種技術給我們提供了極大的靈活性,由于程序員并不依賴于這些他們所不能訪問的實現細節的類型,所以當我們想改變實現細節時,可以自由地改變它們。

  沒有被聲明為public,protected或private的類成員可以被包內的任何代碼直接訪問,但對包外的代碼是隱藏的。換句話說,默認的訪問修飾符是“package",但接口的成員例外,它們的默認訪問修飾符是“public" .

  在包內沒有聲明為private的字段或方法可以被該包中的所有其他代碼所訪問,因此,同一個包中的類都被認為是“友好的”或“可以信任的”。這樣就使得我們可以定義組合了預定代碼(predefined code)和占位符代碼(placeholder code)的應用框架,其中占位符代碼被框架類的子類覆蓋。預定義代碼可以使用包訪問權限修飾符,這樣包內的其他相互協作的代碼就可以直接訪問它們,但對于包外用戶,這些代碼是不可訪問的。然而,這些代碼所在包的子包是不被信任的,反之亦然。例如,在包dit中用包訪問權限修飾符修飾的代碼不能被其子包dit.dat中的代碼所訪問,反之亦然。

  因此,每種類型都定義了三種不同的契約:

  1.   .publi。契約:定義了類型的主要功能。
  2.   .protected契約:定義了子類可獲得的用于特化目的的功能。
  3.   .package契約:定義了包內其他代碼可獲得的用來實現包內類型之間協作的功能。所有這些契約都需要仔細考慮和設計。

  可訪問性和及蓋方法

  只有在超類中可以訪問到的方法才可以在子類中被覆蓋。如果超類中的某個方法不能被訪問,那么即使子類中的方法與該方法同名,在子類中也不能覆蓋該方法。當某個方法在運行時被調用時,系統會考慮它的可訪問性,從而決定運行它的哪一個具體實現。

  下面這個特意構建的例子解釋得更加清楚。假設我們在P1包中聲明了一個Abstract-Base類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package P1;
 
{Ab Ab AbAb
 
public abstract class AbstractBase
 
private void pri() {print(" stractBase.pri()”):} void pac () {print(" stractBase.pac()”);}
 
protected void pro() {print(" stractBase.pro()");}
 
public void pub() {print(" stractBase.pub()”);}
 
public final void show()
 
pri();
 
pac();
 
pro();
 
pub();
 
}
 
}

  在這個類中,我們定義了4個方法,每個方法都具有不同的訪問權限修飾符,且方法體都只是標識其自身。方法show在當前對象上依次調用了這4個方法,當把該方法應用于不同的子類對象時,就可以說明到底調用了這些方法的哪個實現。

  現在,我們定義類Concretel,這個類擴展了AbstractBase類,但是位于P2包中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package P2;
 
import P1.AbstractBase
 
public class Concretel extends AbstractBase{
 
public void pri(){print("Concretel.pri()”);}
 
public void pac(){print("Concretel.pac()”);}
 
public void pro(){print("Concretel.pro()”);}
 
public void pub(){print("Concretel.pub()");}
 
}

  在該類中重新聲明了超類中的4個方法,并改變了它們的實現,這些實現在報告它們屬于Con-cretel類。同時,它們的訪問權限都被改成了public,以便其他代碼訪問。執行下面的代碼

?
1
new Concretel().show():

  將產生如下輸出:

?
1
2
3
4
5
6
7
AbstractBase.pri()
 
AbstractBase.pac()
 
Concretel.pro()
 
Concretel.pub ()

  因為私有方法pri不能被子類(或其他類)所訪問,所以show方法總是調用AbstractBase類中的pri方法的實現。AbstractBase類中的具有包訪問權限的pac方法不能被Concretel訪問,因此Concretel類中的pac方法的實現不能覆蓋AbstractBase類中的定義,故show方法調用的是AbstractBase.pac方法。pro方法和pub方法在Concretel類中都是可以訪問的,同時也可以被覆蓋,所以show方法中調用的是Concretel類中的這兩個方法的實現。

  接卜采我們足義類Concrete2,來擴展類Concretel,然后我們把它和AbstractBase類放到同一個包P1中':

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package P1;
 
import P2.Concretel
 
public class Concrete2 extends Concretel{
 
public void pri(){print("Concrete2.pri()”);}
 
public void pac(){print("Concrete2.pac ()”);}
 
public void pro(){print("Concrete2.pro()”);}
 
public void pub(){print("Concrete2.pub()");}
 
}

  因為Concretel中的方法都具有public訪問權限,所以在Concrete2中都可以訪問到,而且Concrete2中的每一個方法分別對其相應的方法進行了覆蓋。此外,因為Concrete2和Ab-stractBase在同一個包中,所以在Concrete2中也可以訪問到方法AbstractBase.pac,并且可以覆蓋方法Concrete2.pac。在Concrete2對象上調用show方法,打印結果如下:

?
1
2
3
4
5
6
7
AbstractBase.pri()
 
Concrete2.pac()
 
Concrete2 .pro()
 
Concrete2.pub()

  最后,我們定義類Concrete3來擴展類Concrete2,并放在包P3中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package P3
 
import P1.Concrete2;
 
public class Concrete3 extends Concrete2{
 
public void pri(){print("Concrete3.pri()”);}
 
public void pac Q{print("Concrete3.pac()”);}
 
public void pro(){print("Concrete3.pro()”);}
 
public void pub(){print("Concrete3.pub()”);}
 
}
 
在Concrete3對象上調用show方法,打印結果如下:
 
AbstractBase.pri()
 
Concrete3.pac ()
 
Concrete3.pro()
 
Concrete3.pub()

  在這里方法Concrete3.pac看起來是覆蓋了不可訪問的AbstractBase.pac方法,但實際上是,方法Concrete3.pac覆蓋了方法Concrete2.pac,而方法Concrete2.pac覆蓋了方法AbstractBase.pac,因此方法Concrete3.pac間接地覆蓋了方法AbstractBase.pac。通過在類Concrete2中重新把pac方法聲明為具有public訪問權限,可以使其能夠被任何子類所訪問和覆蓋。'

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美黄色网| 国产精品久久嫩一区二区免费 | 亚洲国产精品一区二区三区 | 日韩中文字幕一区二区 | 久久女人精品 | 午夜精品久久久久久 | 免费一区二区三区 | 国产中文字幕在线免费观看 | 久久久久国产精品午夜一区 | 亚洲欧美在线精品 | 精品久久久久久久 | 人人草人人干 | 麻豆av一区 | 亚洲天堂av网 | 中文字幕视频在线观看 | the蜜臀av入口 | www久久精品 | 欧美一级精品片在线看 | 亚洲激情在线 | 神马电影午夜 | 国产日韩欧美一区二区 | 精品久久99 | 免费在线黄色片 | 黄色在线观看 | 超碰天天 | 在线观看日韩精品 | 天天操综合网 | 99热国产精品 | 黄视频免费 | 国产一级片免费观看 | 亚洲国产aⅴ成人精品无吗 久久久91 | 中文字幕在线免费看 | 精品久久久久久久久久久下田 | 激情中文网| 亚洲综合影院 | 久久精品成人 | 中文字幕一二三 | 精品欧美一区二区三区久久久 | 久久久久久久久久久久久久av | 日本三级视频 | a在线视频 |