java中什么是字段
java中什么是字段
java是一種編程語(yǔ)言,有很多人也好奇java中的字段到底是什么意思。下面小編為大家分享的是java中的字段意思的內(nèi)容介紹,歡迎閱讀!
Java 中的字段含義
我們把表中的每一行叫做一個(gè)“記錄”,每一個(gè)記錄包含這行中的所有信息,就像在通訊錄數(shù)據(jù)庫(kù)中某個(gè)人全部的信息,但記錄在數(shù)據(jù)庫(kù)中并沒(méi)有專門的記錄名,常常用它所在的行數(shù)表示這是第幾個(gè)記錄。在數(shù)據(jù)庫(kù)中存放在表行列交叉處的數(shù)據(jù)叫做“值”,它是數(shù)據(jù)庫(kù)中最基本的存儲(chǔ)單元,它的位置要由這個(gè)表中的記錄和字段來(lái)定義。
JAVA支持兩種field(字段),每一個(gè)對(duì)象的實(shí)例都有一個(gè)對(duì)象字段的復(fù)制;所有的對(duì)象共享一個(gè)類的靜態(tài)字段。本地方法使用JNI提供的函數(shù)可以獲取和修改這兩種字段。先看一個(gè)從本地代碼中訪問(wèn)對(duì)象字段的例子:
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這個(gè)類定義了一個(gè)對(duì)象字段s。main方法創(chuàng)建了一個(gè)對(duì)象并設(shè)置s的值,然后調(diào)用本地方法InstanceFieldAccess.accessField在本地代碼中打印s的值,并把它修改為一個(gè)新值。本地方法返回后,JAVA中把這個(gè)值再打印一次,可以看出來(lái),字段s的值已經(jīng)被改變了。下面是本地方法的實(shí)現(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);
}
運(yùn)行程序,得到輸出為:
In C:
c.s = "abc"
In Java:
c.s = "123"
4.1.1 訪問(wèn)一個(gè)對(duì)象字段的流程
為了訪問(wèn)一個(gè)對(duì)象的實(shí)例字段,本地方法需要做兩步:
首先,通過(guò)在類引用上調(diào)用GetFieldID獲取field ID(字段ID)、字段名字和字段描述符:
Fid=(*env)->GetFieldID(env,cls,”s”,”Ljava/lang/String;”);
上例中的代碼通過(guò)在對(duì)象引用obj上調(diào)用GetObjectClass獲取到類引用。一旦獲取到字段ID,你就可以把對(duì)象和字段ID作為參數(shù)來(lái)訪問(wèn)字段:
Jstr=(*env)->GetObjectField(env,obj,fid);
因?yàn)樽址蛿?shù)組是特殊的對(duì)象,所以我們使用GetObjectField來(lái)訪問(wèn)字符串類型的實(shí)例字段。除了Get/SetObjectField,JNI還支持其它如GetIntField、SetFloatField等用來(lái)訪問(wèn)基本類型字段的函數(shù)。
4.1.2 字段描述符
在上一節(jié)我們使用過(guò)一個(gè)特殊的C字符串“Ljava/lang/String”來(lái)代表一個(gè)JVM中的字段類型。這個(gè)字符串被稱為JNI field descriptor(字段描述符)。
字符串的內(nèi)容由字段被聲明的類型決定。例如,使用“I”來(lái)表示一個(gè)int類型的字段,“F”來(lái)表示一個(gè)float類型的字段,“D”來(lái)表示一個(gè)double類型的字段,“Z”來(lái)表示一個(gè)boolean類型的字段等等。
像java.lang.String這樣的引用類型的描述符都是以L開(kāi)頭,后面跟著一個(gè)JNI類描述符,以分號(hào)結(jié)尾。一個(gè)JAVA類的全名中的包名分隔符“.”被轉(zhuǎn)化成“/”。因此,對(duì)于一個(gè)字段類型的字段來(lái)說(shuō),它的描述符是“Ljava/lang/String”。
數(shù)組的描述符中包含“]”字符,后面會(huì)跟著數(shù)組類型的描述符,如“[I”是int[]類型的字段的描述符。12.3.3詳細(xì)介紹了各種類型的字段描述以及他們代表的JAVA類型。
你可以使用javap工具來(lái)生成字段描述符。
4.1.3 訪問(wèn)靜態(tài)字段
訪問(wèn)靜態(tài)字段和訪問(wèn)實(shí)例字段相似,看下面這個(gè)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這個(gè)類包含一個(gè)靜態(tài)字段si,main方法創(chuàng)建了一個(gè)對(duì)象,初始化靜態(tài)字段,然后調(diào)用本地方法StaticFieldAccess.accessField在本地代碼中打印靜態(tài)字段中的值,然后設(shè)置新的值,為了演示這個(gè)值確實(shí)被改變了,在本地方法返回后,JAVA中再次這個(gè)靜態(tài)字段的值。
下面是本地方法StaticFieldAccess.accessField的實(shí)現(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);
}
運(yùn)行程序可得到輸出結(jié)果:
In C:
StaticFieldAccess.si = 100
In Java:
StaticFieldAccess.si = 200
Java簡(jiǎn)介
它最初被命名為Oak,目標(biāo)設(shè)定在家用電器等小型系統(tǒng)的編程語(yǔ)言,來(lái)解決諸如電視機(jī)、電話、鬧鐘、烤面包機(jī)等家用電器的控制和通訊問(wèn)題。由于這些智能化家電的市場(chǎng)需求沒(méi)有預(yù)期的高,Sun放棄了該項(xiàng)計(jì)劃。就在Oak幾近失敗之時(shí),隨著互聯(lián)網(wǎng)的發(fā)展,Sun看到了Oak在計(jì)算機(jī)網(wǎng)絡(luò)上的廣闊應(yīng)用前景,于是改造了Oak,以“Java”的名稱正式發(fā)布。
java標(biāo)志
Java的主要工作是通過(guò)編程語(yǔ)言來(lái)制作互聯(lián)網(wǎng)頁(yè)面、制作動(dòng)態(tài)效果以及網(wǎng)站等技術(shù),現(xiàn)在網(wǎng)上關(guān)于這方面的教程有很多,但很多都是過(guò)時(shí)的,因?yàn)榛ヂ?lián)網(wǎng)是在不斷的變化的,互聯(lián)網(wǎng)上的牛人,要想成為Java大神,走進(jìn)這條Java大神之群,首先Java教程的開(kāi)頭是二三一,Java的最中間是三一四,Java的最后面再加上零二八,把前面的綜合起來(lái),Java大神期待你的加入。這里有很多互聯(lián)網(wǎng)大牛教你學(xué)習(xí),還有免費(fèi)的課程。不是想學(xué)習(xí)的就不要加了。
Java 編程語(yǔ)言的風(fēng)格十分接近C、C++語(yǔ)言。Java是一個(gè)純的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,它繼承了 C++ 語(yǔ)言面向?qū)ο蠹夹g(shù)的核心,Java舍棄了C ++語(yǔ)言中容易引起錯(cuò)誤的指針(以引用取代)、運(yùn)算符重載(operator overloading)、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的對(duì)象所占據(jù)的內(nèi)存空間,使得程序員不用再為內(nèi)存管理而擔(dān)憂。在 Java SE 1.5 版本中,Java 又引入了泛型編程(Generic Programming)、類型安全的枚舉、不定長(zhǎng)參數(shù)和自動(dòng)裝/拆箱等語(yǔ)言特性。
Java 不同于一般的編譯執(zhí)行計(jì)算機(jī)語(yǔ)言和解釋執(zhí)行計(jì)算機(jī)語(yǔ)言。它首先將源代碼編譯成二進(jìn)制字節(jié)碼(bytecode),然后依賴各種不同平臺(tái)上的虛擬機(jī)來(lái)解釋執(zhí)行字節(jié)碼,從而實(shí)現(xiàn)了“一次編譯、到處執(zhí)行”的跨平臺(tái)特性。不過(guò),每次的編譯執(zhí)行需要消耗一定的時(shí)間,這同時(shí)也在一定程度上降低了 Java 程序的運(yùn)行效率。但在 J2SE 1.4.2 發(fā)布后,Java 的執(zhí)行速度有了大幅提升。
與傳統(tǒng)程序不同,Sun 公司在推出 Java 之際就將其作為一種開(kāi)放的技術(shù)。全球數(shù)以萬(wàn)計(jì)的 Java 開(kāi)發(fā)公司被要求所設(shè)計(jì)的 Java 軟件必須相互兼容。“Java 語(yǔ)言靠群體的力量而非公司的力量”是 Sun 公司的口號(hào)之一,并獲得了廣大軟件開(kāi)發(fā)商的認(rèn)同。這與微軟公司所倡導(dǎo)的注重精英和封閉式的模式完全不同。
Sun 公司對(duì) Java 編程語(yǔ)言的解釋是:Java 編程語(yǔ)言是個(gè)簡(jiǎn)單、面向?qū)ο?、分布式、解釋性、健壯、安全與系統(tǒng)無(wú)關(guān)、可移植、高性能、多線程和動(dòng)態(tài)的語(yǔ)言。
Java 平臺(tái)是基于 Java 語(yǔ)言的平臺(tái)。這樣的平臺(tái)目前非常流行,因此微軟公司推出了與之競(jìng)爭(zhēng)的.NET平臺(tái)以及模仿 Java 的 C#語(yǔ)言。
Java名稱的由來(lái)
說(shuō)起Java這個(gè)名稱是怎么來(lái)的,在世界上還流傳著不同版本的傳說(shuō)。
1.咖啡說(shuō)
java之父
1995年,SUN公司和好萊塢準(zhǔn)備開(kāi)展一個(gè)技術(shù)交流會(huì),皆以宣傳公司的產(chǎn)品。James Gosling帶著他的系統(tǒng)來(lái)到了技術(shù)交流會(huì)。但他不能用OAK這個(gè)名字了。OAK已經(jīng)被一家半導(dǎo)體公司注冊(cè)了,并且注冊(cè)了好多領(lǐng)域,只能換名。James Gosling四處觀望尋找靈感,他看到了一個(gè)泡咖啡的杯子,杯子上印著Java,James Gosling就把這種語(yǔ)言改名為Java。
2.度假說(shuō)
1994年6、7月間,在經(jīng)歷了一場(chǎng)歷時(shí)三天的頭腦風(fēng)暴的討論后,Green團(tuán)隊(duì)決定再一次改變了努力的目標(biāo),這次他們決定將該技術(shù)應(yīng)用于萬(wàn)維網(wǎng)。他們認(rèn)為隨著Mosaic瀏覽器的到來(lái),因特網(wǎng)正在向同樣的高度互動(dòng)的遠(yuǎn)景演變,而這一遠(yuǎn)景正是他們?cè)谟芯€電視網(wǎng)中看到的。此時(shí)Green小組組員正在在印度尼西亞爪哇島(Java)度假時(shí),于是他們把Oak改名為Java。
3.簡(jiǎn)寫說(shuō)
Java命名來(lái)源于開(kāi)發(fā)人員名字的組合:James Gosling、Arthur Van Hoff和Andy Bechtolsheim首字母的縮寫。
4.頭腦風(fēng)暴說(shuō)
關(guān)于Java命名的由來(lái),James Gosling是曾經(jīng)這樣回答過(guò)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.
中文翻譯如下:
我們需要一個(gè)名字。我們已經(jīng)使用了oak(那是我隨機(jī)挑選的),然而當(dāng)開(kāi)發(fā)團(tuán)隊(duì)接觸它的時(shí)候,這個(gè)商標(biāo)已經(jīng)被律師排除了。我們收到許多關(guān)于命名爭(zhēng)論的電子郵件,但是問(wèn)題沒(méi)有解決。我們需要結(jié)束這種棘手的處境,阻撓我們前進(jìn)的首要問(wèn)題就是這命名。
我們市場(chǎng)部領(lǐng)導(dǎo)了解到某人是“命名顧問(wèn)”(我不記得他的名字了,但是他是很棒)。我們既不可能提供金錢也不可能提供時(shí)間用于常規(guī)產(chǎn)品的命名過(guò)程。他同意做個(gè)臨時(shí)的事,但是要高效和快捷:一天下午,我們大概十二個(gè)人將自己鎖在一個(gè)房間內(nèi),他在會(huì)上充當(dāng)一個(gè)主持人。他讓我們寫一些名稱來(lái)做一個(gè)挑選。我們最終寫了十二個(gè)候選名稱,并且將其送達(dá)給律師團(tuán)審閱。律師團(tuán)看了列表,選定了能排出其它名稱的候選項(xiàng)。“Java”是列表里的第四個(gè)名稱。列表里的第一個(gè)名稱是“Silk”,那是我討厭但是其他人喜歡的名稱。我最喜歡的是列表里的第三個(gè)名稱“Lyric”,但是它沒(méi)有通過(guò)律師團(tuán)的審核。我不記得其它候選名稱了。
為什么命名Java呢?市場(chǎng)部組織了一個(gè)會(huì)議,顧問(wèn)提名,我們?nèi)w人員喊出隨機(jī)的詞語(yǔ)。說(shuō)實(shí)話,我真的不確定誰(shuí)最先說(shuō)“Java”,但是我有很有把握說(shuō)這人是Mark Opperman。
確實(shí)不存在任何杰出的市場(chǎng)理念能夠通過(guò)一致的認(rèn)可。
看了java中什么是字段還看:
2.java簡(jiǎn)歷中的項(xiàng)目經(jīng)驗(yàn)怎么寫