# JAVA教學---Defining Classes II
###### tags: `JAVA教學`
[TOC]
# 5.1 Static Methods and Static Variables
## Static method
:::warning
A static method is one that can be used without a calling object.
不用先宣告一個Object就可以使用。
:::
在**不同**class時的呼叫
```java
public static returnedType myMethod(parameters)
{ . . . }
```
```java
returnedValue = MyClass.myMethod(arguments);
```
```java
public class StaticTest {
public static void main(String[] args) {
int sum = Tool.add(1,1);
System.out.println(sum);
}
}
public class Tool {
public static int add(int a, int b){
return a+b;
}
}
```
:::warning
A static method **cannot** refer to an **nonstatic instance variable** of the class, and it cannot invoke a **nonstatic method** of the class.
:::
:::warning
A static method has no **this**, so it cannot use an instance variable or method that has an implicit or explicit this for a calling object.
However,a static method can invoke another **static method**,and **static instance variable**.
:::
在**同個**class時的呼叫
```java=
public class Statictest {
public static void main(String[] args) {
int sum = add(1,1);
System.out.println(sum);
Statictest st = new Statictest();
sum = st.add2(2,2); // 不能用sum = add2(2,2);
System.out.println(sum);
}
public static int add(int a, int b){
return a+b;
}
public int add2(int a, int b){
return a+b;
}
}
```
## Static variables
:::warning
A static variable is a variable that belongs to the class as a whole, and not just to one object.
即所有透過這個Class宣告的Object都共用這個Static variable,有任一個Object改變了這個variable,其他Object也會受到改變.
:::
```java=
public class Statictest {
public static int port = 80;
public static void main(String[] args) {
Statictest obj1 = new Statictest();
Statictest obj2 = new Statictest();
System.out.println(port); //也可用Statictest.port
System.out.println(obj1.port); // 80
System.out.println(obj2.port); // 80
port = 1234;
System.out.println(obj1.port); // 1234
obj2.port = 5678;
System.out.println(obj1.port); // 5678
}
}
```
## Math Class
**Math**提供多個數學計算method,且Math是在**java.lang package**,所以不需要import。
**Math**的所有**data**和**method**皆為**static**,直接用**Math.data**或者**Math.method**即可使用,不用再宣告一個物件。
Math的**predefined constants**有兩個,自然對數e和圓周率$\pi$
```java
double e = Math.E;
double pi = Math.PI;
```
* 指數計算
```java
public static double pow(double base, double exponent)
```
* 絕對值
```java
public static double abs(double argument)
public static float abs(float argument)
public static long abs(long argument)
public static int abs(int argument)
```
* 最小值
```java
public static double min(double n1, double n2)
public static float min(float n1, float n2)
public static long min(long n1, long n2)
public static int min(int n1, int n2)
```
* 最大值
```java
public static double max(double n1, double n2)
public static float max(float n1, float n2)
public static long max(long n1, long n2)
public static int max(int n1, int n2)
```
* 四捨五入
```java
public static long round(double argument)
public static int round(float argument)
```
* 取ceiling
```java
public static double ceil(double argument)
```
> Math.ceil(3.1) = 4.0
* 取floor
```java
public static double floor(double argument)
```
> Math.floor(3.9) = 3.0
* 開根號
```java
public static double sqrt(double argument)
```
* 隨機數
```java
public static double random()
```
> 0 $\leq$ 回傳值 $<$ 1
## Wrapper Classes
Every primitive type has a corresponding wrapper class. A wrapper class allows you to have a class object that corresponds to a value of a primitive type. Wrapper classes also contain a number of useful predefined constants and static methods.
:::warning
primitive type不是Object,所以不會有method。
primitive type對應的wrapper才是Object,才有相關method。
開頭小寫的是primitive type,開頭大寫的是Object。
:::
* boxing
```java
Integer integerObject = new Integer(42);
Double price = new Double(499.99);
Character grade = new Character('A');
```
:::danger
Wrapper Classes 沒有 no-argument constructor。
所以宣告時一定要帶入參數。否則會compile error。
:::
* auto-boxing
```java
Integer a3 = 5;
Double price = 499.99;
Character grade = 'A';
```
* unboxing
```java
int i = integerObject.intValue();
double d = price.doubleValue();
char c = grade.charValue();
```
* auto-unboxing
```java
int a = integerObject;
double d = price;
char c = grade;
```
:::danger
int count = new Integer(12);
count 是 primitive type,不是 Object
:::
## Constants In Wrapper Classes
```java
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
System.out.println(Float.MAX_VALUE);
System.out.println(Float.MIN_VALUE);
System.out.println(Double.MAX_VALUE);
System.out.println(Double.MIN_VALUE);
```
## Static Methods in Wrapper Classes
* 數字String 轉成 數字
```java
int a = Integer.parseInt("123");
double b = Double.parseDouble("199.98");
```
* 數字 轉成 數字String
```java
String d = Integer.toString(123);
String c = Double.toString(199.98);
```
* 字元變大寫
```java
public static char toUpperCase(char argument)
```
* 字元變小寫
```java
public static char toLowerCase(char argument)
```
* 檢查大寫
```java
public static boolean isUpperCase(char argument)
```
* 檢查小寫
```java
public static boolean isLowerCase(char argument)
```
* 檢查空白,如 '\t' 和 '\n'
```java
public static boolean isWhitespace(char argument)
```
* 檢查字母
```java
public static boolean isLetter(char argument)
```
* 檢查數字
```java
public static boolean isDigit(char argument)
```
* 檢查字母或數字
```java
public static boolean isLetterOrDigit(char argument)
```
# 5.2 References and Class Parameters
## Variables and Memory
電腦有兩種 memory,分別為 **secondary memory** 和 **main memory** ,程式執行時會被放在 main memory。
Main memory 的 **address** 以 **byte** 為單位。Variable 至少占 1 個 byte。
**Variables** 有分為 **class type** 和 **primitive type**,但是兩者不太相同。
:::warning
***class type variable 和 primitive type variable 之間的差異***
A variable of a primitive type stores a value of that type. However, a variable of a class type **does not store an object of that class**. A variable of a class type stores the **reference (memory address)** of where the object is located in the **computer’s memory**. This causes some operations, such as = and ==, to behave quite differently for variables of a class type than they do for variables of a primitive type.
:::
## Reference
:::warning
***Reference Types***
A type whose variables contain references are called reference types. In Java, class types are **reference types**, but primitive types are **not reference types**.
Object 變數名稱存的值是 Object 的實際 **memory location**,不是實際的 **data**。
:::
```java
ToyClass variable1 = new ToyClass("Joe", 42);
ToyClass variable2;
variable2 = variable1; //Now both variables name the same object.
variable2.set("Josephine", 1);
System.out.println(variable1); //Invokes variable1's to String
// Output 為 Josephine 1
// 因為 variable1 和 variable2 指向通一個 Object
```
## Class Parametrs
:::danger
傳入到某method裡,而在method裡使用的參數稱為 **Parameters**
而原本傳入的參數稱為 **Arguments**
:::
:::warning
***class type parameters 和 primitive type parameters 之間的差異***
primitive type parameters 是 **call-by-value** ,對 primitive type parameters 的改變**不會影響**到原本 arguments 本身。
class type parameters 是 **call-by-reference** ,對 class type parameters 的改變**會影響**到原本 arguments(object) 本身。
:::
```java=
public class ToyClass{
private String name;
private int number;
public void makeEqual(ToyClass anObject){
anObject.name = this.name; // 會改變 anObject 原本所指向的 Object
anObject.number = this.number; // 會改變 anObject 原本所指向的 Object
}
public void tryToMakeEqual(int aNumber){
aNumber = this.number; // 不會改變原本傳入 aNumber 的值
}
}
```
## The Constant null
The **constant** null is a special constant that may be assigned to a variable of any class type, used to indicate that the variable has **no “real value.”**
```java
YourClass yourObject = null;
```
**null** is not an object. It is like a reference (memory address) that does not refer to any object
:::warning
要比較一個 object 是否包含 null,要用 == 或者 != ,不要用equals()
:::
```java
if (yourObject == null)
System.out.println("No real object here.");
```
:::danger
當1個 object 指向 null 時,它就**不能使用**任何 method,否則compiler會報錯出現 **"Null Pointer Exception"**。
:::
## The new Operator and Anonymous Objects
**new Operator** 是向 OS 要求一個 **memory location** 來存放 ToyClass Object,並且會回傳此 memory location,此記憶體位置由 variable1 接收。
```java
ToyClass variable1 = new ToyClass("Joe", 42);
```
當沒有變數接收**new Operator**所回傳的**memory location**時,則此 object 稱為 **anonymous Objects**,
# 5.3 Using and Misusing References
# 5.4 Packages and javadoc
:::warning
Although these are important topics, they are not used in the rest of this book. You can
study this section at any time you wish; you need not cover this section before studying
any other topic in this book
:::
```java
import java.util.Scanner; // 只引入java.util package 的 Scanner class
import java.util.*; // 引入java.util package 的所有 class
```
## Pitfall: Subdirectories Are Not Automatically Imported
subdirectory不會自動import。須改為以下範例。
```java
import utilities.numericstuff.*;
import utilities.numericstuff.statistical.*;
```