JAVA メモ 完全修飾クラス名/staticインポートの躓きやすい処(重要)

##完全修飾クラス名
正式なクラス名は常にパッケージとの組み合わせで表現される
「String」のようにクラス名単独で登場しますが、あくまでも「java.lang.String」が正式なクラス名。Java用語では、Stringのような省略形を「単純名（simple name）」、「java.lang.String」のような形式を「完全修飾名（fully qualified name）」と呼ぶ。

```java
public class Test13 {
	public static void main(String[] args) {
		java.lang.String a = "こんにちは";
		System.out.println(a);
	}

}
```

■実行結果
こんにちは

##無名パッケージに属するクラスは、同じ無名パッケージに属するクラスからしかアクセスできない

■Sample.java エラーになる例

```java
package ex5;

public class Sample {
	public static void main(String[] args) {
		System.out.println(num);
	}
}
```

■Test13.java　エラーになる例

```java
public class Test13 {
	protected int num = 10;
}
```

##FQCN(完全限定クラス名)入力の手間を省くための宣言

**import パッケージ名.クラス名;**

##staticインポート

staticインポートとは、static変数やstaticメソッドをクラス名を指定せずに使用する機能です。これにより、使用するたびにクラス名を記述する必要がなくなります。キーワードとして**import static**を使用し、完全修飾名およびインポートしたいstatic変数やstaticメソッドを指定します。 ※完全修飾名とは、「パッケージ名.クラス名」といった正式なクラス名称のことです。

**【構文】
import static パッケージ名.クラス名.static変数名;
import static パッケージ名.クラス名.staticメソッド名;
import static パッケージ名.クラス名.*;**
http://www.atmarkit.co.jp/ait/articles/0801/15/news158_2.html

■OverloadImport.java

```java
package ex6;
import static ex6.Test.print;

public class OverloadImport {
	public static void main(String[] args) {
		print("sample");
		print();
	}
}
```

■Test.java

```java
package ex6;

public class Test {
	public static void print() {
		System.out.println("default");
	}

	public static void print(String str) {
		System.out.println(str);
	}

}
```

■実行結果
sample
default

■補足
import static ex6.Test.print;　は
import static ex6.Test.*;　でもいい

##
■Test14.java

```java
//import static Test141.num;
//import static Test141.print;

public class Test14 {
	public static void main(String[] args) {
		Test141.num = 10;
		Test141.print();
	}

}
```

■Test141.java

```java
public class Test141 {
	public static int num = 0;

	public static void print() {
		System.out.println(num);
	}

}
```

##デフォルトパッケージはインポートできませんし、staticインポートも出来ない。staticインポートの検証を行いたいなら、パッケージは必須。

■実行結果
10

■Test16ex.java

```java
package ex1;

import static ex1.Test16.num;
import static ex1.Test16.print;

public class Test16ex {
	public static void main(String[] args){
	num = 10;
	print();
	}
}
```

■Test16.java

```java
package ex1;

public class Test16 {
	public static int num = 0;

	public static void print() {
		System.out.println(num);
	}

}
```

■実行結果
10

■補足

import static ex1.Test16.num;
import static ex1.Test16.print;
は
import static ex1.Test16.*;
とワイルドカードを使用して１つにまとめてもいい

■補足
Test16ex.javaを、

```java
package ex1;

//import static ex1.Test16.*;

public class Test16ex {
	public static void main(String[] args){
	Test16.num = 10;
	Test16.print();
	}
}
```

としてもいい。

#まとめ
##今回staticインポートの勉強でわかったこと

- [x] 同じpackageに属するクラスの変数を使いたいときは、はimportしなくても、クラス名.変数で使える
- [ ] default packageはインポートできないし、staticインポート出来ない。staticインポートの検証をしたいなら、packageは必須
- [ ] import static ex1.Test16.*;などの様に、ワイルドカードを使ってimport文を１つにすると楽

##インポートしたクラスに、インポートされたメソッドやフィールドと同名のものがあった場合、そのインポートは無視される

■Main.java

```java
package ex7;

public class Main {
	private final static int VALUE = 0;

	public static void main(String[] args) {
		System.out.println(VALUE);
	}

}
```

■Sample.java

```java
package ex7;

public class Sample {
	public final static int VALUE = 10;

}
```

■実行結果
0

■補足
Main.javaをコンパイルすると、自動的に

```java
package ex7;

public class Main {
	private final static int VALUE = 0;

	public static void main(String[] args) {
		System.out.println(ex7.Main.VALUE);
	}

}
```
となる