java.langまとめ1（String,Class）

## Stringクラス
文字列を表現するクラス。

例えば、普段は次のように文字列を定義するが、

```java:
String str = "Java String";
```

は

```java:
String str = new String("Java String");
```

と同じ。
インスタンス化されていないように見えて実は1回1回文字列を定義することでそれごとにインスタンス化されている。

### trimメソッド
両端にある空白を削除するメソッド。

```java:StringTrim.java
public class StringTrim {

	public static void main(String[] args) {
		String str1 = "   Java String Trim ";
		
		System.out.println(str1);
		System.out.println(str1.trim());
	}
}
```

結果は

```
   Java String Trim 
Java String Trim
```

となって、両端の空白だけが削除されている。

### charAtメソッド
指定したインデックスの文字列を取り出すメソッド。

```java:CharAtSample.java
public class CharAtSample {

	public static void main(String[] args) {
		String str = "Java String";
		
		System.out.println(str1.charAt(3));
	}
}
```

結果は

```
a
```

charAtメソッドでは上の"Java String"という文字列を次のようにみなしている。

| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|文字列 | J  | a  | v  | a  |   | S  |  t |  r |  i |  n |  g |

先ほどは引数（インデックス）に3と入れたのでインデックスの3番目の文字列が呼ばれた。

### indexOfメソッド
指定した文字列の始めに出現するインデックスを返すメソッド。

例えば、先ほどの"Java String"でaが初めに出現するインデックスを調べたいときは

```java:IndexOfSample.java
public class IndexOfSample {

	public static void main(String[] args) {
		String str = "Java String";
		
		System.out.println(str.indexOf(97));  //"a" = 0x0061 ->0x 0000 0000 0110 0001 -> 97
		System.out.println(str.indexOf("a"));
		System.out.println(str.indexOf("a", 3));
	}
}
```

結果はそれぞれ

```
1
1
3
```

となる。

1つ目の検索方法はUnicodeで（使いどころがわからない）検索をしている。
始めに出現するインデックスを検索したくないときは第2引数に検索を始めたいインデックスを指定してやればいい。

### substringメソッド
指定したインデックスから文字列を取り出すメソッド。

```java:SubstringSample.java
public class SubstringSample {

	public static void main(String[] args) {
		String str1 = "Java String";
		String str2 = "Java Oracle Sun Microsystems";
		
		System.out.println(str1.substring(3));
		System.out.println(str2.substring(7,21));
	}
}
```

結果は

```
a String
acle Sun Micro
```

となり、指定したインデックスから文字列が取り出されている。第2引数に指定したものはどこまでのインデックスまで取り出すか指定するもので、取り出したくない文字列とかがあったときや特定の文字列だけ取り出したいときに指定したりすると便利。

## Classクラス
### forNameメソッド
現在のクラスで引数に*完全修飾子名*で指定したクラスが関連付けられていれば、そのClassオブジェクトを返すメソッド。

例えば、

```java:ForNameSample.java
public class ForNameSample {
	
	public static void main(String[] args) throws ClassNotFoundException {
		System.out.println(Class.forName("java.lang.String"));
	}
}
```

と`java.lang.String`があるかどうか確認すると

```
class java.lang.String
```

となり、ForNameSampleクラスにStringが関連づけられていることが確認できる。

これは、

```java:
Class.forName("java.lang.String", true, this.getClass().getClassLoader())
```

と同じで、実はクラス名を書いただけでClassLoaderが呼ばれてクラスをロードしている。（ClassLoaderクラスはその内...）

### isAssignableFromメソッド
引数で指定したクラスがサブクラスかどうか判定するメソッド。引数のクラスが指定したオブジェクトのサブクラスならtrueを返す。

```java:IsAssignableFromSample.java
public class IsAssignableFromSample {
	
	public class SuperClass {};
	public class SubClass extends SuperClass {};
	
	public static void main(String[] args) {
		
		if(SuperClass.class.isAssignableFrom(SubClass.class)){
			System.out.println("SubClassはSuperClassのサブクラスです。");
		}
		
		if(SubClass.class.isAssignableFrom(SuperClass.class)){
			System.out.println("SuperClassはSubClassのサブクラスです。");
		}
	}
}
```

結果は

```
SubClassはSuperClassのサブクラスです。
```

となってSubClassクラスがSuperClassクラスを継承しているので、trueを返してメッセージを出力してくれる。

### getNameメソッド
指定したオブジェクトの持つクラスの名前を取得するメソッド。

### asSubclassメソッド
引数で指定したクラスが指定したオブジェクトのスーパークラスならそのオブジェクトのクラスを返すメソッド。