java類與欄位
① java里的「欄位」是什麼
在api文檔中可見「欄位摘要」,其中的「欄位」可以理解為類中的成員變數或成員常量。
② JAVA中 類、對象、成員與欄位的區別
類就是某一類事物的抽象描述
對象是 類的具體實例
成員是類中的 組成部分
欄位和成員類似
比如:
家 //這就是一個類,在這個家中你也不知道具體有哪些事物
父親 //這是一個類的成員,當類沒有實例化時,你也不知道具體是誰
地址 //這是一個欄位 當類沒有實例化對象時,你也不知道其具體值是啥
小明家 //這就是一個對象,你知道這個家裡有哪些人哪些物
小明的父親 //當類被實例化成對象時,其成員也就確定下來了。
北京新村2號 //這個地址也就確定下來了
③ java "欄位"啥意思
public final static InputStream in = nullInputStream();
nullInputStream是這樣實現的:
private static InputStream nullInputStream() throws NullPointerException {
if (currentTimeMillis() > 0)
return null;
throw new NullPointerException();
}
他不是返回null,就是拋出異常,如何初始化in呢?
解答:
看了一下java.lang.System的源代碼.
System類里有大量的native方法,是調用本地代碼的,這些代碼很可能是由虛擬機來調用的.
System類的開頭有一段:
static {
registerNatives();
}
這段代碼會在虛擬機啟動的時候就執行,它在虛擬機里注冊System需要使用的一些本地代碼
比如:
private static native Properties initProperties(Properties props);
private static native void setOut0(PrintStream out);
在windows下的話,它就告訴虛擬機到哪個dll文件里去找相應的實現
>然而,我知道out是一個PrintStream的對象,但我查看了有關的原代碼:public final static PrintStream out = nullPrintStream();
>public final static InputStream in = nullInputStream();
在nullInputStream()方法里有注釋解釋為什麼會設置為空:
/**
* The following two methods exist because in, out, and err must be
* initialized to null. The compiler, however, cannot be permitted to
* inline access to them, since they are later set to more sensible values
* by initializeSystemClass().
*/
private static InputStream nullInputStream() throws NullPointerException {
if (currentTimeMillis() > 0)
return null;
throw new NullPointerException();
}
也就說in, out, and err 初始化為null,然後會在後來由initializeSystemClass()方法類初始化成有意義的值
/**
* Initialize the system class. Called after thread initialization.
*/
private static void initializeSystemClass() {
props = new Properties();
initProperties(props);
sun.misc.Version.init();
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
setIn0(new BufferedInputStream(fdIn)); !!!
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); !!!
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true)); !!!
// Enough of the world is now in place that we can risk
// initializing the logging configuration.
try {
java.util.logging.LogManager.getLogManager().readConfiguration();
} catch (Exception ex) {
// System.err.println("Can′t read logging configuration:");
// ex.printStackTrace();
}
// Load the zip library now in order to keep java.util.zip.ZipFile
// from trying to use itself to load this library later.
loadLibrary("zip");
// Subsystems that are invoked ring initialization can invoke
// sun.misc.VM.isBooted() in order to avoid doing things that should
// wait until the application class loader has been set up.
sun.misc.VM.booted();
}
in,out,err就是在以上方法以下三條語句里初始化的.
setIn0(new BufferedInputStream(fdIn)); !!!
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); !!!
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true)); !!!
看
private static native void setIn0(InputStream in);
~~~~~~~
這是個native函數,是前面registerNatives()的時候注冊了的.這個函數應該是把實際連接到輸入輸出設備的句柄傳給虛擬機並賦值給in,out,err
至於:
>InputStream是個抽象的類,怎麼能使用char=(char)System.in.read()讀入一個字元
我想你還沒有明白什麼是面向對象.
看看下面代碼,我用OutputStream(也是抽象類,跟InputStream對應的輸出類)以方便演示:
import java.io.IOException;
import java.io.OutputStream;
public class HelloWorld {
public OutputStream out=null;
public void setOutputStream(OutputStream out){
this.out=out;
}
public static void main(String[] args) throws IOException{
HelloWorld h=new HelloWorld();
PrintStream myOut=System.out;//System.out是一個PrintStream
h.setOutputStream(myOut);
h.out.write("hello,world".getBytes());//一般沒人這么寫的
}
}
以上代碼執行後會輸出hello,world
h.out是OutputStream,也是個抽象類,為什麼能write(o)呢?
因為PrintStream是OutputStream的子類,所以能被"當作"OutputStream傳給h.setOutputStream(myOut);
h.out.write執行的時候實際上是調用這個傳進來的PrintStream實例的write方法
同樣System.in和out肯定也是在initializeSystemClass()的時候被賦予了一個實際的可用的子類
要能體會到面向對象的好處,就要逐漸適應"對介面編程"的思想,相同介面的對象可以根據需要方便的替換.
比如,我剛才傳了一個PrintStream,因此HelloWorld輸出到了屏幕上. 我如果傳給OutputStream的另一個子類FileOutputStream,就會輸出到文件里
>還有為什麼不是說字元流:writer和reader一般用於UniCode的讀寫嗎?為什麼鍵盤的輸入用reader類呢?
不知道你在哪裡看到說writer和reader一般用於UniCode的讀寫
④ Java的屬性與欄位有什麼區別
1、Java中的屬性和字棚姿汪段有什麼區別?
答:Java中的屬性,通常可以理解為get和set方法。而字冊如段,通常叫做「類成員」。
這兩個概念是完全不同的。
屬性只局限於類中方法的聲明,並不與類中其他成員相關。例如:
void setA(String s){}
String getA(){}
當一個類中擁有這樣一對方法時,我們可以說,這個類中擁有一個可讀寫的a屬性(注意是小寫a)。如果去掉了set的方法,則是可讀屬性,反之亦然。
類成員(欄位),通常是在類中定義的類成員變數,例如:
public class A{
private String s = "123";
}
我們可以說A類中有一個成員變數叫鏈仔做s。
⑤ JAVA中 類、對象、成員與欄位的區別
類裡面
屬性,欄位,方法
類聲明前必須加訪問修飾符。而且一個類裡面只能有一個public class類
舉個例子
萬物都是對象。比余或碰如人,汽車,船 等等
類裡面團廳得屬性叫做成員
舉個例子
//類
public class Car() //方法體
{
//可以有方法和屬性
先定義屬性即成員
String name; //車名
int size; //大小
String col; //顏色
public static void play( String name)
{
System.out.print(da)
public static void main(String [] args)
{
Car c=new Car();//c 就是一個對象
car.play();
}
}
}//大括弧就是方法體可以在裡面定義方法
剛豎談寫得有不懂可以問我
⑥ Java自定義註解註解實現實體類與資料庫表欄位的映射
這個 按照我的理解
首先自定義註解要有自己的編譯解釋方法的
在這個便已解釋方法中估計需要連接資料庫(當然最激賀薯基本的jdbc什麼的)
當然連接資料庫什麼的涉及到配置文件
通過jdbc獲取到資料庫信息 把註解中的參數與資料庫中的信息關聯(簡單的就可以存成List<Map等方式)由於註解的參數一般是類名。你可以 用反射的方式或其他方式(比如位元組碼什麼的)來處理獲拍鋒取類的屬性
然後 我感覺關聯完了 就沒啥然後了 感覺主要是在註解的編譯解釋方法中做明者寫東西 當然 提高效率也可以用資料庫連接池什麼的
⑦ java中類的欄位為什麼都要設為私有的
欄位設為私有,是滿足面向對象中封裝性,
一個類不建議允許直接獲取到另一個類的欄位,
同時也不建議直接把自身欄位暴露給另一個類,
本質上其實是為了隱藏具體實現,
同時,用get或者set方法來獲取或者設置的話,可以在該方法中添加一些簡單的驗證邏輯,
比方說有個學生類,其中有個年齡欄位,如果直接做成public的話,那麼這個年齡欄位可以設置為負值,
但是你做成了set方法的時候,你調用set設置年齡,那麼你可以在set方法中去對為負數的年齡進行驗證處理
Java面向對象類和類之間的關系教程:
⑧ java中string類型欄位-1等於什麼
熱門頻道
首頁
博客
研修院
VIP
APP
問答
下載
社區
推薦頻道
活動
招聘
專題
打開CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
java
打開APP
章魚四劍客
關注
Java—String類—1 原創
2019-01-06 18:59:19
1點贊
章魚四劍客
碼齡5年
關注
Java—String類—1
實例化方法
直接賦值/構造法
字元串相等比較
兩種方法:
」==「:進行的數值比較,比較的是兩個字元串對象的內存地址數毀侍值
「equals」:可以進行字元串內容比較
字元串常量是String的匿名對象
在java中本身沒有提供字元串常量的概念,所有使用「」定義的內容本質上來講都是String的匿名對象。
驗證
Tips:在用equals方法對指定字元串和用戶輸入字元串進行比較時,指定字元串方到前面,因為用戶可能沒有輸入
發生NullPointerCase空指針異常
實例化區別
1.採用直接賦值
是這個樣子呢?
以上這種情況說明,三塊對象引用指向一塊空間;
其實,java採用的是共享機制
在JVM底層實際上回自動維護一個對象池,如果現在採用直接賦值對對象進行實例化,那麼該實例化對象(字元串內容)會自動保存到該對象池中。如果下次再繼續使用直接賦值的模式聲明String類對象,此時對象池中如果有指定內容,將直接進行引用;如若沒有,則開辟新字元串對象而後將其保存在對象池中下次使用。
2.採用構造法
構造法:
1.會產生兩塊空間,其中一塊,變成垃圾空間;
2.不會自動入池,但是可以手動入池intern()方法;
在這里插入圖片描述
比較:
1.直接賦值,產生一塊堆空間,並且字元串對象可以自動保存在對象池中以供瞎使用;
2.構昌者造方法:會開辟兩塊堆空間,其中一塊變成垃圾空間,不會自動保存到對象池中,可耐余薯以用intern()自動賦值
字元串不可變更
在這里插入圖片描述
首先我們可以看出,字元串的內容不能改變,最後輸出的不是初始值,是因為改變的是對象的引用指向;並且,每進行一次加操作,就會產生兩塊垃圾空間,所以java中盡量不要使用「+」操作。但是其實java在進行+操作時,會自動將Strin
⑨ java實體類如何加入虛擬欄位
java實體類加入虛擬欄位的步驟如下:
1、一旦變數被transient修飾,變數將不再是對象持久化的一部分,該變數內容在序列化後無法獲得訪問。
2、transient關鍵字只能修飾變數,而不能修飾方法和類。注意,本地變數是不能被transient關鍵字修飾的。變數如果是用戶自定義類變數,則該類需要實現Serializable介面。
3、被transient關鍵字修飾的變數不再能被序列化,一個靜態變數不管是否被transient修飾,均不能被序列化。