> For the complete documentation index, see [llms.txt](https://johch3n611u.gitbook.io/c50108/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://johch3n611u.gitbook.io/c50108/ju-li-cheng-bei/201905/20190507java-wu-jian-xiang-+-han-shi-nian-duan-xing-zuo-san.md).

# 2019/0507/Java 物件導向\_類別+函式觀念&階段性作業三

\#java&#x20;類別&函式
-----------

前情提要陣列的運算 (矩陣相乘是典型的方式

等等要做作業

會使用到多階層for與while迴圈&#x20;

### ##字串類別class&#xD;

String&#x20;

Stringbuffer

內建類別庫 一堆寫好的函式庫

字串很像字元型別的一維陣列

利用建構元(建構式)產生字串物件

字串類別庫提供許多方法可以操控物件

包含

取得字串長度

擷取字元

擷取子字串

將字串串接

字串的搜尋與取代

字串的大小寫轉換

完整的可以在文件裡面查詢

string一旦被指定值除非值接指定，不可以局部改變它的值

例如 abcd 想改成 accd 那就要重新指定

但stringbuffer可以

底層操作其實是abcd其實還在只是空在那邊

然後創造了一個新的accd指給舊的string

但是要連續做個幾萬次才會有差異

但是如果執行一兩次反而stringbuffer效能耗的更多

Replace取代insert插入

### ##建構元constructor建構子?建構式&#xD;

和類別名稱相同的方法(函式)

專門產生屬於該類別的物件&#x20;

( new 在產生時做一些屬性內容的重新初始化配置

一個類別可以擁有許多建構元&#x20;

( 沒有參數的版本 一個兩個三個…的版本 (類似多型

Public string ()

Public string (byte\[]bytes)

Public string (byte\[]asci,inthibyte)

.

.

.

Ex

String str;

Str = sc.nextline()

有很多應用可以看文件(看與使用的環境相容的版本

<https://Docs.oracle.com/javase/8/docs/api/java/lang/String.html>

<https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/String.html>

裡面包含&#x20;

Constructors建構子多載&#x20;

Methods方法

.

.

.

String A=XX

其實就跟

String A = New Srting(XX)&#x20;

這裡要去看一下PPT剛剛走神 …

然後是一些string物件常用的方法

像是

GetChars charAt

與需要輸入的參數

接著是

#### ###例子java12\_4.java&#xD;

宣告配置字串(物件)s1利用字串(物件)s1操作(方法)charAt擷取字元放入字元陣列c1(物件)中，在利用字串(物件)s1操作(方法)toCharArray字串轉字元並塞入字元陣列c2(物件)中，操控字串(物件)s1操作(方法)getChars擷取字元(起始值，結束值，塞入哪裡c3字元陣列，索引直偏移量看要從原來的哪開始塞從0開始則會覆蓋)

C3\[0]=’a’;C3\[1]=’b’

如果是1則C3=ajava

如果是0則C3=java

#### ###例子java12\_5.java&#xD;

宣告配置s1字串(物件)與s2字串(物件)並給定某值

操控System.out (靜態方法)println(方法)印出一行值

然後用此方式在印出 呼叫s1s2與呼叫s1s2做(方法)length顯示其長度值

System.out.println(s1 + s1.length()+s2+s2.length());

#### ###主字串擷取子字串&#xD;

子字串=主字串.Substring(開始索引，結束索引)有很多多型

#### ###字串串接字串&#xD;

Concat(用法可以去看官方文件

#### ###例子 java12\_6.java&#xD;

宣告s1字串物件給值

利用s1字串物件操作擷取字串方法並把產值給予s2字串物件

宣告s3字串物件給值

利用s3字串物件操作擷取字串方法並把產值給予s4字串物件

System.out(靜態方法編譯的時候就建構好的類別可以直接使用)物件println

Concat(方法)也是類似方式

#### ###字串搜尋&#xD;

indexOf()頭到尾

lastIndexOf()尾到頭

找到時回傳1

找不到回傳-1

有很多型 ( 有找字元的或從哪個位指找 等等

#### ###字串大小寫轉換&#xD;

toLowerCase()

toUpperCase()&#x20;

也是有很多型

#### ###字串取代&#xD;

Replace()

也是有很多型

#### ###例子 java12\_7.java&#xD;

宣告s1字串給值

宣告s2字串並將s1字串重置值並把值給s2

宣告s3字串不給值

宣告5個int

並把s1(方法)搜尋值的結果存入第一個int

並把s1(方法)搜尋值的結果存入第二個int

並把s1(方法)反向搜尋值的結果存入第三個int

並把s1(方法)搜尋值的結果存入第四個int

並把s1(方法)反向搜尋值的結果存入第五個int

System.out(靜態方法)println(方法)印出剛剛宣告的五個int值

重新指定s3為s1重置值(方法)replace

System.out(靜態方法)println(方法)印出s1s2s3

宣告s4值為s1方法字串變大touppercase

System.out(靜態方法)println(方法)印出s4

接著介紹

### ##Stringbuffer類別&#xD;

用來產生字串緩衝器

與

String

差別為

Mether

字詞都修改意涵而不是查詢等等

類別方法&#x20;

append 將值插入字串緩衝區的尾端

insert 將字串插入字串緩衝區某個位置

delete 將字串

replace&#x20;

查文件有更多 更詳細

#### ###案例 java12\_8.java&#xD;

宣告字串緩衝器s1

System.out(靜態方法)println(方法)印出 s1 + s1(物件)((方法)查詢長度)

S1(物件)操控增加字串apend(方法)在字串尾加入

使用方法 insert

印出

S1重置 new 值&#x20;

印出

Replace取代方法&#x20;

印出

Delete 刪除方法&#x20;

印出

#### ###\” 為跳脫字元 顯示的是 一個雙引號 避免使用到保留字&#xD;

```
package com.example.java;

public class Java12_8 {

	public static void main(String[] args) {
		// TODO 自動產生的方法 Stub.

		StringBuffer s1 = new StringBuffer("我愛學習");
		System.out.println("s1=\"" + s1 + "\"，其長度為"+s1.length());
		s1.append("程式設計!");
		System.out.println("s1=\"" + s1 + "\"，其長度為"+s1.length());
		s1.insert(4,"java");
		System.out.println("s1=\"" + s1 + "\"，其長度為"+s1.length());
		
		System.out.println();
		
		s1 = new StringBuffer("我愛學習java程式設計!");
		System.out.println("s1=\"" + s1 + "\"，其長度為"+s1.length());
		s1.replace(4,8,"JAVA");
		System.out.println("s1=\"" + s1 + "\"，其長度為"+s1.length());
		s1.delete(4,8);
		System.out.println("s1=\"" + s1 + "\"，其長度為"+s1.length());
		
		
	}

}

```

\#下午物件導向函式觀念

### ##先弄java 迴圈作業&#xD;

#### 第一題 多for則複雜度（Time complexity)越高 &#xD;

感覺要挑戰4層比較猛，不過老師的是兩層第二層內做運算

#### 第二題老師用break做停止 好像也是低複雜度的&#xD;

#### 第三題這次用!= 不等於然後有用while&#xD;

### 階段性作業3&#xD;

	利用課堂教學之IO輸出與輸入、邏輯控制敘述、迴圈結構等Java語法，完成所要求之程式功能設計：

1\.	For 迴圈，達成列印 99 乘法表的功能

	使用For 迴圈，列印出99乘法表

	自行設定迴圈所需的控制變數與條件關係式

	參考輸出格式如下圖

![](/files/-LeH5Cj5kNA1FRRirceE)

```
    package com.example.java;

    import java.util.Scanner;

    public class Java_homework3_1 {

    public static void main(String[] args) {
            // TODO 自動產生的方法 Stub. 



    //第一題 多for
    //則複雜度（Time complexity)
    //越高 感覺要挑戰 4層比較猛 不過老師的是三層

    //for(int x=1;x<=9;x++){for(int y=1;y<=9;y++){for(int z=1;z<=3;z++){ for(int t=1;t<=3;t++){System.out.println(z);
    //}}}}

    //老師版本第一題

        for (int i = 1; i <= 9; i += 3) {for (int j = 1; j <= 9; j++) {System.out.print(i + "x" + j + "=" + i * j + "\t");
        System.out.print((i + 1) + "x" + j + "=" + (i + 1) * j + "\t");
        System.out.println((i + 2) + "x" + j + "=" + (i + 2) * j);
        }System.out.println("----------------------");
        }


    }
    }
```

2\.	使用 for 迴圈，算出小於等於 N 的所有質數

	需利用輸出與輸入功能提示使用者輸入變數N&#x20;

	使用For 迴圈，依據變數N列印出乘法表

	自行設定迴圈所需的控制變數與條件關係式質數指在大於1的数中，除了1和該数自身外，無法被其他自然数整除

	參考輸出格式如下圖

![](/files/-LeH5JElfcwO8nh3d_BM)

```
    package com.example.java;

    import java.util.Scanner;

    public class Java_homework3_2 {

    public static void main(String[] args) {
            // TODO 自動產生的方法 Stub. 

        //老師做第三題用!=不等於然後有用while

            int t1, t2, t3 = 0 ,t4;
            boolean isPrimeNo;
            Scanner t5 = new Scanner(System.in);

            System.out.println("輸入整數  >>");
            t4 = t5.nextInt();

            t1 = 2;
            System.out.print("小於等於"+t4+"質數有：");
            while (t1 <= t4) {isPrimeNo = true;t2 = 2;
            do {if (t1 != 2 && t1 % t2 == 0) {isPrimeNo = false;break;
            }t2++;
            }while (t2 <= (t1 - 1));
            if(isPrimeNo == true){t3++;
            System.out.print(t1 + ",");
            }t1++;
            }System.out.print("共計" + t3 + "個質數");

            t5.close();
    }
    }
```

3\.	使用 while 迴圈，算出小於等於 N 的所有質數

	需利用輸出與輸入功能提示使用者輸入變數N&#x20;

	使用while迴圈，依據變數N列印出乘法表

	自行設定迴圈所需的控制變數與條件關係式

	質數指在大於1的数中，除了1和該数自身外，無法被其他自然数整除

	參考輸出格式如下圖

![](/files/-LeH5MQ2FzsTuOvX9P31)

```
    package com.example.java;

    import java.util.Scanner;

    public class Java_homework3_3 {

    public static void main(String[] args) {
            // TODO 自動產生的方法 Stub. 



        //老師做第三題用!=不等於然後有用while

                int t1, t2, t3 = 0 ,t4;
                boolean isPrimeNo;
                Scanner t5 = new Scanner(System.in);

                System.out.println("輸入整數  >>");
                t4 = t5.nextInt();

                t1 = 2;
                System.out.print("小於等於"+t4+"質數有：");
                while (t1 <= t4) {isPrimeNo = true;t2 = 2;
                do {if (t1 != 2 && t1 % t2 == 0) {isPrimeNo = false;break;
                }t2++;
                }while (t2 <= (t1 - 1));
                if(isPrimeNo == true){t3++;
                System.out.print(t1 + ",");
                }t1++;
                }System.out.print("共計" + t3 + "個質數");

                t5.close();
    }
    }
```

\#函式&#x20;

成員函數 物件導向內稱為 方法 method

### ##優點&#xD;

模組化 可重複呼叫 節省成本

只需要給參數即可達到那個函數的結果

不用知道函數的內容

簡化程式碼

容易除錯維護(因為呼叫的功能是人家除錯完畢的，只要注意自己的程式碼即可

光是多型內就有很多不同參數版本原因是本來就

底層需要考慮字串串不同型態的資料

但藉由函式不同的多型即可已簡化很多行底層程式碼

充分發揮資訊隱藏

(可以自己決定是否隱藏具有類似權限的功能

除非將二進位碼反組譯否則隱藏性很高

、多載

、改寫

然後因為以上特性所以一定有文件可以看，否則其他人根本不知道怎用

Override等物件導向特性

#### 以前不是物件導向時就有函數了稱為funtion&#xD;

### ##函式存取概念 ( 類似權限&#xD;

Public公開&#x20;

內部外部任一個class皆可存取

Private私有&#x20;

同一個內部class才可存取

![](/files/-LeH5aG9bZeQRrxDy8E_)

Protected保護&#x20;

同一個package內部的class才可存取，不同的package要有繼承才可存取

![](/files/-LeH5f4Uqo59GcELAxhj)
