java的数据类型、变量类型笔记总结
1. 引用類型
- 在Java中,引用類型的變量非常類似于C/C++的指針。引用類型指向一個對象,指向對象的變量是引用變量。這些變量在聲明時被指定為一個特定的類型,比如 Employee、Puppy 等。變量一旦聲明后,類型就不能被改變了。
- 對象、數組都是引用數據類型。
- 所有引用類型的默認值都是null。
- 一個引用變量可以用來引用任何與之兼容的類型。
例子:Site site = new Site(“Runoob”)。
引用類型是一個對象類型,它的值是指向內存空間的引用,就是地址,所指向的內存中保存著變量所表示的一個值或一組值。
int a; a = 250; // 聲明變量a的同時,系統給a分配了空間。引用類型就不是了,只給變量分配了引用空間,數據空間沒有分配,因為不知道數據是什么。
錯誤的例子:
引用類型變量在聲明后必須通過實例化開辟數據空間,才能對變量所指向的對象進行訪問。
MyDate today; //將變量分配一個保存引用的空間 today = new MyDate(); // 這句話是2步,首先執行new MyDate(),給today變量開辟數據空間,然后再執行賦值操作引用變量賦值:
MyDate a,b; // 在內存開辟兩個引用空間 a = new MyDate(); // 開辟MyDate對象的數據空間,并把該空間的首地址賦給a b = a; // 將a存儲空間中的地址寫到b的存儲空間中其中new關鍵字的作用之一就是為對象分配內存空間。
2. 數據類型轉換的補充
2.1、包裝類過渡類型轉換
一般情況下,我們首先聲明一個變量,然后生成一個對應的包裝類,就可以利用包裝類的各種方法進行類型轉換了。例如:
當希望把float型轉換為double型時:
簡單類型的變量轉換為相應的包裝類,可以利用包裝類的構造函數。即:Boolean(boolean value)、Character(char value)、Integer(int value)、Long(long value)、Float(float value)、Double(double value)
而在各個包裝類中,總有形為××Value()的方法,來得到其對應的簡單類型數據。利用這種方法,也可以實現不同數值型變量間的轉換,例如,對于一個雙精度實型類,intValue()可以得到其對應的整型變量,而doubleValue()可以得到其對應的雙精度實型變量。
2.2、字符串與其它類型間的轉換
其它類型向字符串的轉換
調用類的串轉換方法:X.toString();
自動轉換:X+”“;
使用String的方法:String.valueOf(X);
2.3、字符串作為值,向其它類型的轉換
1、先轉換成相應的封裝器實例,再調用對應的方法轉換成其它類型
例如,字符中”32.1”轉換double型的值的格式為:new Float(“32.1”).doubleValue()。也可以用:Double.valueOf(“32.1”).doubleValue()
2、靜態parseXXX方法
3、Character的getNumericValue(char ch)方法
2.4、Date類與其它數據類型的相互轉換
整型和Date類之間并不存在直接的對應關系,只是你可以使用int型為分別表示年、月、日、時、分、秒,這樣就在兩者之間建立了一個對應關系,在作這種轉換時,你可以使用Date類構造函數的三種形式:
Date(int year, int month, int date):以int型表示年、月、日
Date(int year, int month, int date, int hrs, int min):以int型表示年、月、日、時、分
Date(int year, int month, int date, int hrs, int min, int sec):以int型表示年、月、日、時、分、秒
在長整型和Date類之間有一個很有趣的對應關系,就是將一個時間表示為距離格林尼治標準時間1970年1月1日0時0分0秒的毫秒數。對于這種對應關系,Date類也有其相應的構造函數:Date(long date)。
獲取Date類中的年、月、日、時、分、秒以及星期你可以使用Date類的getYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getDay()方法,你也可以將其理解為將Date類轉換成int。
而Date類的getTime()方法可以得到我們前面所說的一個時間對應的長整型數,與包裝類一樣,Date類也有一個toString()方法可以將其轉換為String類。
有時我們希望得到Date的特定格式,例如20020324,我們可以使用以下方法,首先在文件開始引入:
總結:
1、只有 boolean 不參與數據類型的轉換
2、自動類型的轉換:
a.常數在表數范圍內是能夠自動類型轉換的
b.數據范圍小的能夠自動數據類型大的轉換(注意特例)
c. float 到 int,float 到 long,double 到 int,double 到 long 等由浮點類型轉換成整數類型時,是不會自動轉換的,不然將會丟失精度。
d.引用類型能夠自動轉換為父類的
e.基本類型和它們包裝類型是能夠互相轉換的
3. java語言支持的變量類型
- 類變量:獨立于方法之外的變量,用 static 修飾。
- 實例變量:獨立于方法之外的變量,不過沒有 static 修飾。
- 局部變量:類的方法中的變量。
3.1 Java 局部變量
局部變量聲明在方法、構造方法或者語句塊中;
局部變量在方法、構造方法、或者語句塊被執行的時候創建,當它們執行完成后,變量將會被銷毀;
訪問修飾符不能用于局部變量;
局部變量只在聲明它的方法、構造方法或者語句塊中可見;
局部變量是在棧上分配的。
局部變量沒有默認值,所以局部變量被聲明后,必須經過初始化,才可以使用。
3.2 實例變量
實例變量聲明在一個類中,但在方法、構造方法和語句塊之外;
當一個對象被實例化之后,每個實例變量的值就跟著確定;
實例變量在對象創建的時候創建,在對象被銷毀的時候銷毀;
實例變量的值應該至少被一個方法、構造方法或者語句塊引用,使得外部能夠通過這些方式獲取實例變量信息;
實例變量可以聲明在使用前或者使用后;
訪問修飾符可以修飾實例變量;
實例變量對于類中的方法、構造方法或者語句塊是可見的。一般情況下應該把實例變量設為私有。通過使用訪問修飾符可以使實例變量對子類可見;
實例變量具有默認值。數值型變量的默認值是0,布爾型變量的默認值是false,引用類型變量的默認值是null。變量的值可以在聲明時指定,也可以在構造方法中指定;
實例變量可以直接通過變量名訪問。但在靜態方法以及其他類中,就應該使用完全限定名:ObejectReference.VariableName。
3.3 類變量(靜態變量)
類變量也稱為靜態變量,在類中以static關鍵字聲明,但必須在方法構造方法和語句塊之外。
無論一個類創建了多少個對象,類只擁有類變量的一份拷貝。
靜態變量除了被聲明為常量外很少使用。常量是指聲明為public/private,final和static類型的變量。常量初始化后不可改變。
靜態變量儲存在靜態存儲區。經常被聲明為常量,很少單獨使用static聲明變量。
靜態變量在程序開始時創建,在程序結束時銷毀。
與實例變量具有相似的可見性。但為了對類的使用者可見,大多數靜態變量聲明為public類型。
默認值和實例變量相似。數值型變量默認值是0,布爾型默認值是false,引用類型默認值是null。變量的值可以在聲明的時候指定,也可以在構造方法中指定。此外,靜態變量還可以在靜態語句塊中初始化。
靜態變量可以通過:ClassName.VariableName的方式訪問。
類變量被聲明為public static final類型時,類變量名稱一般建議使用大寫字母。如果靜態變量不是public和final類型,其命名方式與實例變量以及局部變量的命名方式一致。
4 Java 中靜態變量和實例變量區別
- 靜態變量屬于類,該類不生產對象,通過類名就可以調用靜態變量。
- 實例變量屬于該類的對象,必須產生該類對象,才能調用實例變量。
在程序運行時的區別:
- 實例變量屬于某個對象的屬性,必須創建了實例對象,其中的實例變量才會被分配空間,才能使用這個實例變量。
- 靜態變量不屬于某個實例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節碼,不用創建任何實例對象,靜態變量就會被分配空間,靜態變量就可以被使用了。
總之,實例變量必須創建對象后才可以通過這個對象來使用,靜態變量則可以直接使用類名來引用。
例如,對于下面的程序,無論創建多少個實例對象,
永遠都只分配了一個 staticInt 變量,并且每創建一個實例對象,這個 staticInt 就會加 1;但是,每創建一個實例對象,就會分配一個 random,
即可能分配多個 random ,并且每個 random 的值都只自加了1次。
執行以上程序,輸出結果為:
staticInt = 3 random = 3 staticInt = 4 random = 35. java 實例變量在整個類內部是可訪問的,而不管實例變量聲明在類的哪個位置。
import java.io.*;public class Employee{public Employee (String empName){name = empName;}public void setSalary(double empSal){salary = empSal;}public void printEmp(){System.out.println("name:" + name);System.out.println("salary:" + salary);}public static void main(String args[]){Employee empOne = new Employee("RUNOOB");empOne.setSalary(1000);empOne.printEmp();System.out.println(empOne.salary);}public String name;private double salary; }比如在上面代碼中,盡管實例變量聲明在類的尾部,在之前方法中仍可訪問。
6. 是否可以從一個static方法內部發出對非static方法的調用?
public class Xix {// 靜態成員 public static String string="static成員";// 普通成員public String string2="非static成員";// 靜態方法public static void method(){string="sss";//string2="sss";編譯報錯,因為靜態方法里面只能調用靜態方法或靜態成員//method2();System.out.println("這是static方法,static方法與對象無關");}// 普通方法 public void method2(){string ="string1";string2="string2";method(); //非靜態方法里面可以發出對static方法的調用System.out.println("這是非static方法,此方法必須和指定的對象關聯起來才起作用");}public static void main(String[] args) {Xix x=new Xix();x.method2();// 引用調用普通方法 x.method();// 引用調用靜態方法} }運行結果:
這是static方法,static方法與對象無關 這是非static方法,此方法必須和指定的對象關聯起來才起作用 這是static方法,static方法與對象無關結論:
不可以。因為非static方法是要與對象關聯在一起的,必須創建一個對象后,才可以在該對象上進行方法調用,而static方法調用時不需要創建對象,可以直接調用。也就是說,當一個static方法被調用時,可能還沒有創建任何實例對象,如果從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪個對象上的呢?這個邏輯無法成立,所以,一個static方法內部無法發出對非static方法的調用。
摘自:http://www.runoob.com/java/java-variable-types.html
總結
以上是生活随笔為你收集整理的java的数据类型、变量类型笔记总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 放倒师妃暄txt(放倒师妃暄)
- 下一篇: java 循环结构和常用的类 总结笔记