corejava_day2

目標:

  1. 標識符、關鍵字和類型介紹
  2. 如何構建類

標識符、關鍵字和類型介紹;如何構造類

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. 標識符

類、方法和變量的名字

  1. 由字母、數字、下劃線"_"、美元符號"$"組成,第一個字不能是數字
  2. 不能是Java中的關鍵字
  3. 大小寫敏感
  4. 沒有長度限制

注:Java中標識符是可以使用中文的,但是一般不推薦這樣做

舉例:

合法標識符 非法標識符
try1 try#
GROUP_7 7GROUP
openDoor open-door
boolean1 boolean
_int int
$int int

推薦常見的標識符命名規範

  1. 類名以大寫字母開頭 Hello Person Teacher TypeTest
  2. 接口名以大寫字母開頭 Eat Fly
  3. 方法名以小寫字母開頭 say go doSomething
  4. 變量名以小寫字母開頭 name age myName myAge
  5. 常量名全部大寫,多個單詞以"_" 連接 FILE_TYPE PERSON_TITLE

分號、代碼塊和空格

  1. 每個語句短語以分號(;)結束

類的聲明最後不需要加;

public class Hello{ 
    ... 
}

方法的聲明最後不需要加;

public class Hello {
    public void go() { 
        ...
    }
}

屬性的聲明最後一定要加;

public class Hello {
    int id;
    private String name;
    public int age;
    
    public void go() {
        ...
    }
}
  1. 代碼片段用{}括起來

常見的有: 類的聲明後加{}、方法的聲明後加{}

注意:代碼的{}後面都不需要加;

  1. 空白處

空格、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),面向對象的開發方法把軟件系統看成各種對象的集合,這種方法也是接近人的自然思維方式。

世界上萬事萬物實在太多了,不能一概而論,所以要解決一個問題,必須是要把事物限定到一定的範圍之內,那麼這個範圍就是我們要解決則之中,而不是針對全世界所有中學的教師管理規則。

對象是對問題領域中事物的抽象。對象具有以下特性:

  1. 萬物皆爲對象。問題領域中的實體和概念都可以抽象爲對象。例如學生、成績單、教師、課和教室。
  2. 每個對象都是唯一的。正如世界上不存在一模一樣的樹葉。
  3. 對象具有屬性和行爲。

例如:

小張,性別女,年齡22,身高1.6m,體重40kg,能夠學習,唱歌。
小張的屬性包括姓名、性別、年齡、身高和體重
小張的行爲包括學習、唱歌。

  1. 對象具有狀態。狀態是指對象在某個時刻的屬性取值。對象的某些行爲會改變對象自身的狀態。

例如:

小張本來體重爲40kg,經爲減肥後,體重減到35kg。

肥胖狀態:40kg --> 減肥行爲 --> 35kg

  1. 每個對象都是某個類的實例

例如:

小張和小王都屬於學生類的實例

中國和美國都屬於國家類的實例

中文和英文都屬於語言類的實例

類是具有相同屬性和行爲的對象的集合。

同一個類的所有實例(對象)都有相同屬性名,但屬性的取值不一定相同,例如:

小張和小王都屬於學生類,都有姓名、性別、年齡、身高和體重這些屬性,但是他們的這些屬性取值都可能不同。

同一個類的所有實例(對象)都有相同行爲,意味着它們具有一些相同的功能。

例如:

小張和小王都屬於學生類,他們都能學習以及能唱歌

  1. Java中的對象其實就是堆區中的一塊內存空間

JVM管理的內存,被劃分爲了若干區域,其中有一個被稱爲堆區,Java運行過程生產的所有對象幾乎都會在堆區中

垃圾回收器(gc)的工作主要也就是把堆區中把不再被使用的內存(也就是對象)進行回收。

new關鍵字就是向JVM申請內存空間以便接下來創建對象,這塊內存地址就是所創建對象的內存地址,通過改地址也是內存中找到該對象的唯一方式。


7. 定義類

  1. 分析學生都具備哪些特點以及行爲

學生都有學號、姓名、性別

學生都可以說話、學習、跑步

  1. 把學生這一羣體抽象位一個Java類:Student

所以一個Java類是對某一類事物的整體描述

Student類是對整體學生的描述

  1. 把學生的“特點”抽象爲Student類中的“屬性”

所以只要是屬於這個Student類的對象都具有這些屬性

  1. 把學生的“行爲”抽象爲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類,進行類的實例化,也就是創建對象。

  1. 使用new+類中構造器 的形式創建出該類的對象
new Student();

或者

new Student(1L,"tom",'男');

這種方式可以直接給對象中屬性賦值

  1. 爲了方便進一步使用這個對象,需要使用變量去接收這個對象
Student s = new Student();

Java是強類型編程語言,數據是什麼類型的,那麼接收數據的變量類型也要與之對象

  1. 接下來可以使用對象方法其屬性,也可以調用其方法
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. 基本類型變量和引用類型變量的區別

  1. 基本類型變量指的是使用byte、short、int、long、float、double、boolean、char這八種類型聲明出來的變量
  2. 引用類型變量指的是使用任意一個類、任意一個接口、任意以惡搞數組所聲明出來的變量
  3. 基本類型的數據是一種比較簡單的數據,不能包含其他類型的數據,也不能調用任何方法
  4. 對象是一種比較複雜的數據,可以包含其他類型的數據,也可以調用方法

例如:對象s中包含了其他三個不同類型的數據

Student s = new Student(1L,“tom”,‘男’);

  1. 基本類型變量接收的只能是一些比較簡單的數據(8/16/32/64位)
  2. 引用類型變量接收的只能是對象

Student s = new Student();

引用類型的變量可以簡稱爲 引用

簡稱:引用 “指向” 對象

例如:

// 使用x不能訪問任何屬性也不能調用任何方法
int x = 1;
Student s = new Student();
// 使用s可以訪問對象中的屬性
s.name = "tom";
// 也可以調用對象中的方法
s.run();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章