儘管Java中一切都看做爲對象,可是操縱的標識符實際上對象的一個「引用」。css
String s; // 這裏只是建立了一個引用,而不是一個對象
String s = new String("abcd"); // 使用`new`操做符來建立一個對象,並將其與一個引用相關聯
String s = "abcd"; // 字符串能夠直接用帶引號的文本初始化複製代碼
使用new
操做符建立一個對象html
由五個地方能夠存儲數據:java
一些比較小的,簡單的類型,若是放在堆中每每效率不高,因此這些類型不須要使用new
來建立,而是建立一個「自動」變量來直接存儲「值」,並置於棧中。編程
Java 中全部基本類型所佔據存儲空間的大小都是明確的.數組
boolean
類型所佔存儲空間的大小沒有明確,僅定義爲可以去字面值true
或false
BigInteger
和BigDecimal
null
{
int x = 12;
// x available
{
int q = 96;
// Both x & q available
int x = 96 // Illegal
}
// only x available
}複製代碼
new
建立的對象,只要你須要,其會一直保留下去。 new
建立的對象,辨別並釋放那些不會再被引用的對象 使用class
來建立一個新的類型:函數
class ATypeName { }複製代碼
一旦定義了一個類,就能夠在類中設置兩種元素:字段(數據成員)和方法(成員函數)。字段能夠是任何類型的對象或基礎類型。每一個對象都有存儲其字段的空間,即普通字段不在對象間共享。工具
引用一個對象的成員的方式:objectReference.member
編碼
基本數據類型的變量只有是類的成員時,才確保其得到一個默認值,不然的話,與C++同樣,該變量多是任意值(其實就是在堆仍是棧的問題嘛),不過這種狀況下Java會報編譯錯誤。spa
方法的基本組成部分包括:名稱、參數、返回值和方法體:code
ReturnType methodName ( /* Argument list */) {
/* Method body */
}複製代碼
方法名和參數列表惟一地標識某個方法(合起來稱爲「方法簽名」)注意:方法簽名不包含返回值。
Java 中的方法只能做爲類的一部分來建立,方法一般只有經過對象才能調用,且這個對象必須有這個方法。
方法的參數列表指定要傳遞給方法什麼樣的信息,這裏採用的都是對象的類型,即包含指定的類型和名字,這裏傳遞的其實是引用,傳遞基礎類型則經過自動包裝來實現。
爲了防止不一樣類庫中使用了相同的類名,Java 將反過來的域名做爲惟一標識符(即包名),如個人域名爲codeand.fun
,則個人類庫則使用fun.codeand.utils
的形式。
包名使用小寫
使用import
導入想要的包:
import java.util.ArrayList;
import java.util.*; // 導入java.util下全部的類複製代碼
java.lang
默認導入到每個Java文件中。
當聲明一個事物爲static
時,就意味着這個域或方法不會與包含它的類的任何對象實例關聯在一塊兒,能夠理解爲類數據和類方法。
class StaticTest {
static int i = 47;
static void inc() { i++; }
}
int j = StaticTest.i; // 47
StaticTest st1 = new StaticTest();
StaticTest.inc();
StaticTest st2 = new StaticTest();
// st1.i == st2.i == 48 // 全部i都指向同一個存儲空間複製代碼
// HelloDate.java
import java.util.*;
public class HelloDate {
public static void main(String[] args) {
System.out.println("Hello, it's");
System.out.println(new Date());
}
}複製代碼
要建立一個獨立運行的程序,那麼該文件中必須存在某個類與該文件同名,且那個類必須又一個main
方法,其形式如public static void main(String[] args)
。
$ javac HelloDate.java // 編譯,產生一個 HelloDate.class 文件
$ java HelloDate // 運行複製代碼
/* something */
// something
Java 中能夠將代碼與文檔放到一個文件中,這樣有利於文檔的維護,爲了實現這一目的,這裏使用一種特殊的註釋語法來標記文檔,此外還有一個工具javadoc
來提取註釋。javadoc的輸出是一個html
# wuxiaobai24 @ wuxiaobai24-pc in ~/code/Java/ch2 [17:56:05] C:1
$ javadoc HelloDate.java
正在加載源文件HelloDate.java...
正在構造 Javadoc 信息...
標準 Doclet 版本 1.8.0_242
正在構建全部程序包和類的樹...
正在生成./HelloDate.html...
正在生成./package-frame.html...
正在生成./package-summary.html...
正在生成./package-tree.html...
正在生成./constant-values.html...
正在構建全部程序包和類的索引...
正在生成./overview-tree.html...
正在生成./index-all.html...
正在生成./deprecated-list.html...
正在構建全部類的索引...
正在生成./allclasses-frame.html...
正在生成./allclasses-noframe.html...
正在生成./index.html...
正在生成./help-doc.html...
# wuxiaobai24 @ wuxiaobai24-pc in ~/code/Java/ch2 [17:56:11]
$ ls
allclasses-frame.html HelloDate.class index-all.html package-list stylesheet.css
allclasses-noframe.html HelloDate.html index.html package-summary.html
constant-values.html HelloDate.java overview-tree.html package-tree.html
deprecated-list.html help-doc.html package-frame.html script.js複製代碼
全部 javadoc 命令都只能在由/**
和*/
組成的註釋中
javadoc 的註釋,只能爲public
和protected
成員進行文檔註釋,而private
和defaule
成員的註釋會被忽視掉
javadoc 主要有兩種形式:
@
字符開頭的命令,且置於註釋行的最前面(除了前導的 *
) @
開頭,但要在花括號內。 經常使用的標籤有:
@see
:引用其餘類,會生成一個超連接條目(不會校驗該連接是否有效),超連接文本爲「See Also」 @see classname
@see fully-qualified-classname
@see fully-qualified-classname@method-name複製代碼
{@link package.class#member label}
:與@see
相似,不過是行內標籤,使用「label」來處理做爲超連接文本 {@docRoot}
:該標籤產生到文檔根目錄的相對路徑 {@inheritDoc}
:該標籤從當前這個類最直接的基類繼承相關文檔到當前文檔註釋中 @version
:版本信息 @author
:做者信息 @since
:指定JDK版本最低爲多少 @param
:表示參數含義,形式如@param parameter-name description
@return
:描述返回值,形式如@return description
@throws
:異常描述,該方法可能拋出的每一個異常都須要說明,形式如@throws fully-qualified-class-name description
@deprecated
:指出一些舊特性已由改進的新特性所取代,不建議使用。調用一個標記爲@deprecated
的方法,編譯器會發出警告。 // HelloDate.java
import java.util.*;
/** A class comment
* Test comment
* @author wuxiaobai24
* @version 0.1
*/
public class HelloDate {
/** a field comment */
public int i;
/**
* a <strong>protected</strong> filed comment
* <ol>
* <li>one</li>
* <li>two</li>
* <li>three</li>
* </ol>
*/
protected int p;
/** a private field comment */
private int j;
/** A method comment
* @param args args comment
*/
public static void main(String[] args) {
System.out.println("Hello, it's");
System.out.println(new Date());
}
}複製代碼
// Ex1.java
public class Ex1 {
public int i;
public char c;
public static void main(String[] args) {
Ex1 e = new Ex1();
System.out.println(e.i);
System.out.println(e.c);
}
}複製代碼
// Ex2.java
public class Ex2 {
public static void main(String[] args) {
System.out.println("Hello, World");
}
}
複製代碼
// Ex3.java
class DataOnly {
int i;
double d;
boolean b;
}
class ATypeName {
}
public class Ex3 {
public static void main(String[] args) {
ATypeName a = new ATypeName();
DataOnly d = new DataOnly();
d.i = 1;
d.d = 2.0;
d.b = false;
System.out.println(d.i);
System.out.println(d.d);
System.out.println(d.b);
}
}複製代碼
// Ex4.java
public class Ex4 {
int storage(String s) {
return s.length() * 2;
}
public static void main(String[] args) {
String s = new String("Hello");
Ex4 e = new Ex4();
int len = e.storage(s);
System.out.println(len);
}
}複製代碼
// Ex7.java
class StaticTest {
static int i = 47;
}
class Incrementable {
static void increment() { StaticTest.i++; }
}
public class Ex7 {
public static void main(String[] args) {
StaticTest st1 = new StaticTest();
Incrementable.increment();
StaticTest st2 = new StaticTest();
System.out.println(st1.i);
System.out.println(st2.i);
System.out.println(StaticTest.i);
}
}複製代碼
// Ex9.java
public class Ex9 {
public static void main(String[] args) {
int i = 24;
Integer bi = i;
System.out.println(i);
System.out.println(bi);
// ....
}
}複製代碼
// Ex10.java
public class Ex10 {
public static void main(String[] args) {
if (args.length == 3) {
System.out.println(args[0]);
System.out.println(args[1]);
System.out.println(args[2]);
}
}
}
複製代碼
// Ex11.java
class AllTheColorsOfTheRainbow {
int anIntegerRepresentingColors;
void changeTheHueOfTheColor(int newHue) {
anIntegerRepresentingColors = newHue;
}
}
public class Ex11 {
public static void main(String[] args) {
AllTheColorsOfTheRainbow allTheColorsOfTheRainbow = new AllTheColorsOfTheRainbow();
allTheColorsOfTheRainbow.changeTheHueOfTheColor(1);
System.out.println(allTheColorsOfTheRainbow.anIntegerRepresentingColors);
}
}複製代碼
本文首發於Code & Fun