java中什么是字段
java中什么是字段
java是一種編程語言,有很多人也好奇java中的字段到底是什么意思。下面小編為大家分享的是java中的字段意思的內(nèi)容介紹,歡迎閱讀!
Java 中的字段含義
我們把表中的每一行叫做一個“記錄”,每一個記錄包含這行中的所有信息,就像在通訊錄數(shù)據(jù)庫中某個人全部的信息,但記錄在數(shù)據(jù)庫中并沒有專門的記錄名,常常用它所在的行數(shù)表示這是第幾個記錄。在數(shù)據(jù)庫中存放在表行列交叉處的數(shù)據(jù)叫做“值”,它是數(shù)據(jù)庫中最基本的存儲單元,它的位置要由這個表中的記錄和字段來定義。
JAVA支持兩種field(字段),每一個對象的實例都有一個對象字段的復(fù)制;所有的對象共享一個類的靜態(tài)字段。本地方法使用JNI提供的函數(shù)可以獲取和修改這兩種字段。先看一個從本地代碼中訪問對象字段的例子:
class InstanceFieldAccess {
private String s;
private native void accessField();
public static void main(String args[]) {
InstanceFieldAccess c = new InstanceFieldAccess();
c.s = "abc";
c.accessField();
System.out.println("In Java:");
System.out.println(" c.s = \"" + c.s + "\"");
}
static {
System.loadLibrary("InstanceFieldAccess");
}
}
InstanceFieldAccess這個類定義了一個對象字段s。main方法創(chuàng)建了一個對象并設(shè)置s的值,然后調(diào)用本地方法InstanceFieldAccess.accessField在本地代碼中打印s的值,并把它修改為一個新值。本地方法返回后,JAVA中把這個值再打印一次,可以看出來,字段s的值已經(jīng)被改變了。下面是本地方法的實現(xiàn):
JNIEXPORT void JNICALL
Java_InstanceFieldAccess_accessField(JNIEnv *env, jobject obj)
{
jfieldID fid; /* store the field ID */
jstring jstr;
const char *str;
/* Get a reference to obj's class */
jclass cls = (*env)->GetObjectClass(env, obj);
printf("In C:\n");
/* Look for the instance field s in cls */
fid = (*env)->GetFieldID(env, cls, "s",
"Ljava/lang/String;");
if (fid == NULL) {
return; /* failed to find the field */
}
/* Read the instance field s */
jstr = (*env)->GetObjectField(env, obj, fid);
str = (*env)->GetStringUTFChars(env, jstr, NULL);
if (str == NULL) {
return; /* out of memory */
}
printf(" c.s = \"%s\"\n", str);
(*env)->ReleaseStringUTFChars(env, jstr, str);
/* Create a new string and overwrite the instance field */
jstr = (*env)->NewStringUTF(env, "123");
if (jstr == NULL) {
return; /* out of memory */
}
(*env)->SetObjectField(env, obj, fid, jstr);
}
運行程序,得到輸出為:
In C:
c.s = "abc"
In Java:
c.s = "123"
4.1.1 訪問一個對象字段的流程
為了訪問一個對象的實例字段,本地方法需要做兩步:
首先,通過在類引用上調(diào)用GetFieldID獲取field ID(字段ID)、字段名字和字段描述符:
Fid=(*env)->GetFieldID(env,cls,”s”,”Ljava/lang/String;”);
上例中的代碼通過在對象引用obj上調(diào)用GetObjectClass獲取到類引用。一旦獲取到字段ID,你就可以把對象和字段ID作為參數(shù)來訪問字段:
Jstr=(*env)->GetObjectField(env,obj,fid);
因為字符串和數(shù)組是特殊的對象,所以我們使用GetObjectField來訪問字符串類型的實例字段。除了Get/SetObjectField,JNI還支持其它如GetIntField、SetFloatField等用來訪問基本類型字段的函數(shù)。
4.1.2 字段描述符
在上一節(jié)我們使用過一個特殊的C字符串“Ljava/lang/String”來代表一個JVM中的字段類型。這個字符串被稱為JNI field descriptor(字段描述符)。
字符串的內(nèi)容由字段被聲明的類型決定。例如,使用“I”來表示一個int類型的字段,“F”來表示一個float類型的字段,“D”來表示一個double類型的字段,“Z”來表示一個boolean類型的字段等等。
像java.lang.String這樣的引用類型的描述符都是以L開頭,后面跟著一個JNI類描述符,以分號結(jié)尾。一個JAVA類的全名中的包名分隔符“.”被轉(zhuǎn)化成“/”。因此,對于一個字段類型的字段來說,它的描述符是“Ljava/lang/String”。
數(shù)組的描述符中包含“]”字符,后面會跟著數(shù)組類型的描述符,如“[I”是int[]類型的字段的描述符。12.3.3詳細介紹了各種類型的字段描述以及他們代表的JAVA類型。
你可以使用javap工具來生成字段描述符。
4.1.3 訪問靜態(tài)字段
訪問靜態(tài)字段和訪問實例字段相似,看下面這個InstanceFieldAccess例子的變形:
class StaticFielcdAccess {
private static int si;
private native void accessField();
public static void main(String args[]) {
StaticFieldAccess c = new StaticFieldAccess();
StaticFieldAccess.si = 100;
c.accessField();
System.out.println("In Java:");
System.out.println(" StaticFieldAccess.si = " + si);
}
static {
System.loadLibrary("StaticFieldAccess");
}
}
StaticFieldAccess這個類包含一個靜態(tài)字段si,main方法創(chuàng)建了一個對象,初始化靜態(tài)字段,然后調(diào)用本地方法StaticFieldAccess.accessField在本地代碼中打印靜態(tài)字段中的值,然后設(shè)置新的值,為了演示這個值確實被改變了,在本地方法返回后,JAVA中再次這個靜態(tài)字段的值。
下面是本地方法StaticFieldAccess.accessField的實現(xiàn):
JNIEXPORT void JNICALL
Java_StaticFieldAccess_accessField(JNIEnv *env, jobject obj)
{
jfieldID fid; /* store the field ID */
jint si;
/* Get a reference to obj's class */
jclass cls = (*env)->GetObjectClass(env, obj);
printf("In C:\n");
/* Look for the static field si in cls */
fid = (*env)->GetStaticFieldID(env, cls, "si", "I");
if (fid == NULL) {
return; /* field not found */
}
/* Access the static field si */
si = (*env)->GetStaticIntField(env, cls, fid);
printf(" StaticFieldAccess.si = %d\n", si);
(*env)->SetStaticIntField(env, cls, fid, 200);
}
運行程序可得到輸出結(jié)果:
In C:
StaticFieldAccess.si = 100
In Java:
StaticFieldAccess.si = 200
Java簡介
它最初被命名為Oak,目標設(shè)定在家用電器等小型系統(tǒng)的編程語言,來解決諸如電視機、電話、鬧鐘、烤面包機等家用電器的控制和通訊問題。由于這些智能化家電的市場需求沒有預(yù)期的高,Sun放棄了該項計劃。就在Oak幾近失敗之時,隨著互聯(lián)網(wǎng)的發(fā)展,Sun看到了Oak在計算機網(wǎng)絡(luò)上的廣闊應(yīng)用前景,于是改造了Oak,以“Java”的名稱正式發(fā)布。
java標志
Java的主要工作是通過編程語言來制作互聯(lián)網(wǎng)頁面、制作動態(tài)效果以及網(wǎng)站等技術(shù),現(xiàn)在網(wǎng)上關(guān)于這方面的教程有很多,但很多都是過時的,因為互聯(lián)網(wǎng)是在不斷的變化的,互聯(lián)網(wǎng)上的牛人,要想成為Java大神,走進這條Java大神之群,首先Java教程的開頭是二三一,Java的最中間是三一四,Java的最后面再加上零二八,把前面的綜合起來,Java大神期待你的加入。這里有很多互聯(lián)網(wǎng)大牛教你學習,還有免費的課程。不是想學習的就不要加了。
Java 編程語言的風格十分接近C、C++語言。Java是一個純的面向?qū)ο蟮某绦蛟O(shè)計語言,它繼承了 C++ 語言面向?qū)ο蠹夹g(shù)的核心,Java舍棄了C ++語言中容易引起錯誤的指針(以引用取代)、運算符重載(operator overloading)、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的對象所占據(jù)的內(nèi)存空間,使得程序員不用再為內(nèi)存管理而擔憂。在 Java SE 1.5 版本中,Java 又引入了泛型編程(Generic Programming)、類型安全的枚舉、不定長參數(shù)和自動裝/拆箱等語言特性。
Java 不同于一般的編譯執(zhí)行計算機語言和解釋執(zhí)行計算機語言。它首先將源代碼編譯成二進制字節(jié)碼(bytecode),然后依賴各種不同平臺上的虛擬機來解釋執(zhí)行字節(jié)碼,從而實現(xiàn)了“一次編譯、到處執(zhí)行”的跨平臺特性。不過,每次的編譯執(zhí)行需要消耗一定的時間,這同時也在一定程度上降低了 Java 程序的運行效率。但在 J2SE 1.4.2 發(fā)布后,Java 的執(zhí)行速度有了大幅提升。
與傳統(tǒng)程序不同,Sun 公司在推出 Java 之際就將其作為一種開放的技術(shù)。全球數(shù)以萬計的 Java 開發(fā)公司被要求所設(shè)計的 Java 軟件必須相互兼容。“Java 語言靠群體的力量而非公司的力量”是 Sun 公司的口號之一,并獲得了廣大軟件開發(fā)商的認同。這與微軟公司所倡導(dǎo)的注重精英和封閉式的模式完全不同。
Sun 公司對 Java 編程語言的解釋是:Java 編程語言是個簡單、面向?qū)ο?、分布式、解釋性、健壯、安全與系統(tǒng)無關(guān)、可移植、高性能、多線程和動態(tài)的語言。
Java 平臺是基于 Java 語言的平臺。這樣的平臺目前非常流行,因此微軟公司推出了與之競爭的.NET平臺以及模仿 Java 的 C#語言。
Java名稱的由來
說起Java這個名稱是怎么來的,在世界上還流傳著不同版本的傳說。
1.咖啡說
java之父
1995年,SUN公司和好萊塢準備開展一個技術(shù)交流會,皆以宣傳公司的產(chǎn)品。James Gosling帶著他的系統(tǒng)來到了技術(shù)交流會。但他不能用OAK這個名字了。OAK已經(jīng)被一家半導(dǎo)體公司注冊了,并且注冊了好多領(lǐng)域,只能換名。James Gosling四處觀望尋找靈感,他看到了一個泡咖啡的杯子,杯子上印著Java,James Gosling就把這種語言改名為Java。
2.度假說
1994年6、7月間,在經(jīng)歷了一場歷時三天的頭腦風暴的討論后,Green團隊決定再一次改變了努力的目標,這次他們決定將該技術(shù)應(yīng)用于萬維網(wǎng)。他們認為隨著Mosaic瀏覽器的到來,因特網(wǎng)正在向同樣的高度互動的遠景演變,而這一遠景正是他們在有線電視網(wǎng)中看到的。此時Green小組組員正在在印度尼西亞爪哇島(Java)度假時,于是他們把Oak改名為Java。
3.簡寫說
Java命名來源于開發(fā)人員名字的組合:James Gosling、Arthur Van Hoff和Andy Bechtolsheim首字母的縮寫。
4.頭腦風暴說
關(guān)于Java命名的由來,James Gosling是曾經(jīng)這樣回答過Jonathan Schwartz,原文如下:
From: James Gosling
Date: August 24, 2007 8:16:58 PM PDT
To: Jonathan Schwartz
Subject: How was Java named?
The story goes like this:
We needed a name. We had been using "oak" (which was selected essentially randomly by me), and while the team had grown attached to it, the trademark lawyers ruled it out. We had lots of email debates about names, but nothing got resolved. We ended up in the awkward position where the #1 thing stopping us from shipping was the name.
Our marketing lead knew someone who was a "naming consultant" (I don't remember his name, but he was great). We could neither afford the price nor the time of a conventional product naming process. He agreed to do something rather odd, but effective and quick: he acted as a facilitator at a meeting where about a dozen of us locked ourselves in a room for an afternoon. He started asking us questions like "How does this thing make you feel?" (Excited!) "What else makes you feel that way?" (Java!) We ended up with a board covered with essentially random words. Then he put us through a sorting process where we ended up with a ranking of the names. We ended up with a dozen name candidates and sent them off to the lawyers: they worked down the list until they hit one that cleared their search.
"Java" was the fourth name on the list. The first name on the list was "Silk", which I hated but everyone else liked. My favorite was "Lyric", the third one on the list, but it didn't pass the lawyers test. I don't remember what the other candidate names where.
So, who named Java? Marketing organized the meeting, the consultant ran it, and a whole pile of us did a lot of yelling out of random words. I'm honestly not real sure who said "Java" first, but I'm pretty sure it was Mark Opperman.
There certainly wasn't any brilliant marketing mind who went through a coherent thought process.
中文翻譯如下:
我們需要一個名字。我們已經(jīng)使用了oak(那是我隨機挑選的),然而當開發(fā)團隊接觸它的時候,這個商標已經(jīng)被律師排除了。我們收到許多關(guān)于命名爭論的電子郵件,但是問題沒有解決。我們需要結(jié)束這種棘手的處境,阻撓我們前進的首要問題就是這命名。
我們市場部領(lǐng)導(dǎo)了解到某人是“命名顧問”(我不記得他的名字了,但是他是很棒)。我們既不可能提供金錢也不可能提供時間用于常規(guī)產(chǎn)品的命名過程。他同意做個臨時的事,但是要高效和快捷:一天下午,我們大概十二個人將自己鎖在一個房間內(nèi),他在會上充當一個主持人。他讓我們寫一些名稱來做一個挑選。我們最終寫了十二個候選名稱,并且將其送達給律師團審閱。律師團看了列表,選定了能排出其它名稱的候選項。“Java”是列表里的第四個名稱。列表里的第一個名稱是“Silk”,那是我討厭但是其他人喜歡的名稱。我最喜歡的是列表里的第三個名稱“Lyric”,但是它沒有通過律師團的審核。我不記得其它候選名稱了。
為什么命名Java呢?市場部組織了一個會議,顧問提名,我們?nèi)w人員喊出隨機的詞語。說實話,我真的不確定誰最先說“Java”,但是我有很有把握說這人是Mark Opperman。
確實不存在任何杰出的市場理念能夠通過一致的認可。
看了java中什么是字段還看: