當前位置:首頁 » 編程軟體 » 編譯單元域

編譯單元域

發布時間: 2022-07-03 02:25:34

java中的四種訪問控制域是什麼

private,public,protected,默認不寫(firendly)

1、Class類的訪問許可權:
public:可以供所有的類訪問。
默認:默認可以稱為friendly但是,java語言中是沒有friendly這個修飾符的,這樣稱呼應該是來源於c++。默認的訪問許可權是包級訪問許可權。
即如果寫了一個類沒有寫訪問許可權修飾符,那麼就是默認的訪問許可權,同一個包下的類都可以訪問到,即使可以實例化該類
(當然如果這個類不具有實例化的能力除外,比如該類沒有提供public的構造函數)。

說明:
1、每個編譯單元(類文件)都僅能有一個public class
2、public class的名稱(包含大小寫)必須和其類文件同名。
3、一個類文件(*.java)中可以不存在public class。
這種形式的存在的場景:如果我們在某個包內撰寫一個class,僅僅是為了配合同包內的其他類工作,而且
我們不想再為了撰寫說明文檔給客戶(不一定是現實意義的客戶,可能是調用這個類的類)看而傷腦筋,而且有可能過一段時間之後
有可能會徹底改變原有的做法,並完全舍棄舊版本,以全新的版本代替。
4、class不可以是private和protected。
5、如果不希望那個任何產生某個class的對象,可以將該類得所有構造函數設置成private。但是即使這樣也可以生成該類的對象,就是class的static的成員(屬性和方法)可以辦到。

2、類成員變數的訪問許可權:
public:緊接public的屬性任何類都可以訪問到。可以直接使用ClassName.propertyName。但是從類的封裝性上來考慮將一個類的屬性定義成public一般很少使用,
在定義靜態常量的時候通暢會這樣定義。如:public static final int PAGE_SIZE=10;
private:只有類本身內部的方法可以訪問類的private屬性,當然內部類也可以訪問其外部類的private成員的。(屬性和方法)
默認(friendly):包級可見,同一個包內的類可以訪問到這個屬性,可以直接使用className.propertyName來訪問,但是從類的封裝性特性來說很少這樣使用類的屬性的。
protected:關鍵字所處理的是所謂「繼承」的觀念。對於同一包的其他類,protected=默認,對於不同包的類,如果存在繼承關系,而baseClass存在protected屬性,則可以被其自繼承,而不同包的其他類
則不能訪問類的protected屬性。

3、類的成員方法的訪問許可權:
其從語法角度來講,這些訪問許可權控制符作用於類的方法和作用於類的屬性上的效果是一樣的。
public:所有類可見。
pirvate:只有同一類內部的方法可見,在有就是內部類也可以訪問到。
默認(friendly):包內可見。
protected:繼承可見。

4、訪問許可權存在的理由
1、「讓使用者無法碰觸到他們不該碰觸的東西。」這些東西僅供類的內部機制使用。將某些成員聲明成private,對於使用者來說可以說是一種服務,
因為這樣使用者可以知道哪些是他關注的哪些是不重要的,不需要關注,如此歷來對於使用來說降低了對使用對象認識的難度。
2、(最終要的理由)讓程序設計者可以更動class內部運作方式,而無須擔心波及到客戶端程序。

5、java的「訪問許可權修飾符」賦予classes開發者極具有價值的控制能力。身為classes開發者,如果你的任何改變可以完全不幹擾你的使用者,
你便可以安心改變你的底層實現,因為客戶端程序員無法訪問class的這一部分。
通過今天學習訪問許可權的問題了解到,介面或者抽象等等策略所謂的「實現隱藏」其根本原因並不是說為了隱藏實現的代碼和思路,而是降低使用者的使用難度,以及從維護角度來說可見范圍的控制給程序維護帶來了極大的安全性。

❷ 在java中,什麼是編譯單元。如何根據編譯單元創建類庫,又如何使用這個類庫。

豬哥解答:
c領域倒是有編譯單元的說法,java 中沒有聽說。
類庫嗎,功能類集合,就是一組類放一起來實現某個功能。不要太去追概念性的東西,什麼白貓黑貓,能抓老鼠才是好貓。

類庫舉例:人、購物車、超市、商品,人去超市購買商品,道具是購物車,那我要准備幾個類
人.java,購物車.java,超市.java,商品.java,這幾個類通過人這個擁有各種動作行為(方法)的類聯繫到一起,實現了人推車在超市中買商品的購物動作。
那麼我這也就是一個類庫,多個類集中到一起,為了實現人購買商品這個功能。

❸ java中import的作用

import的作用就是導入靜態成員,導入介面類型。

拓展資料

java中import的作用詳解:

一、java以這樣兩種方式導入包中的任何一個public的類和介面(只有public類和介面才能被導入)。

三、java.lang包是自動導入的。java編譯器會忽略這些冗餘導入聲明(rendant import declarations)。即使像這樣 import java.util.ArrayList; import java.util。

❹ C++中指針作用域

作用域是對於標識符而言的,是限制編譯器在某一個范圍內能夠找到某個標識符。而指針指向的對象本身和標識符無關,只和指針的值和類型有關。因此只引用要被指向的變數對應的標識符能夠在指針作用域中訪問,就可以指向這個變數。
例如
static int a = 1;
extern int b;
int g()
{
int d = 1;
}
int f()
{
int c = 1;

int* p1 = &a; //靜態變數為編譯單元(源文件)作用域,合法;
int* p2 = &b; //外部變數為全局作用域,合法;
int* p3 = &c; //函數內的局部作用域,合法;
int* p4 = &d; //非法,在全局作用域、編譯單元、f()作用域中均找不到d的聲明。
}
int main()
{
return 0;
}
====
[原創回答團]

❺ 我們經常看到書上面說的 某某變數的內存單元是編譯器在編譯時候分配的 是什麼意思

所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全局變數或靜態變數(包括一些復雜類型的常量),它們所需要的空間大小可以

明確計算出來,並且不會再改變,因此它們可以直接存放在可執行文件的特定的節里(而且包含初始化的值),程序運行時也是直接將這個節載入到特定的段中,不
必在程序運行期間用額外的代碼來產生這些變數。
其實在運行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,類型,作用
域,生存期等等),對應的只是一塊內存(只有首址和大小),
所以在運行期間動態申請的空間,是需要額外的代碼維護,以確保不同變數不會混用內存。比如寫new表示有一塊內存已經被佔用了,其它變數就不能再用它了;
寫delete表示這塊內存自由了,可以被其它變數使用了。(通常我們都是通過變數來使用內存的,就編碼而言變數是給內存塊起了個名字,用以區分彼此)
內存申請和釋放時機很重要,過早會丟失數據,過遲會耗費內存。特定情況下編譯器可以幫我們完成這項復雜的工作(增加額外的代碼維護內存空間,實
現申請和釋 放)。從這個意義上講,局部自動變數也是由編譯器負責分配空間的。進一步講,內存管理用到了我們常常掛在嘴邊的堆和棧這兩種數據結構。
最後對於「編譯器分配空間」這種不嚴謹的說法,你可以理解成編譯期間它為你規劃好了這些變數的內存使用方案,這個方案寫到可執行文件裡面了(該文件中包含若干並非出自你大腦衍生的代碼),直到程序運行時才真正拿出來執行。

❻ 定義c/c++全局變數/常量幾種方法的區別

在討論全局變數之前我們先要明白幾個基本的概念: 1. 編譯單元(模塊): 在ide開發工具大行其道的今天,對於編譯的一些概念很多人已經不再清楚了,很多程序員最怕的就是處理連接錯誤(link error) 因為它不像編譯錯誤那樣可以給出你程序錯誤的具體位置,你常常對這種錯誤感到懊惱,但是如果你經常使用gcc,makefile等工具在linux或者嵌入式下做開發工作的話,那麼你可能非常的理解編譯與連接的區別!當在vc這樣的開發工具上編寫完代碼,點擊編譯按鈕准備生成exe文件時,vc其實做了兩步工作,第一步,將每個.cpp(.c)和相應.h文件編譯成obj文件;第二步,將工程中所有的obj文件進行link生成最終的.exe文件,那麼錯誤就有可能在兩個地方產生,一個是編譯時的錯誤,這個主要是語法錯誤,另一個是連接錯誤,主要是重復定義變數等。我們所說的編譯單元就是指在編譯階段生成的每個obj文件,一個obj文件就是一個編譯單元,也就是說一個cpp(.c)和它相應的.h文件共同組成了一個編譯單元,一個工程由很多個編譯單元組成,每個obj文件里包含了變數存儲的相對地址等 。 2. 聲明與定義的區別 函數或變數在聲明時,並沒有給它實際的物理內存空間,它有時候可以保證你的程序編譯通過,但是當函數或變數定義的時候,它就在內存中有了實際的物理空間,如果你在編譯模塊中引用的外部變數沒有在整個工程中任何一個地方定義的話, 那麼即使它在編譯時可以通過,在連接時也會報錯,因為程序在內存中找不到這個變數!你也可以這樣理解,對同一個變數或函數的聲明可以有多次,而定義只能有一次! 3. extern的作用 extern有兩個作用,第一個 當它與" c" 一起連用時,如: extern " c" void fun(int a int b) 則告訴編譯器在編譯fun這個函數名時按著c的規則去翻譯相應的函數名而不是c++的, c++的規則在翻譯這個函數名時會把fun這個名字變得面目全非,可能是fun abc_int_int#$也可能是別的,這要看編譯器的" 脾氣" 了(不同的編譯器採用的方法不一樣),為什麼這么做呢,因為c++支持函數的重載啊,在這里不去過多的論述這個問題,如果你有興趣可以去網上搜索,相信你可以得到滿意的解釋! 當extern不與" c" 在一起修飾變數或函數時,如在頭文件中: extern int g_int 它的作用就是聲明函數或全局變數的作用范圍的關鍵字,其聲明的函數和變數可以在本模塊活其他模塊中使用,記住它是一個聲明不是定義!也就是說b模塊(編譯單元)要是引用模塊(編譯單元)a中定義的全局變數或函數時,它只要包含a模塊的頭文件即可 在編譯階段,模塊b雖然找不到該函數或變數,但它不會報錯,它會在連接時從模塊a生成的目標代碼中找到此函數。 如果你對以上幾個概念已經非常明白的話,那麼讓我們一起來看以下幾種全局變數/常量的使用區別: 1. 用extern修飾的全局變數 以上已經說了extern的作用,下面我們來舉個例子 如: 在test1.h中有下列聲明: #ifndef test1h #define test1h extern char g_str[] // 聲明全局變數g_str void fun1() #endif 在test1.cpp中 #include " test1.h" char g_str[] = " 123456" // 定義全局變數g_str void fun1() { cout < < g_str < < endl } 以上是test1模塊, 它的編譯和連接都可以通過 如果我們還有test2模塊也想使用g_str 只需要在原文件中引用就可以了 #include " test1.h" void fun2() { cout < < g_str < < endl } 以上test1和test2可以同時編譯連接通過,如果你感興趣的話可以用ultraedit打開test1.obj 你可以在裡面著" 123456" 這個字元串 但是你卻不能在test2.obj裡面找到,這是因為g_str是整個工程的全局變數,在內存中只存在一份 test2.obj這個編譯單元不需要再有一份了,不然會在連接時報告重復定義這個錯誤! 有些人喜歡把全局變數的聲明和定義放在一起,這樣可以防止忘記了定義,如把上面test1.h改為 extern char g_str[] = " 123456" // 這個時候相當於沒有extern 然後把test1.cpp中的g_str的定義去掉 這個時候再編譯連接test1和test2兩個模塊時,會報連接錯誤,這是因為你把全局變數g_str的定義放在了頭文件之後,test1.cpp這個模塊包含了test1.h所以定義了一次g_str 而 test2.cpp也包含了test1.h所以再一次定義了g_str 這個時候連接器在連接test1和test2時發現兩個g_str。如果你非要把g_str的定義放在test1.h中的話,那麼就把test2的代碼中#include " test1.h" 去掉換成: extern char g_str[] void fun2() { cout < < g_str < < endl } 這個時候編譯器就知道g_str是引自於外部的一個編譯模塊了,不會在本模塊中再重復定義一個出來,但是我想說這樣做非常糟糕,因為你由於無法在test2.cpp中使用#include " test1.h" 那麼test1.h中聲明的其他函數你也無法使用了,除非也用都用extern修飾,這樣的話你光聲明的函數就要一大串,而且頭文件的作用就是要給外部提供介面使用的,所以請記住, 只在頭文件中做聲明,真理總是這么簡單。 2. 用static修飾的全局變數 首先,我要告訴你static與extern是一對「水火不容」的傢伙,也就是說extern和static不能同時修飾一個變數; 其次,static修飾的全局變數聲明與定義同時進行,也就是說當你在頭文件中使用static聲明了全局變數後,它也同時被定義了; 最後,static修飾全局變數的作用域只能是本身的編譯單元,也就是說它的「全局」只對本編譯單元有效,其他編譯單元則看不到它。一般定義static全局變數時,都把它放在原文件中而不是頭文件,這樣就不會給其他模塊造成不必要的信息污染,同樣記住這個原則吧! 如: test1.h: #ifndef test1h #define test1h static char g_str[] = " 123456" void fun1() #endif test1.cpp: #include " test1.h" void fun1() { cout < < g_str < < endl } test2.cpp #include " test1.h" void fun2() { cout < < g_str < < endl } 以上兩個編譯單元可以連接成功 當你打開test1.obj時,你可以在它裡面找到字元串" 123456" 同時你也可以在test2.obj中找到它們,它們之所以可以連接成功而沒有報重復定義的錯誤是因為雖然它們有相同的內容,但是存儲的物理地址並不一樣,就像是兩個不同變數賦了相同的值一樣,而這兩個變數分別作用於它們各自的編譯單元。 也許你比較較真,自己偷偷的跟蹤調試上面的代碼 結果你發現兩個編譯單元(test1 test2)的g_str的內存地址相同,於是你下結論static修飾的變數也可以作用於其他模塊,但是我要告訴你,那是你的編譯器在欺騙你,大多數編譯器都對代碼都有優化功能,以達到生成的目標程序更節省內存,執行效率更高,當編譯器在連接各個編譯單元的時候,它會把相同內容的內存只拷貝一份,比如上面的" 123456" 位於兩個編譯單元中的變數都是同樣的內容,那麼在連接的時候它在內存中就只會存在一份了,如果你把上面的代碼改成下面的樣子,你馬上就可以拆穿編譯器的謊言: test1.cpp: #include " test1.h" void fun1() { g_str[0] = ' ' a' ' cout < < g_str < < endl } test2.cpp #include " test1.h" void fun2() { cout < < g_str < < endl } void main() { fun1() // a23456 fun2() // 123456 } 這個時候你在跟蹤代碼時,就會發現兩個編譯單元中的g_str地址並不相同,因為你在一處修改了它,所以編譯器被強行的恢復內存的原貌,在內存中存在了兩份拷貝給兩個模塊中的變數使用。 正是因為static有以上的特性,所以一般定義static全局變數時,都把它放在原文件中而不是頭文件,這樣就不會給其他模塊造成不必要的信息污染,同樣記住這個原則吧!

❼ JAVA問題:什麼叫做一個編譯單元

當一個c或cpp文件在編譯時,預處理器首先遞歸包含頭文件,
形成一個含有所有
必要信息的單個源文件,這個源文件就是一個編譯單元。
這個編譯單元會被編譯成為一個與cpp
文件名同名的目標文件

連接程序把不同編譯單元中產生的符號聯系起來,構成一個可執行程序。

❽ 在java程序中什麼條件下要用import語句什麼時候不用

當需要使用其他包中的類的時候,需要使用import語句。

例如:import org.springframework.core.task.TaskExecutor;

其他包的類一般情況就是,你正在使用的類需要調用別人類裡面的方法。

比如:

import java.util.ArrayList;

import java.util.List;

public class Test1 {

List<String> list=new ArrayList<String>();

}

裡面調用了import java.util包下面的ArrayList和List,

當然也可以調用自己封裝好的包,方法是一樣的,

上面兩句import也可以寫成:import java.util.*;

❾ 在C/C++中,什麼叫編譯單元

可以這樣的理解:

編譯單元
當一個c或cpp文件在編譯時,預處理器首先遞歸包含頭文件,

形成一個含有所有 必要信息的單個源文件,這個源文件就是一個編譯單元。

這個編譯單元會被編譯成為一個與cpp 文件名同名的目標文件 。

連接程序把不同編譯單元中產生的符號聯系起來,構成一個可執行程序。

❿ C位域 編譯器問題

位段(或稱「位域」,Bit field)為一種數據結構,可以把數據以位元的形式緊湊的儲存,並允許程序員對此結構的位元進行操作。這種數據結構的好處:

  • 可以使數據單元節省儲存空間,當程序需要成千上萬個數據單元時,這種方法就顯得尤為重要。

  • 位段可以很方便的訪問一個整數值的部分內容從而可以簡化程序源代碼。

  • 而位域這種數據結構的缺點在於,其內存分配與內存對齊的實現方式依賴於具體的機器和系統,在不同的平台可能有不同的結果,這導致了位段在本質上是不可移植的。

熱點內容
js源碼下載 發布:2024-04-20 15:05:16 瀏覽:19
編譯翻譯的區別 發布:2024-04-20 14:55:53 瀏覽:893
登錄之後qq密碼要在哪裡看 發布:2024-04-20 14:55:03 瀏覽:730
天龍多開腳本 發布:2024-04-20 14:53:05 瀏覽:770
同一段代碼編譯的長度不同 發布:2024-04-20 14:24:14 瀏覽:379
緩存美劇權力的游戲 發布:2024-04-20 14:16:52 瀏覽:987
如何刪除word文件保存密碼 發布:2024-04-20 14:15:18 瀏覽:824
紅米安卓10如何降級到安卓9 發布:2024-04-20 14:13:25 瀏覽:30
ftp目錄遍歷 發布:2024-04-20 13:58:37 瀏覽:970
mysql存儲過程的數組 發布:2024-04-20 13:58:33 瀏覽:60