• ベストアンサー

Javaのブロックについて

Javaの初期化子でstatic初期化子のテストをしていた際、static初期化子の動作はなんとか理解できたのですが、static初期化子のstaticを取った何もないブロック?の動作がいまいち理解できません。 単なるブロックなので無視されるかと思いきや、インスタンス化したときちゃんと初期化されるのです。 しかもstatic初期化子はインスタンス化の前に実行されるのでthisが使えないのは納得いくのですが、このブロックではthisも使えてしまいます。 一応ググってみたのですが私には見つけられませんでした。 この動作について説明していただけるか、もしくは解説してあるサイトなどご存知ではないでしょうか? スタックなどの内部動作まで詳しく書いてあるとなおうれしいのですが。 public class Order { private String name = "佐藤"; public Order() { System.out.println("高橋"); } //このブロックの動作が謎です。 { System.out.println(this.name); //thisが使える。 System.out.println("山田"); } static { //System.out.println(this.name); インスタンス化前なのでエラー System.out.println("鈴木"); } } 実行クラス public class OrderTest { public static void main(String[] args) { Order order = new Order(); } } 実行結果 鈴木 佐藤 山田 高橋 実行環境 jre1.5.0_06

  • Java
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

インスタンスイニシャライザは、無名内部クラスがコンストラクタを持てないため、その代わりとして導入された、という説が有力です。ちなみに私は、この説のとおりの使い方をときどきします。

picho4
質問者

補足

ありがとうございました。 なるほど、無名内部クラスの初期化などに利用できるのですね。 それにしても内部でどういう動きをしているのか頭が混乱してしまいます。

その他の回答 (2)

回答No.3

これは、インスタンスイニシャライザとかインスタンス初期化子といわれるもので、コンストラクタの直前に呼ばれます。 (厳密には親のコンストラクタの呼びだし後、自分のコンストラクタの直前です。) リンク先にもありますが、基本的には使わない代物(一般的ではない)です。

参考URL:
http://www.kab-studio.biz/Programing/JavaA2Z/Word/00001086.html
  • MASA_H
  • ベストアンサー率42% (64/151)
回答No.1

staticじゃない初期化子ということでは? static初期化子はインスタンスがいくら作られようと最初のインスタンス生成時のみしか実行されませんが、該当部分は各インスタンス生成時に実行されるということでしょう。

picho4
質問者

お礼

ありがとうございます。 なるほど、たんなる初期化子と考えると簡単に理解できました。 しかし、このブロックはJavaをやっている人には常識なのでしょうか。 あまり使っているところを見たことがありませんでした。

関連するQ&A

  • java 一意のIDを振り分けるには。。。

    一意のIDの振り分け方がわかりません。。。 以下のプログラムを改良したいのですが。 CustomerManagerが内部でです。ただCustomerManagerインスタンス毎に一意で構いません。 addCustomerメソッドの整数型引数は除去します。 何卒ご回答よろしくお願い致します。 package exercise12; class CustomerCard { String name; int id; public CustomerCard(int id,String name){ this.name = name; this.id = id; } public String getName(){ return this.name; } } package exercise12; class CustomerManager { public static void main(String[] args){ CustomerManager manager = new CustomerManager(); manager.addCustomerCard(1, "山田一郎"); manager.addCustomerCard(2, "鈴木太郎"); manager.addCustomerCard(3, "田中次郎"); manager.printAllInfo(); } private CustomerCard[] customers = new CustomerCard[4]; private int index = 0; public void addCustomerCard(int id,String name){ customers[index] = new CustomerCard(id,name); index++; } public void printAllInfo() { System.out.print("ID =" + customers[0].id + ","); System.out.println("名前 = " + customers[0].name); System.out.print("ID =" + customers[1].id + ","); System.out.println("名前 = " + customers[1].name); System.out.print("ID =" + customers[2].id + ","); System.out.println("名前 = " + customers[2].name); } }

    • ベストアンサー
    • Java
  • javaに関しての質問です (エラー)

    最近javaの勉強を始めたばかりの者です とある動画をみながら勉強をしていたのですが なぜかエラーが出てしまいます。 エラーの内容は... エラー:この文に制御が移ることはありません     if( c== 13){ エラー:return文が指定されていません この二つです、もし解決方法がわかる方がいましたらぜひ教えてくれるとうれしいです 下がソースコードになります。 public class part01 { static String name = "すけさん"; static int lv = 30; public static void main( String[] args )throws java.io.IOException { putzyosyou(); // 序章を表示 putcommnd(); if(lv<40){ putgameover(); }else{ putgamecrear(); } } public static void putzyosyou() { System.out.println("魔王が世界を滅ぼそうとしている。"); System.out.println(name + "はレベルが" + lv + "のツワモノです"); } public static void putcommnd()throws java.io.IOException { System.out.println("1.魔王を倒しに行く"); System.out.println("2.修行する"); System.out.println("3.だれかに頼る"); System.out.println("4.そんなことよりも寝よう"); int c = inputcommnd(); if( c== '1' ){ System.out.println("魔王が現れた!!"); }else if( c== '2' ){ lv += 2; System.out.println ("レベルが"+ lv + "になった!!"); putcommnd(); } } public static int inputcommnd()throws java.io.IOException { int c = System.in.read(); if( c== 10){ return( inputcommnd() ); if( c== 13){ return( inputcommnd() ); } return( c ); } } public static void putgameover() { System.out.println(name + "は負けました。"); System.out.println("GAME OVER"); } public static void putgamecrear() { String str = name + "は魔王を倒しました。"; put( str ); if(lv>120){ System.out.println("レベル" + lv + "なので魔王ゴミでした"); }else if(lv>80){ System.out.println("レベル" + lv + "なので余裕でした"); }else if(lv>50){ System.out.println("レベル" + lv + "なので倒せました"); }else{ System.out.println("レベル" + lv + "なので苦戦しました"); } System.out.println("GAME CREAR"); } static void put( String str ) { System.out.println( str ); } }

    • ベストアンサー
    • Java
  • java.util.Listについてです。

    以下の配列プログラムをava.util.Listを使うとどういう感じになるのでしょうか? 何卒ご回答よろしくお願い致します。 class CustomerManager { public static void main(String[] args){ CustomerManager manager = new CustomerManager(); manager.addCustomerCard( "山田一郎"); manager.addCustomerCard( "鈴木太郎"); manager.addCustomerCard( "田中次郎"); manager.printAllInfo(); } private CustomerCard[] customers = new CustomerCard[5]; private int index = 0; public void addCustomerCard(String name){ customers[index] = new CustomerCard(1 + index,name); index++; } public void printAllInfo() { System.out.print("ID =" + customers[0].id + ","); System.out.println("名前 = " + customers[0].name); System.out.print("ID =" + customers[1].id + ","); System.out.println("名前 = " + customers[1].name); System.out.print("ID =" + customers[2].id + ","); System.out.println("名前 = " + customers[2].name); } } class CustomerCard { String name; int id; public CustomerCard(int id,String name){ this.name = name; this.id = id; } public String getName(){ return this.name; } }

    • ベストアンサー
    • Java
  • java 入力命令

    以下うまくどうさしません、教えてください。 public class Main { public static void main(String[] args){ System.out.println("名前"); String name = new java.util.Scanner(System.in) .nextLine(); System.out.println("年齢"); int age = new java.util.Scanner(System.in) .nextInt(); System.out.println (age + name); } }

  • 参照渡し?

    お世話になります。 下記のソースを実行すると public class ExecMain { public static void main(String[] args) { ObjectLife obj = new ObjectLife(); ObjectLife obj2 = obj; obj = null; System.out.println(obj); System.out.println(obj2); } static class ObjectLife { public ObjectLife() { create(); } public void create() { System.out.println("create calling"); } public void destroy() { System.out.println("destroy calling"); this = null; } } } -------------------- create calling null objectLife.ExecMain$ObjectLife@1b90b39 という実行結果になりました。 「objectLife.ExecMain$ObjectLife@1b90b39」 がnullにならないのはどうしてなのでしょう? また this=null; で自分自身のインスタンスをnullにしようとおもったのですが コンパイルはとおるのですが実行してもなにもおきていないようです。 これはどのように解釈すればよいのでしょうか? 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaプログラム 合ってるかお願いします

    プログラムは非常に苦手なため合ってないと思いますが、合ってないのは何が正解かを教えてください。 よろしくお願いします 1 ローカル変数を全て答えよ args,num 2 インスタンス変数を全て答えよ num 3 インスタンスメソッド名を答えよ Example2 4インスタンスメソッドを呼び出している行 public class Example2{ int num; public static viod main(String[] args){ Example2 ex2 = new Example2(5); int a = ex2.getNum(); System.out.println(a); } Example2(int num){ this.num=num; } int getNum(){ return this.num; } }

    • ベストアンサー
    • Java
  • java.until.Mapに関してです。

    以下のプログラムで配列部分をjava.until.Map(キーはID)に変更して、 こんな事やるとどういうプログラムになるのでしょうか? 何卒ご回答よろしくお願い致します。 ・顧客情報を取得するgetCustomer(int id)メソッドを作成する ・顧客情報を変更するupdateCustomer(int id, String name)メソッド、 顧客情報を削除するdeleteCustomer(int id)メソッドを作成する  但し、指定idの顧客情報が存在しない場合は例外をスローしたいのです。 class CustomerManager { public static void main(String[] args){ CustomerManager manager = new CustomerManager(); manager.addCustomerCard( "山田一郎"); manager.addCustomerCard( "鈴木太郎"); manager.addCustomerCard( "田中次郎"); manager.printAllInfo(); } private CustomerCard[] customers = new CustomerCard[5]; private int index = 0; public void addCustomerCard(String name){ customers[index] = new CustomerCard(1 + index,name); index++; } public void printAllInfo() { System.out.print("ID =" + customers[0].id + ","); System.out.println("名前 = " + customers[0].name); System.out.print("ID =" + customers[1].id + ","); System.out.println("名前 = " + customers[1].name); System.out.print("ID =" + customers[2].id + ","); System.out.println("名前 = " + customers[2].name); } } class CustomerCard { String name; int id; public CustomerCard(int id,String name){ this.name = name; this.id = id; } public String getName(){ return this.name; } }

    • ベストアンサー
    • Java
  • javaのプログラムについて

    以下のプログラムを実行するとエラーが起こるのですが原因はなんですか? class Tokuten { private String name; private int eng; private int math; private int sci; public void setData(String n, int e, int m, int s) { if(g>0 && g <1000){ name = n; eng = e; math = m; sci = s; } void show() { System.out.println("受験生の名前は" + name + "です。"); System.out.println("英語は" + eng + "点です。"); System.out.println("数学は" + math + "点です。"); System.out.println("理科は" + sci + "点です。"); } } class TokutenMain { public static void main(String[] args) { Tokuten jukensei = new Tokuten(); jukensei.setData("Hanako",81,67,78); jukensei.show(); } }

  • JAVAコードの実行順番が理解できず困っています

    JAVAを勉強したての超初心者です。 以下のコードの実行順番が理解できず困っています。 1 public class Test { 2 public static void main(String[] args){ 3 System.out.println("1"); 4 Chara ch = (int num) -> { 5 System.out.println(num); 6 System.out.println("3"); 7 }; 8 System.out.println("2"); 9 ch.move(100); 10 } 11 } 12 @FunctionalInterface 13 interface Chara{ 14 void move(int num); 15 } 実行しますと『1、2、100、3』の順序で表示されますが、4行目のラムダ式の実装部分が実行されないのは何故なのか分かりません。 自分で考えた解釈としまして、4行目のラムダ式のインスタンス生成だけはするが、5・6行目は実行せず通過、8・9行目の処理を行い、9行目のメソッド(ch.move(100))呼出しでラムダ式の実装部分が実行されると思っています。 ネットで色々とJavaの実行順番の解説等を探してみましたが、見つからなく質問しました。 拙い文章で恐縮しますが、実行順序解説宜しくお願い致します。

    • ベストアンサー
    • Java
  • javaプログラムのクラス図など

    「下記のプログラム例のクラス図を描き、プログラム例にはクラス図に対応するブロックにブロックコメントを挿入しなさい。最後にプログラム例でオブジェクト指向の三大要素がどのように実現されているかを説明してください。」 の部分が3週間自分なりに調べたりしたのですが全く分からなく このように質問している恥ずかしい状況です(>_<) 正直言って、明日までの課題です。。。 人生がかかっている言うと大袈裟に聞こえるかもしれないんですが 正直その通りなんです。。。 お力添えしていただける方を探しています。 どうか、お助けください。。。。。。 問題 オブジェクト指向の三大要素についてまとめなさい。次に、下記のプログラム例のクラス図を描き、プログラム例にはクラス図に対応するブロックにブロックコメントを挿入しなさい。最後にプログラム例でオブジェクト指向の三大要素がどのように実現されているかを説明してください。 Animalインタフェース public interface Animal { public abstract void bark(); } ーーーーーーーーーーーーーーー Petインタフェース public interface Pet extends Animal { public String getName(); } ーーーーーーーーーーーーーーー Catクラス class Cat implements Pet { private String name; public Cat(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("ね こ:ニャー"); } } ーーーーーーーーーーーーーーー Dogクラス class Dog implements Pet { private String name; public Dog(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("い ぬ:ワン"); } } ーーーーーーーーーーーーーーーー Duckクラス class Duck implements Pet { private String name; public Duck(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("あひる:ガーガー"); } } ーーーーーーーーーーーーーーーー Frogクラス class Frog implements Pet { private String name; public Frog(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("かえる:ケロケロ"); } } ーーーーーーーーーーーーーーーー PetTestクラス public class PetTest { public static void main (String[] args) { Pet[] pets = {new Cat("タロー"), new Dog("ミケ"), new Frog("ケロ"), new Duck("ドナルド") }; System.out.println(); for(Pet pet: pets) { System.out.printf("\t%8s\t", pet.getName()); pet.bark(); } System.out.println(); } } ーーーーーーーーーーーーーーーーーー 実行結果がこうなります D:\Work >java PetTest タロー ね こ:ニャー ミケ い ぬ:ワン ケロ かえる:ケロケロ ドナルド あひる:ガーガー -- Press any key to exit (Input "c" to continue) -- 上の問題なのですが もし解くことができる方がいましたら お願いします_(._.)_