目標:
- 標識符、關鍵字和類型介紹
- 如何構建類
corejava_day2
標識符、關鍵字和類型介紹;如何構造類
1. 註釋
作用:使部分內容只爲程序員可見,不爲編譯器所編譯、虛擬機所執行
位置:類聲明前後、方法聲明前後、屬性聲明前後、方法體中。幾乎可以在一個源文件任意位置,但不能在一個關鍵字字符中插入註釋
類型:
// 從//到本行結束的所有字符均作爲註釋而被編譯器忽略
// text
// 從 /* 到 */ 間的所有字符會被編譯器忽略
/* text */
// 從 /** 到 */ 間的所有字符會被編譯器忽略。
// 當這類註釋出現在任何聲明(如類的聲明、
// 類的成員變量的聲明或者類的成員方法的聲明)之前時,
// 會作爲JAVADOC文檔的內容;
/** text */
/**
@author 類的作者
@version 類的版本
@since 從什麼時候開始使用的
@see 另外參照...
@param 方法的參數
@return 方法的返回類型
@exception 方法掏出的異常
*/
例如:
package com.briup.ch02;
/**
* this is my CommentTest Class
* @author bing
* @version 1.0
* @since JDK1.8
* */
public class CommentTest {
// 表示這個人的名字
private String name;
/**
* this is a age of person
* */
private int age;
/**
* @param name:a name of person
* @exception null
* */
public void setName(String name) {
this.name = name;
}
/**
* @return 沒有返回類型
* */
public String getName() {
return this.name;
}
public static void main(String[] agrs) {
CommentTest ct = new CommentTest();
ct.setName("Tom");
String temp = ct.getName();
System.out.println(temp);
}
}
使用javadoc進行編譯:
javacdoc -d doc src/CommentTest.java
如果想顯示出author和version
javadoc -d doc -author -version src/CommentTest.java
或者
javadoc -d doc -author -version src/*.java
2. 標識符
類、方法和變量的名字
- 由字母、數字、下劃線"_"、美元符號"$"組成,第一個字不能是數字
- 不能是Java中的關鍵字
- 大小寫敏感
- 沒有長度限制
注:Java中標識符是可以使用中文的,但是一般不推薦這樣做
舉例:
合法標識符 | 非法標識符 |
---|---|
try1 | try# |
GROUP_7 | 7GROUP |
openDoor | open-door |
boolean1 | boolean |
_int | int |
$int | int |
推薦常見的標識符命名規範
- 類名以大寫字母開頭 Hello Person Teacher TypeTest
- 接口名以大寫字母開頭 Eat Fly
- 方法名以小寫字母開頭 say go doSomething
- 變量名以小寫字母開頭 name age myName myAge
- 常量名全部大寫,多個單詞以"_" 連接 FILE_TYPE PERSON_TITLE
分號、代碼塊和空格
- 每個語句短語以分號(;)結束
類的聲明最後不需要加;
public class Hello{
...
}
方法的聲明最後不需要加;
public class Hello {
public void go() {
...
}
}
屬性的聲明最後一定要加;
public class Hello {
int id;
private String name;
public int age;
public void go() {
...
}
}
- 代碼片段用{}括起來
常見的有: 類的聲明後加{}、方法的聲明後加{}
注意:代碼的{}後面都不需要加;
- 空白處
空格、tab鍵、換行和回車等是無關要緊不影響代碼執行的。
3. 關鍵字
Java語言的關鍵字是程序代碼中的特殊字符。包括:
類和接口的聲明:class、extends、implements、interface
包引入和包聲明:import、package
數據類型:boolean、byte、char、double、float、int、long、short
某些數據類型的可選值:false、true、null
流程控制:break、case、continue、default、do、else、for、if、return、switch、while
異常處理:catch、finally、throw、throws、try
修飾符:abstract、final、native、private、protected、public、static、synchronized、transient、volatile
操作符:instanceof
創建對象:new
引用:this、super
方法返回類型:void
Java語言的保留字是指預留的關鍵字,它們雖然現在沒有作爲關鍵字,但在以後的升級版本中可能作爲關鍵字:goto const
所有關鍵字都是小寫,並且程序中標識符不能以關鍵字命名
4. 基本數據類型
Java語言中的數據類型分爲基本類型和引用類型
基礎類型:float、double、byte、short、int、long、char、boolean
引用類型:類類型、接口類型、數組類型
數據類型本身是描述程序中數據所具備的特點的,同時數據類型也可以用來定義變量,而變量又是用來接收和存儲數據的。
所以Java中的變量也只有兩大種類:基本類型變量和引用類型變量
計算機中:1字節 = 8位 0000 0001
基本數據類型又可以分爲:整型、浮點類型、布爾類型、字符類型
整型:
byte | 8 | 1字節 |
---|---|---|
short | 16位 | 2字節 |
int | 32位 | 4字節 |
long | 64位 | 8字節 |
flaot | 32位 | 4字節 |
double | 64位 | 8字節 |
boolean | 8位 | 1字節 |
char | 16位 | 2字節 |
注意:Java中採用unicode編碼,用兩個字節表示一個字符,但是在其他字符編碼中可能不是使用兩個字節表示一個字符
1. boolean
boolean類型數據的值爲true或者false,在JVM中會轉換位1或者0
注意:0代表的是false,1代表的是true
例如:
boolean flag = true;
boolean bool = false;
2. char
char是字符,String是字符串
String是類類型,而char是基本數據類型
一個String是由0個或者n個char組成的
2.1 字符編碼
Java語言對文本字符采用Unicode編碼。由於計算機內存只能存取二進制數據,因此必須爲各個字符進行編碼。
例如:a --> 編碼 --> 0000 0000 0110 0001
2.2 常見的字符編碼包括:
a. ASCII
ASCII–Amecian Standard Code for Information Interchange(美國信息交換標準代碼). 主用於表達現代英語和其他西歐語言中的字符。它是現今最通用的單字節編碼系統,它只用一個字節的7位,一共表示128個字符。
b. ISO-8859-1
又稱爲Latin-1, 是國際標準化組織(ISO)爲西歐語言中的字符制定的編碼,用一個字節(8位)來爲字符編碼,與ASCII字符編碼兼容。所謂兼容,是指對於相同的字符,它的ASCII字符編碼和ISO-8859-1字符編碼相同。
c. GB2312
它包括對簡體中文字符的編碼,一共收錄了7445個字符(6763個漢字+682個其他字符). 它與ASCII字符編碼兼容。
d. GBK
對GB2312字符編碼的擴展,收錄了21886個字符(21003個字符+其它字符), 它與GB2312字符編碼兼容。
e. Unicode
由國際Unicode協會編制,收錄了全世界所有語言文字中的字符,是一種跨平臺的字符編碼。
UCS(Universal Character Set)是指採用Unicode字符編碼的通用字符集。
Unicode具有兩種編碼方案:
用2個字節(16位)編碼,被稱爲UCS-2, Java語言採用;
用4個字節(32位)編碼,被稱爲UCS-4;
f. UTF
有些操作系統不完全支持16位或32位的Unicode編碼,UTF(UCS Transformation Format)字符編碼能夠把Unicode編碼轉換爲操作系統支持的編碼,常見的UTF字符編碼包括UTF-8, UTF-7和UTF-16.
2.3 字符編碼表
每一種字符編碼都有一個字符編碼表,例如在Unicode編碼表中十六進制的數字6136對應的漢字是愶
例如:
char c = '\u6136';
System.out.println(c);
2.4 char值的形式
Java語言採用Unicode編碼,字符佔2個字節。
字符a
二進制數據形式爲 0000 0000 0110 0001
十六進制數據形式爲 0x0061
十進制數據形式爲 97
char c = 'a';
// 設定'a'的十六進制數據的Unicode編碼
char c = '\u0061';
// 設定'a'的十六進制數據的Unicode編碼
char c = 0x0061;
// 設定'a'的十進制數據的Unicode編碼
char c = 97;
// 設定'a'的八進制數據的Unicode編碼
// 0開頭的數字爲八進制
char c = 0141;
注意:一箇中文漢字就是一個字符
char c = '中';
2.5 轉義字符
Java編程人員在給字符變量賦值時,通常直接從鍵盤輸入特定的字符,而不會使用Unicode字符編碼,因爲很難記住各種字符的Unicode字符編碼值。
對於有些特殊字符,比如單引號,如不知道它的Unicode字符編碼,直接從鍵盤輸入編譯錯誤:
// 編譯出錯
char c = ''';
爲了解決這個問題,可採用轉義字符來表示單引號和其他特殊字符:
char c = '\'';
char c = '\\';
3. 整數類型
byte、short、int和long都是整數類型,並且都是有符號整數(負號)。與有符號整數對應的是無符號整數,兩者的區別在於把二進制數轉換爲十進制整數的方式不一樣。
有符號整數把二進制數的首位作爲符號數,當首位是0時,對應十進制的正整數,當首位是1時,對應十進制的負整數。對於一個字節(byte)的二進制數,它對應的十進制數的取值範圍是-128~127
無符號整數把二進制數的所有位轉換位正整數。對於一個字節(byte)的二進制數,它對應的十進制數的取值範圍是0~255
在Java語言中,爲了區分不同進制的數據,八進制數以"0"開頭,十六制以"0x"開頭,JDK1.7還支持了二進制的直接表示,0b開頭:
例如:
byte b1 = 97; // 十進制
byte b2 = 0141; // 八進制
byte b3 = 0x61; // 十六進制
byte b4 = 0b01100001; // 二進制
// 都是97打印出來
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);
整數類型的默認類型是int,對於給出一個字面值是99的數據,在沒有指明這個數是什麼具體的類型的情況下,那麼Java默認認爲是int類型。
例如:
// 編譯報錯
// a+1中a是byte類型,字面值1沒有聲明類型,那麼默認是int
// byte是8位,int是32位,那麼結果是32位的數字
// b只是一個byte類型的變量,那麼只能接收8位的數字
// 修改爲int b = a+1;就可以編譯通過
byte a = 1;
byte b = a+1;
// 編譯通過
// 雖然1+1中的1都是默認的int類型
// 但是這個兩個1都是固定的字面值
// 編譯器可以判斷出其結果是否超出了byte表示的範圍
// 上面例子中a+1不能判斷出結果的原因是:
// a是變量,是有可能發生變化的
byte c = 1+1;
// 編譯報錯
// 編譯器判斷出其結果超出了byte的表示範圍(-128~127)
byte d = 1+127;
// 編譯報錯
// 原因:32位的數據賦值給byte類型的變量
// 因爲使用的1這些都是字面值,默認是int
// 所以它默認是前面補了24個0
byte e = 0b11111111;
// 編譯通過
// 輸出結果爲255
// 因爲1的前面補了24個0
int e = 0b11111111;
// 編譯通過
// 輸出結果爲-1
byte f = (byte)0b11111111;
四種整數類型的聲明
byte a1 = 1; (內存中佔8位) 1字節
short a2 = 1; (內存中佔16位) 2字節
int a3 = 1; (內存中佔32位) 4字節
long a4 = 1L; (內存中佔64位) 8字節
使用long類型數據的時候後面要加大寫L或者小寫l,建議加上大寫的L,因爲小寫的1和數字1很相似。
四種整形類型的表示範圍
byte 8位 範圍:負2的7次方~2的7次方減1
short 16位 範圍:負2的15次方~2的15次方減1
int 32位 範圍:負2的31次方~2的31次方減1
long 64位 範圍:負2的63次方~2的63次方減1
4. 浮點型
float和double都是Java中的浮點型,浮點型可以用來表示小數。
float是32位,1符號位+8指數位+23尾數位
double是64位,1符號位+11指數位+52尾數位
float和double的精度是由尾數的位數來決定的。
浮點數在內存中是按科學計算法來存儲的。
float的精度爲7位左右有效數字
double的精度爲16位左右有效數字
兩種浮點型數據的聲明
// 後面加f或者F
float f = 10.5f;
// 後面加d或者D
double d = 10.5d;
浮點型的二進制形式
參考樣例:
float f = 10.5f;
int b = Float.floatToIntBits(f);
System.out.println(Integer.toBinaryString(b));
浮點型的默認類型是double,對於給出一個字面值是10.8的數據,在沒有指明這個數據是什麼具體的類型的情況下,那麼Java默認認爲是double類型。
例如:
// 編譯通過
// 字面值1.5默認類型是double
double d = 1.5;
// 編譯報錯
// 字面值1.5默認類型是double
// double和float的精確度不一樣
float f = 1.5;
// f2編譯通過,因爲字面值1的類型是int
// f3編譯報錯,因爲字面值1.5的類型是double
float f1 = 10.5f;
float f2 = f1+1;
flaot d3 = f1+1.5;
浮點型的精度丟失
例如:
System.out.println(1.0-0.66); // 0.33999999999999997
Java中的簡單浮點數類型float和double不能夠進行精確運算,因爲大多數情況下是正常的,但是偶爾會出現如上所示的問題。這個問題其實不是Java的bug,因爲計算機本身是二進制的,而浮點數實際上只是個近似值,所以從二進制轉化爲十進制浮點數時,精度容易丟失,導致精度下降。
要保證精度就要使用BigDecimal類,而且不能直接從double直接轉BigDecimal,要將double轉String再轉BigDecimal。也就是不能使用BigDecimal(double val)方法,而是需要使BigDecimal(String val)方法。
例如:
BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("0.66");
double result = d1.subtract(d2).doubleValue();
System.out.println(result); // 0.34
5. 變量的聲明和賦值
Java中的任意類型可以用來聲明變量,包含八個基本類型和三個引用類型
// 變量的聲明
int x;
// 聲明多個類型相同的變量
int x,y;
相當於
int x;
int y;
// 先聲明變量
// 再給變量賦值
int x;
x = 10;
// 聲明變量的同時就賦值
int x = 10;
思考:變量在程序中的作用是什麼?
變量的主要作用,就是用來存儲信息,然後在計算機程序中使用這些信息。
6. 理解對象
Java是面向對象的編程語言(OOP),面向對象的開發方法把軟件系統看成各種對象的集合,這種方法也是接近人的自然思維方式。
世界上萬事萬物實在太多了,不能一概而論,所以要解決一個問題,必須是要把事物限定到一定的範圍之內,那麼這個範圍就是我們要解決則之中,而不是針對全世界所有中學的教師管理規則。
對象是對問題領域中事物的抽象。對象具有以下特性:
- 萬物皆爲對象。問題領域中的實體和概念都可以抽象爲對象。例如學生、成績單、教師、課和教室。
- 每個對象都是唯一的。正如世界上不存在一模一樣的樹葉。
- 對象具有屬性和行爲。
例如:
小張,性別女,年齡22,身高1.6m,體重40kg,能夠學習,唱歌。
小張的屬性包括姓名、性別、年齡、身高和體重
小張的行爲包括學習、唱歌。
- 對象具有狀態。狀態是指對象在某個時刻的屬性取值。對象的某些行爲會改變對象自身的狀態。
例如:
小張本來體重爲40kg,經爲減肥後,體重減到35kg。
肥胖狀態:40kg --> 減肥行爲 --> 35kg
- 每個對象都是某個類的實例
例如:
小張和小王都屬於學生類的實例
中國和美國都屬於國家類的實例
中文和英文都屬於語言類的實例
類是具有相同屬性和行爲的對象的集合。
同一個類的所有實例(對象)都有相同屬性名,但屬性的取值不一定相同,例如:
小張和小王都屬於學生類,都有姓名、性別、年齡、身高和體重這些屬性,但是他們的這些屬性取值都可能不同。
同一個類的所有實例(對象)都有相同行爲,意味着它們具有一些相同的功能。
例如:
小張和小王都屬於學生類,他們都能學習以及能唱歌
- Java中的對象其實就是堆區中的一塊內存空間
JVM管理的內存,被劃分爲了若干區域,其中有一個被稱爲堆區,Java運行過程生產的所有對象幾乎都會在堆區中
垃圾回收器(gc)的工作主要也就是把堆區中把不再被使用的內存(也就是對象)進行回收。
new關鍵字就是向JVM申請內存空間以便接下來創建對象,這塊內存地址就是所創建對象的內存地址,通過改地址也是內存中找到該對象的唯一方式。
7. 定義類
- 分析學生都具備哪些特點以及行爲
學生都有學號、姓名、性別
學生都可以說話、學習、跑步
- 把學生這一羣體抽象位一個Java類:Student
所以一個Java類是對某一類事物的整體描述
Student類是對整體學生的描述
- 把學生的“特點”抽象爲Student類中的“屬性”
所以只要是屬於這個Student類的對象都具有這些屬性
- 把學生的“行爲”抽象爲Student類中的“方法”
所以只要是屬於這個Student類的對象都具有這些方法
5. 如果有需要,可以在類中添加對於的構造器,以便我們在創建對象的時候給對象的屬性賦值,如果不添加構造器那麼JVM會自動幫我們在類中添加一個無參構造器
定義一個學生類:Student
public class Student {
// 屬性
public long id;
public String name;
public char gender;
// 方法
public void say() {
System.out.println("I can say..");
}
public void study() {
System.out.println("I can study..");
}
public void run() {
System.out.println("I can run..");
}
// 無參構造器 創建對象的時候使用
public Student() {}
// 有參構造器 創建對象的時候使用
public Student() {
this.id = id;
this.name = name;
this.gender = gender;
}
}
8. 創建類的實例
在Java代碼中,需要把類進行實例化得到該類的對象後,再使用對象去訪問對象中的屬性以及調用到對象中的方法
形式:
對象.對象中的屬性
對象.對象中的方法()
對象.對象中的方法(參數)
注1:首先要使用類進行實例化創建出這個對象
注2:對象調用方法時一定有小括號,對象訪問屬性時一定沒有小括號
類中的屬性和方法一般清空是不能直接使用的,類中的代碼知識提供了一個創建對象的模版,根據這個模板創建出的對象纔可以使用。
所以類只是創建對象的模板,對象纔是調用方法、執行代碼、完成功能這個過程中的關鍵點。
注意:類A中有什麼屬性和方案,那麼該類的對象中就有什麼屬性和方法,因爲該對象是根據類A這個模版創建出來的。
根據上面所編寫的Student類,進行類的實例化,也就是創建對象。
- 使用new+類中構造器 的形式創建出該類的對象
new Student();
或者
new Student(1L,"tom",'男');
這種方式可以直接給對象中屬性賦值
- 爲了方便進一步使用這個對象,需要使用變量去接收這個對象
Student s = new Student();
Java是強類型編程語言,數據是什麼類型的,那麼接收數據的變量類型也要與之對象
- 接下來可以使用對象方法其屬性,也可以調用其方法
Student s = new Student();
// 對象訪問其屬性並且給該屬性賦值
s.id = 2L;
s.name = "zhangsan";
s.gender = 'm';
// 打印出對象中的屬性值
System.out.println("id:" + s.id);
System.out.println("name:" + s.name);
System.out.println("gender:" + s.gender);
// 對象調用其方式
s.say();
s.study();
s.run();
9. 基本類型變量和引用類型變量的區別
- 基本類型變量指的是使用byte、short、int、long、float、double、boolean、char這八種類型聲明出來的變量
- 引用類型變量指的是使用任意一個類、任意一個接口、任意以惡搞數組所聲明出來的變量
- 基本類型的數據是一種比較簡單的數據,不能包含其他類型的數據,也不能調用任何方法
- 對象是一種比較複雜的數據,可以包含其他類型的數據,也可以調用方法
例如:對象s中包含了其他三個不同類型的數據
Student s = new Student(1L,“tom”,‘男’);
- 基本類型變量接收的只能是一些比較簡單的數據(8/16/32/64位)
- 引用類型變量接收的只能是對象
Student s = new Student();
引用類型的變量可以簡稱爲 引用
簡稱:引用 “指向” 對象
例如:
// 使用x不能訪問任何屬性也不能調用任何方法
int x = 1;
Student s = new Student();
// 使用s可以訪問對象中的屬性
s.name = "tom";
// 也可以調用對象中的方法
s.run();