# 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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://johch3n611u.gitbook.io/c50108/ju-li-cheng-bei/201905/20190507java-wu-jian-xiang-+-han-shi-nian-duan-xing-zuo-san.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
