---
# System prepended metadata

title: Java note01
tags: [' Software', Java, ' Development']

---

---
tags: Java, Development, Software, 
---
# Java note01

### 程序導向
以自訂函數/程序為單元
1.自訂函數 
說明:有回傳值
2.自訂程序
說明:無回傳值→void

### 物件導向
	
以類別(class)為程序單元
1. 類別(class):定義工具箱(計畫)
2. 物件(object):列別的實體
3. 成員(member): 
1.屬性(field):即變數
2.方法/成員方法(method):自訂函數 
3.建構(constructor):建立物件時必須叫用的函數 

<table style="text-align:center; width:100%; ">
<colgroup span="4"></colgroup>
<tr>
    <th style="text-align:center">程序導向</th>
    <th style="text-align:center">混合</th>
    <th style="text-align:center">物件導向</th>
</tr>
<tr>
    <th style="text-align:center">C</th>
    <th style="text-align:center">C++,python,PHP,JavaScript,VB ...</th>
    <th style="text-align:center">java , C#</th>
</tr>
</table>

---

### Package命名方式---
以domain name(網址www....)反向寫
例.幫海乘科技寫一個套件工具(www.hoceantek.com)
    
	 com.hoceantek
	
說明文件產生方式:

	\/**           */註解

e.g.	cmd>>javadoc Mytool.java           -->(index.html)

### 使用有套件路徑的類別---
方式1.使用命名
```
com.hoceantek.Mytools

obj = new tw.com.lccnet.Mytools();
```          
方式2.以import簡化

1.
```
import com.hoceantek.Mytools;
	
Mytools obj = new Mytools();

2.
import com.hoceantek.*;
	
Mytools obj = new Mytools();
```
(有套件路徑 +參數-d )	
```
javac -d . Sayhi.java
javac -d . Hello2.java
-->com\hoceatek\Sayhi.class
-->kuo\Hello2.class

java kuo.Hello2
```
package 在同個路徑則無需使用import

---

### 基本資料型態---
#### 整數---
| 整數型態| 記憶體配置|值域 | 
|:------:|:-----:|:-----:|
|byte| 8 bit |-128~127|
|short |16 bit| -32768~32767 |
|int	|32 bit| +-21E |
|long	|64 bit |略|

說明:允許以二進位八進位十進位十六進位來表示數值大小

#### 浮點數---
|浮點數型態|值域|
|:------:|:-----:|
|float |小數有效位數7位|
|double |小數有效位數15位|
#### 字元---
1. 採用16bit的unicode:"A"字串，'A'字元
2. 跳脫字元: 例'\n'


例

![](https://i.imgur.com/YaR0Qmt.png)
Compile error
step3發生錯誤
更改方式:加大左側資料型態

例
![](https://i.imgur.com/zJyEBVl.png)	
Compile error
step2發生錯誤
更改方式:加大緩衝區(數值後加L)

例 

    long z = 22; (數值沒超過，不用加L，浪費記憶體空間)


例 
![](https://i.imgur.com/pbBJaIb.png) 
compile error 
	處理方式:縮小緩衝區
	在數值後加F
    
例 

    float y = 123; //不用加F

---
### 一維陣列---
說明:1.是以一個變數要求配置若干個相同型態的連續空間。
     2.區分為一維與多維
宣告:
1.`資料型態[] 陣列名稱 ` java    (java原廠希望我們這樣寫)
2.`資料型態[] 陣列名稱`  c,c++  (c,c++只能這樣寫)


1. 每個儲存空間稱為"元素"
2. element以"索引"管理，數值由0起算，如num[0],num[1]
3. 陣列建立後大小不能變更
4. 陣列提供唯獨的屬性"length"來記錄陣列的大小(final variable)
```java
int[] nums={98.60,75,100,85};           //JavaEE,JavaSE
int[] nums= new int{98.60,75,100,85};   //JavaME
```
---
### String類別---
說明:
套件路徑在**java.lang**
字串的其他類別有:
|1.StringBuffer |Java SE |Java EE|    |
|:------:|:-----:|:-----:|:------:|
|2.StringBuilder | Java SE| Java EE |Java ME|
|3.CharSequence	| | | Java ME|

#### 建立物件:


```java 
String 物件 = new String     (字串變數)
String 物件 = new String     (字元陣列)
String 物件 = new String     (byte陣列 字元碼)
```
#### 物件方法:
1. **length()**---取得字串長度
2. **equals()**---比較字串內容是否相同
3. **charAt(索引)**---取得索引所對應的字元
4. **toCharArray()**-把字串拆解成字元陣列
5. **getBytes()**---將字串拆解成byte陣列

---
### 標準輸入---
#### 輸入字元--
語法
```java
char 變數=(char) System.in.read()
```
說明:
System.in是指鍵盤緩衝區
(System.out\System.err)則是指螢幕緩衝區

#### 輸入字串-
說明:使用Scanner類別，套件路徑在java.util
語法:
```java
Scanner 物件  =  new Scanner(System.in);
String 物件2  =  物件.nextLine()
```
註:會自動處理"\r,\n"

#### 數字字串轉數值---
說明:使用Integer,Double類別,套件路徑在**java.lang**
例
"123" ------→123
"1.234"-----→1.234
語法:
```java
1.int    變數 = Integer.parseInt       (數字字串)
2.double 變數 = Double.parseDouble     (數字字串)
```
註:轉換工具不具備資料的檢查功能

#### 資料型態轉換---
byte----→Byte
short---→Short
int-----→Integer
long----→Long
float---→Float
double--→Double
```java
char 變數 = (char)System.in.read()
```
---→進入鍵盤緩衝取，讀取一個字元碼
```java
import java.util.Scanner
Scanner 物件 = new Scanner(System.in) 
String 物件2 = 物件.nextLine() 
```
→以列為單位讀取資料(含\r,\n)

註:
**System.in**  表示鍵盤緩衝區 
**System.out/System.err** 表示螢幕緩衝區
```java
int 變數 = Integer.parseInt         (整數字串)
double 變數 = Double.parseDouble    (浮點數字串)
```
### Console類別---
1.套件路徑在 java.io
2.建立物件
	Console 物件 = System.console()
3.方法
	(1)char[] 密碼字串 = 物件.readPassword("提示文字")
	(2)String 字串 = 物件.readLine("提示文字")

e.g.	
```java
System.out.print("輸入姓名");
String name = Scanner 物件.nextLine();
String name = Console 物件.readLine("輸入姓名");
```
#### 字元陣列 轉成 字串物件--


String 字串 = new String(字元);

if(a>b) 	可寫成 max = a>b?a:b;
    max=a; 	       max = (a>b)?a:b;
else		
    max=b;	String result = grade>=60?"及格":"不及格";
    
---
#### 物件間的比較-
1. **==**
說明:表示兩個務間共用實體
2. **equals()**
說明:表示要比較物件的內容，回傳true,false
e.g.
```java
String str1 = "abcd";
String str2 = "abcd";
System.out.println(str1.equals(str2)); ->true
System.out.println(str1 == str2); ->true
```    
e.g.
```java
String str3 = new String("abcd");
String str4 = enw String("abcd");
System.out.println(str3.equals(str4)); ->false
System.out.println(str3==str4;)  ->false
```
(用new出來的新字串,heap記憶體空間不同)

3.**compareTo()**
說明:
1. 比較物件的大小
2. 不同物件表示大小的方式不同
    a.Byte,Short:回傳數值的差值(相減)
	b.Integer,Long,Double,Float:回傳-1,0,1
	c,Character:回傳字元碼的差值
	d.boolean回傳0,-1,1
	e.回傳對位相異字元的字元碼差值
	
### 類別方法與物件方法---
1.語法

	[public] static 回傳值型態 函數名稱([參數]){主體}
    
	-類別方法
    
	[public] 回傳值型態 函數名稱([參數]){主體}
    
	-物件方法

因人而異的是物件方法，不會因人而異的是類別方法
會因為類別而有所不同的是物件方法，所以要建立物件->物件方法
e.g. 三角函數sin,cos 圓周率PI 為類別方法 (會有static)

3.配置的時機
 1.類別方法:載入時
 2.物件方法:建立物件時

e.g.
```java
class MyTools
{
static void showA(){...}
void showB(){...}
}
```
-->MyTools.class

叫用showA()以類別名稱來區分
MyTools.showA()

step1:載入
static記憶體空間
step2:建立物件

    MyTools oo = new MyTools();    
    MyTools pp = new MyTools();

| stackm | heap | static |
|:------:|:-----:|:-----:|

 pp  showA  showA 
 oo  showB
	  (個別)	(共用)

oo.showB ~= pp.showB
oo.showA == pp.showA


#### ceil()-無條件進位
#### round()-四捨五入到個位數
 1.參數是float,回傳值是int
 2.參數是double,回傳值是long
e.g.
```java
int x = math.round(123.4);
```
上述的敘述在Conpile時是否發生Error
修正:
 1.int x=(int)Math.round(123.4);
 2.int x=Math.round(123.4);
 3.long x=Math.round(123.4);

**rint()**---四捨六入到個位數
小數第一位的5進位的原則
1.個位數是奇數:進位
2.個位數是偶數:捨去 
回傳值是double
e.g.
```java
Math.rint(123.4)-->123.0
Math.rint(123.5)-->124.0
Math.rint(124.5)-->124.0
Math.rint(123.6)-->124.0
```
#### 亂數產生器-
1.**random()**
例:
產生:0.0 ≦  ... < 1.0間的亂數
產生1~6(123456)的亂數
```java
0.0<=math.random()<1.0
0<=(int)(math.random()*6)<6
1<=(int)(math.random()*6)+1<7
```
公式:產生1~n的亂數
```java
(int)(math.random()*n)+1 ==(int)(math.random()*n+1)
```

2.**Random**類別
 1.套件路徑 **java.util**
 2.建立物件:
```java
Random 物件=new Random();
```
e.g. (0~5)
```java
物件.nextInt(6)
```

#### 資料的排序-

使用類別**Arrays**
1.套件路徑在 java.util.*
2.使用的方法:
```java
1. Arrays.sort(基本資料型態[])                         //由小而大排序
2. Arrays.sort(基本資料型態[],index1,index2)           //索引1到索引2,-1個元素由小而大排序
3. Arrays.sort(類別型態[])                             //由小而大排序
4. Arrays.sort(類別型態[],Collections.reverseOrder())  //由大而小排序
```
註:
**Collections**
  套件路徑在**java.util**
  類別方法 **reverseOrder()** 是建立一個由大而小的排序原則物件

### 迴圈---

選錯迴圈不會導致程式錯誤，只是會寫or執行的比較冗長
說明:

1.Java提供四種迴圈,分別是:
1.   while
1. 	 do while
1. 	 for
1. 	Enhance for
    
2.挑選迴圈的原則
1.	迴圈數可數
	    for
1.	先執行後判斷
	    do while
1.	對象是一個容器(list,set,Map,Quere)
	    Enhance for


#### Switch---
語法:
```java
    switch(運算式)
    {
    case 結果值1:
	主體1
    case 結果值2:
	主體2
    case 結果值3:
	主體3
 	:
	:
    }
```
說明:
1.switch是單條件混合的語法
但在大多數情況都被寫成[單進]
 2.運算式的結果可以式 "int" "char" "String"
3.每個case代表一個[入口]

###### tags: `Java` `Development` `Software`




















































































        
