クラスをnewでインスタンス(オブジェクト)を生成して使う。
// Randomクラスの場合 Random ran = new Random(); int num = ran.nextInt(10);
上の例の ran は「Random」クラスのインスタンスを入れるための変数。
new でRandomクラスのインスタンスを生成している。
nextInt()はメソッドの呼び出し
class クラス名{
フィールド
フィールド
・
・
メソッド
メソッド
・
・
}
class Member{
String name; // フィールド
int age; // フィールド
public void show(){ // メソッド
System.out.println(this.name + " " + this.age + "歳");
}
}
クラスはインスタンスを生成しないと使えない。
Member m = new Member(); // Memberクラスのインスタンスの作成 // フィールドの設定 m.name = "田中"; m.age = 30; // メソッドの使用 m.show();
上の例のmはMemberインスタンスを入れるための変数。new Member()でMemberクラスのインスタンスを生成している。
class Member{
String name;
int age;
public Member(){ // これがコンストラクタ
age = 30; // newしたときに ageに30が入る。
}
}
Member m = new Member(); // 自動的にコンストラクタが呼ばれる System.out.println( m.age ); // 30と表示
コンストラクタに引数を付けると、それをnewするときに指定できる
class Member{
String name;
int age;
public Member(String n,int a){
name = n;
age = a;
}
}
Member m = new Member("田中",30);
System.out.println( m.name ); // 田中と表示
フィールドを使用したコンストラクタはEclipseのメニューから[ソース]-[フィールドを使用してコンストラクタを生成]で自動的に作ることが出来る
詳細はクラスの配列で
クラス名[] 変数名 = new クラス名[要素数];
Member[] members = new Member[3]; // 3人分
members[0] = new Member("佐藤",30);
members[1] = new Member("山田",25);
members[2] = new Member("加藤",40);
クラス名[] 変数名 = { new クラス名(),new クラス名(),new クラス名()};
Member[] members = {new Member(),new Member(),new Member()};
for( クラス名 変数名 : クラス配列名 ){
}
for( Member m : members ){
m.show();
}
ArrayList<クラス名> 変数名 = new ArrayList<クラス名>(); 変数名.add( インスタンス );
// Memberクラスの場合
ArrayList<Member> list = new ArrayList<Member>();
list.add(new Member("佐藤",30));
list.add(new Member("山田",25));
list.add(new Member("加藤",40));
for(Member m : list){
System.out.println( m.name );
}
クラスのメンバを外部からアクセスできないようにする
属性・コンストラクタ・メソッドの前に付ける
| private | 同じクラスからのみアクセスできる |
| 無指定 | 同じパッケージからのみアクセスできる |
| protected | 無指定に加えサブクラスからはアクセスできる |
| public | どこからでもアクセスできる |
private int num;
慣習として
class Member{
private String name; // privateなので外部からアクセスできない
public void setName(String n){
name = n;
}
public String getName(){
return name;
}
}
// 外部からの利用例
Member m = new Member();
m.setName("鈴木");
String name = m.getName();
getterとsetterはEclipseのメニューから[ソース]-[getterおよびsetterを生成]で自動的に作ることが出来る
staticが付いた変数=クラス変数
staticが付いたメソッド=クラスメソッド
staticが付いていない変数=インスタンス変数
staticが付いていないメソッド=インスタンスメソッド
インスタンス変数、インスタンスメソッドはインスタンスの数だけ存在する。つまり、newした数だけ存在する。
クラス変数、メソッドはインスタンスの数に関わらず、常に1個のみ存在する。newしなくても1個存在するので、いきなり使用可能。
使用法:クラス名.メンバー名
class Animal{
static void show(){
System.out.println("動物");
}
}
// 上のshowメソッドを使う場合
Animal.show();
staticが付いたメソッドからはstaticが付いた変数・メソッドしか扱えない
class Animal{
String name;
static int num;
static void show(){
System.out.println(num); // OK
System.out.println(name); // エラー
}
}
スーパークラス(親クラス)のフィールド・メソッドを全て引き継いでサブクラスを作る
class サブクラス名 extends スーパークラス名{
}
//例:Animalクラスを継承しDogクラス
class Animal{
String name;
void showName(){
System.out.println(name);
}
}
class Dog extends Animal{
void naku(){
System.out.println("ワン");
}
}
Dog d = new Dog(); d.name = "ぽち"; // スーパークラスの属性を使う d.showName(); // スーパークラスのメソッドを使う d.naku();
スーパークラスのメソッドをサブクラスで上書き
//例:Animalクラスを継承しDogクラス
class Animal{
String name;
void naku(){
System.out.println("がおー");
}
}
class Dog extends Animal{
void naku(){
System.out.println("ワン");
}
}
Dog d = new Dog(); d.naku(); // ワンと表示
スーパークラス型にサブクラスのインスタンスを代入可能
Animal a = new Dog();
変数の型にかかわらず、インスタンスのメソッドが呼び出される
Animal a = new Dog(); a.naku(); // ワンと表示
なお、逆(サブクラス型の変数にスーパークラス型のインスタンスを代入)にはキャストが必要。
Animal a = new Dog(); Dog d = (Dog)a;
コンストラクタは継承されないので、サブクラスのコンストラクタからはスーパークラスのコンストラクタを必ず呼び出す。
スーパークラスのコンストラクタは super(引数) で呼び出せる
class Animal{
Animal(){
System.out.print("動物");
}
Animal(String name){
System.out.print(name);
}
}
class Dog extends Animal{
Dog(){
super("犬"); // Animal(String name)が呼び出される。
System.out.print("わんわん");
}
}
// Dogのインスタンスを作る
Dog d = new Dog(); // 犬わんわんと表示
スーパークラスのコンストラクタ呼び出しを書かない場合、自動的に引数無しのsuper()を書いたものと見なされる
class Animal{
Animal(){
System.out.print("動物");
}
Animal(String name){
System.out.print(name);
}
}
class Dog extends Animal{
Dog(){
// superを指定していないのでsuper() とみなされる
System.out.print("わんわん");
}
}
// Dogのインスタンスを作る
Dog d = new Dog(); // 動物わんわんと表示
呼び出すコンストラクタがスーパークラスにない場合、エラー
class Animal{
Animal(String name){
System.out.print(name);
}
}
class Dog extends Animal{
Dog(){
// superを指定していないのでsuper() とみなされる
System.out.print("わんわん");
}
}
// Dogのインスタンスを作る
Dog d = new Dog(); // エラー。Animal()が無い
//例:Animalクラス
abstract class Animal{
String name;
abstract public void naku(); // 抽象メソッド
}
class Dog extends Animal{
public void naku(){ // 必ずオーバーライド
System.out.print("わんわん");
}
}
//例:Animalクラス
interface Animal{
void naku(); // 自動的に public abstract
}
class Dog implements Animal{
public void naku(){ // 必ずオーバーライド
System.out.print("わんわん");
}
}
インタフェースを実装したクラスはそのメソッドを全てオーバーライドしなければならない。
オーバーライドしないなら、抽象クラスになる(抽象メソッドがあるので)。