最終更新日



Javaプログラミングメモ2(オブジェクト)

1 まえがき 2 文字か数かの判定 3 オーバーライドと隠蔽

4 println文が使えるのはmainのみ? 5 スタックとオーバーライド 6 継承問題の確認

7 デコンパイラ

1 まえがき

Javaの基礎やフラクタル、数学基礎などのページを作成したのは、2003年8月。ちょうど1年たったが、この間はJavaについてはなにもしなかったが、サンマイクロのホームページのサンプルを解説した本を購入。
 「Javaチュートリアル 第3版」 M.カンピオーネ他 安藤慶一訳(ピアソン・エデュケーション 2001年11月)

オブジェクトについて詳しい説明があり、例題をトライしているうち、昨年の「Java の基礎」では、必要のないところにまでstaticをつけて、ほとんど、クラスメソッドとして扱っており、オブジェクトについて、ほんとうに理解しているとはいえないことに気づいた。これまでは、主に「独習Java」(ジョセフ・オニール、翔泳社 1999/5 初版)を参考にしてきたが、「Javaチュートリアル 第3版」には、ときにとんでもなく難しい例題がある。

上記の本の例題をアレンジしていく過程で、ひっかかったところなどをメモしておく。JavaTM 2 Platform, Standard Edition, 1.4.0 API 仕様 も参考にしつつ、悪戦苦闘した経過をほぼそのまま記述する。

1年間、Javaに触らなかったが、自分の試行錯誤結果をこまごまと書いた「Javaの基礎」 をみて、思い出すことも多かった。こちらも、わかっている方からみれば、何をしているの?ということの連続だろうが、しばらくすると、同じ間違いをしてしまいそうなので、あえて、また冗長に展開する。

いささか、奇異なタイトルもつけたが、2章から6章までは継承、オーバーライドに関するものである。「Javaチュートリアル 第3版」の5章までのトライで、特に苦労した例題が中心である。
 7章はがらりと変わって、デコンパイラ に関する資料的なもの。

このページを作成した直後、余勢をかって、クィックソートという難解な再帰用法を駆使したプログラムを扱って、悪戦苦闘の末、「Javaの基礎3」 を作成した。このページ作成時点ではまだあやしかった基本的なことがらへの理解がようやく深まったように思う。

2 文字か数かの判定

「Javaチュートリアル 第3版」 第4章 「オブジェクトの基礎と単純データのオブジェクト」 P168 演習2の単なる整数データの合計する問題を読み間違って、引数に文字列も含んでいる場合として考えた。

実際にはないかもしれないが、クラス名をMyAdder.classとして、下記のような例で、結果が33となるようにプログラムするのである。
 MyAdder 3 2b a5 10 x abc 20

// 最終TRY 引数が文字列のときは0とする。
public class MyAdder {
    public static void main(String[] args) {
        int argno = args.length;
        int sum = 0;
        
	for (int i=0; i < argno; i++) {
	    for (int j=0; j < args[i].length(); j++) { 
                if (Character.isLetter(args[i].charAt(j))) { 
			args[i]="0";
                        break;
                }
            }
        }
       
 	for (int i=0; i < argno; i++) {
               sum += Integer.valueOf(args[i]).intValue();
        }
        System.out.println("sum = " + sum);
    }
}

比較的すっきりしたこのプログラムに到達するまでに苦労したが、その過程は、引数に文字列も含む場合の足し算(txtファイル) におくが、間違ったところや試行錯誤の過程を要約しておく。 TRY1とかTRY2はこのファイルの中のプログラムをさしている。

[コメント]
1  characterごとに、isDigit(char) あるいは、isLetter(args[i].charAt(j))とする
  のかと考えつくまでにも、試行錯誤と失敗の連続であった。
    isLetter(char)にたどりついても、まず失敗したのは、その前に、Characterがい
  ることを忘れていた。 APIをみると、isLetter(char) にはstatic
  がついており、Characterクラスのメソッドなのに。

2  配列や引数全体のときは、array.length とか args.length と変数でよいため、
  個々の引数の文字列の長さもargs[i].length としていたが、エラー。
   String のときはメソッドでないとだめ。args[i].length() とする。
 
3 個々の引数に文字がはいっているときは、その引数を0として、チェックルーティンを
 抜け出すためのbreakをいれる。この位置をTRY1のようにすると、たとえば、2bという
 データはすり抜けて数とみなされてエラーとなる。その理由はいまのところ、不明。 
   if文だけにbreak をいれると「break が switch 文またはループの外にある」と
 エラーになったのに!!

4  sum += Integer.valueOf(args[i]).IntegerValue();
   は、互換性のない型とのエラー。IntegerValue()はintValue()であった。
     sum += (int)(args[i])ではだめだった。型変換は数の基本型だけに通用するもの
   と思ったから、2章のように、クラスにもあるようだ。

5 TRY2に至る前は、文字列のとき0にするのではなく、無視する もの。
 iを増やして失敗したため、判定フラグを使ったのが Try2。
 数字だけのとき、別に用意した整数配列 inputにいれて、その合計をとるようにした。
  しかし、この方法ではプログラムが複雑になるので、最終TRYやTRY1では、文字なら0
 とするようにした。

6 さらにその前は、ある引数全体がNaNであるかどうかで判定しようとして失敗した。
 引数に文字列も含む場合の足し算(txtファイル) 補足参照。

3 オーバーライドと隠蔽

下記は「Javaチュートリアル 第3版」第5章 「クラスと継承」 P212 にある例に、数行を追加したり、確認のための書き換えをトライしてみただけのものである。複数のクラスを扱うのはあまり経験していなかったので、コメントの1、2、3 に書いたような、基本的なことも私には大問題になった。

//Planet.java
public class Planet {
    public static void hide() {
        System.out.println("The hide method in Planet.");
    }
    public void override() {
        System.out.println("The override method in Planet.");
    }
}

//Earth.java
public class Earth extends Planet {
    public static void hide() {
        System.out.println("The hide method in Earth.");
    }
    public void override() {
        System.out.println("The override method in Earth.");
    }

    public static void main(String[] args) {
        Earth myEarth = new Earth();
        Planet myPlanet = (Planet)myEarth;
        myPlanet.hide();                   
        myPlanet.override();

        Planet.hide();      //クラスメソッド追加
        Earth.hide();       //クラスメソッド追加                  
        myEarth.hide();      //追加                  
        myEarth.override();  //追加                  
    }
}

 [実行結果]
   The hide method in Planet.
   The override method in Earth.
  追加
   The hide method in Planet.
   The hide method in Earth.
   The hide method in Earth.
   The override method in Earth.

[コメント]
1  このように、複数のファイル(クラス)がある場合、個々にコンパイルするものと
  錯覚していたが、mainのある方をコンパイルするだけでよい。extendsの有無にかか
  わらず。

2  必要だったり、いらなかったり、規則性ははっきりしないが、「Javaの基礎」でも
 ふれたクラスパス
    	C:\xxx> set CLASSPATH=.	← カレントディレクトリにパスを通す
   が、必要になるときがある。この場合は、やらないと、
    C:\HPTak\Program\JavaBasic2\Earth>java Earth.java
    Exception in thread "main" java.lang.NoClassDefFoundError: Earth/java
   となったが、Planetのシンボルが解決できないとのエラーになることもある。

3  最初は、2に気づかず、2つをpackageにするとか、不必要なトライもした。

4  myPlanet.hide() は、hide()にstaticがあって、クラスメソッドだが、なぜか、
    The hide method in Planet.が出る。
 追加のPlanet.hide()から出るのはわかるが。 
   (追加のmyEarth.hide() から、The hide method in Earth.が出るのも同じ)。

5  クラスメソッドは隠蔽、インスタンスメソッドはオーバーライド(書き換え)できる
  ということであるが、
     Planet myPlanet = (Planet)myEarth; というオブジェクトの型変換は難解である。
     (「Javaの基礎3」 の4章でも使っているが。)
  しかし、Planet myPlanet = myEarth; としても同じ結果がでる。
  myPlanet.override(); から、   The override method in Earth. が出る。
   だから、オーバーライドというわけ?

7 5,6章をやったあとの追記、
    Planet myEarth = new Earth()と書くこともできるはず(6章のコメント3参照)。
    そして、Planet myPlanet = myEarth; とすると、
    myEarth.hide()は、The hide method in Planet.となる(型変換しても同じ)。
  上位クラスから見に行くからだろうか?  
   
8 結論として、5に書いた型変換とクラスメソッドがインスタンスメソッドのように扱
 える理由は目下不明。

4 println文が使えるのはmainのみ?

「Javaチュートリアル 第3版」第5章 「クラスと継承」 P214 にある例。こんどはメンバ変数の隠蔽とsuperを使ってのアクセスということだが、本のプログラムには、mainがないため、コンパイルもできないので追加。。それがうまくいくまでの過程、試行錯誤を下記に記す。

最終的には、インスタンス・メソッド を活用するだけのこと、解決してみると、いたって当然。何を苦労しているの?ということだろうが、まだまだ、オブジェクトの概念が身についていないことを知る。あやうく、タイトルのようなとんでもない錯覚に陥ったままになるところだった(コメント3,4,5参照)。

[2010.9.24 追記]
 Subclass.java というファイル名で保存し、publicをSuperlassにもつけていたが、下記のコンパイルエラーになった。
 Superlass.java:10: クラス Superclass は public であり、ファイル Superclass.javaで宣言しなければなりません。
 Superclassのpublicをとることで解決した。

//Superclass
//public class Superclass {   ファイル Superclass.javaで宣言せよとのエラー

 class Superclass {
    public boolean aVariable;

    public void aMethod() {
        aVariable = true;
    }
}

//Subclass
public class Subclass extends Superclass {
    public boolean aVariable;     //hides aVariable in Superclass
    public void aMethod() {        
        aVariable = false;
        super.aMethod();
        System.out.println(aVariable);
        System.out.println(super.aVariable);
    }
 //追加
    public static void main(String[] args) {
       Subclass   sub=new Subclass();
       sub.aMethod();
    }
}

 [実行結果]
   false
   true

[コメント]
1  Originalでは、mainがないとのエラー。
 下記のごとく、さまざまトライしたが、結局、Subclassにmainをおき、Subclassのインスタンス、subを作って、sub.aMethod()  として解決。

2 考えてみれば、SubclassのaMethod() のSystem.out.printlnをそのまま利用する だけ
 のことで、オブジェクト、クラス、インスタンスの概念が身についていれば、なんと
いうこともなかったはず。

3 Try1、最初の錯覚は、System.out.printlnはメインにないといけないかと勘違いして
 aMethod()の中味をそっくり移した。
  //Try1
public class Subclass extends Superclass {
     public boolean aVariable;  

    public static void main(String[] args) {
        aVariable = false;
        super.aMethod();
        System.out.println(aVariable);
        System.out.println(super.aVariable);
    }
}
 コンパイルすると、mainの4行から
   「static でない 変数 aVariable を static コンテキストから参照することは
     できない」などとなる。
    「static でない 変数 super」も同様。
  mainからstaticをとるとエラーになる、あちこちにstaticをいれるという無駄な努力
 もする。

4 Try2、aMethod()から、System.out.printlnのみをmainに移し、インスタンス化する。
 false,falseとなる。false,trueのはずだが。
//Try2 
public class Subclass extends Superclass {
     public boolean aVariable;
     public void aMethod() {
        aVariable = false;
    }
    public static void main(String[] args) {
        Subclass   sub=new Subclass();
        System.out.println(sub.aVariable);
        Superclass flag1=new Superclass();
        System.out.println(flag1.aVariable);
    }
}
 System.out.println(super.aMethod().aVariable); もだめ。

5 Try3、mainからはTryを打ち出すだけのSystem.out.println文をいれる。
  当然のことながら、Tryしかでない。
//Try3 
public class Subclass extends Superclass {
    public boolean aVariable;
    public static void main(String[] args) {
        System.out.println("Try");
    }
    public void aMethod() {
        aVariable = false;
        super.aMethod();
        System.out.println(aVariable);
        System.out.println(super.aVariable);
    }
}

5 スタックとオーバーライド

1 Vector、importでひっかかる

「Javaチュートリアル 第3版」第5章 「クラスと継承」 P182 にある例。「クラスを作る」という節の例で、スタックのプログラム。last-in-first-out (LIFO)というスタックが、再帰による繰り返しを実現する手段と聞いていたので、興味があった。本では、もっぱらクラスそのものの説明に終始しているのが少々残念であった。

import java.util.Vector;
import java.util.EmptyStackException;

public class Stack {
    private Vector items;
    public Stack() {
	items = new Vector(10);
    }
    public Object push(Object item) {
	items.addElement(item);
	return item;
    }
    public synchronized Object pop() {
	int len = items.size();
	Object obj = null;
	if (len == 0)
	    throw new EmptyStackException();
	obj = items.elementAt(len - 1);
	items.removeElementAt(len - 1);
	return obj;
    }
    public boolean isEmpty() {
	if (items.size() == 0)
	   return true;
	else
	   return false;
    }
}

 この例にも、mainがないため、下記のStackTry.javaを追加した。
//StackTry.java 追加 (2004-09-01)
import java.util.*;
public class StackTry {
   public static void main(String[] args) {
	Stack data =new Stack();
	Vector items=new Vector(10);
	items.addElement(new Integer(1));
        items.addElement(new Integer(2));
        items.addElement(new Integer(3));
        items.addElement(new Integer(4));
        items.addElement(new Integer(5));

	Vector items2=new Vector(10);
        items2.addElement(new String("abc"));
        items2.addElement(new String("d"));
        items2.addElement(new String("xy"));

        System.out.println(data.push(items));
        System.out.println(data.push(items2));

        Integer item=new Integer(10);
        System.out.println(data.push(item));

        System.out.println("1番目" + data.pop());
        System.out.println("2番目" + data.pop());
        System.out.println("3番目" + data.pop());
    }
}

 [実行結果]
    [1, 2, 3, 4, 5]  //pushした最初のVector(整数)
    [abc, d, xy]     //次にpushしたVector(文字列)
    10               //さらに、整数 10 をpush
    1番目10               //pop 
    2番目[abc, d, xy]     //pop
    3番目[1, 2, 3, 4, 5]  //pop

[コメント]
1 最初、このmainをStack.javaの中に含めて実行したときは問題なかったが、
 StackTry.javaとして、独立させると、
    Vector items=new Vector(10); の行に、
  「クラス Vectorのシンボルを解決できない」とのエラーメッセージが出て弱った。
  import java.util.Vector; などをいれていなかったためとわかるまで、一苦労。
    Vectorは、importなしで使える java.langパッケージにはない!!
   昨年、作った自分のHPの5章は、「Vector・Stack・配列」  で、そのプログラムには、
 import java.util.* をしっかりいれていたのに。

2 文字列のVectorを作ったが、最初、
   items2.addElement(new String('a')); として、
    「コンストラクタ String (char)のシンボルを解決できない」
   と、やられたときはまいった。"a" として解決したが、ダブルクォーテーションも
  シングルも同じ働きをする言語も多いと思うが、違うのかな?
   まだ不慣れ。1といい、2といい、ミスのたねは尽きないものである。

 [2010.9.28 追記]
 ここに、Stack,Vectorについてのトライ、詳細な記述があるのを忘れて、6年ぶりにトライした
  上記 1 の「StackTry.javaとして、独立させると....」が気になったので、これも再試行した。
 StackTry.javaとStack.javaを別ファイルにするということだったらしい。
そのときは、import java.util.* がどちらのファイルにも必要ということである。 以上

2 Stack.javaのオーバライド

1 と同じ「Javaチュートリアル 第3版」第5章 「クラスと継承」 P182 のスタックのプログラムをオーバーライドの演習に使ってみた。pushの出力が、pushした値であることが不満で、これをpushした結果を返すように変更してみた。

//Stackをオーバーライドしたもの。
public class StackOverride extends Stack {
   public Object push(Object item) {
	items.addElement(item);	
        return items;       //override
    }
}

//StackTry.java 1とほぼ同じ(変更点のみ)
import java.util.*;
public class StackTry {
   public static void main(String[] args) {
	Stack data=new StackOverride(); //変更
	......以下、同じ......
        Vector v=data.items;           //push結果
        System.out.println(v.size());  //その大きさ
	......以下、同じ......
    }
}

ソースリストのありか
    Stack   Stackオーバーライド    オーバーライドトライ

 Stackのプログラムは、「Javaチュートリアル」のP182 そのものだが、1行目
  private Vector items; のままでは、「items は Stack で private アクセス」と
 なって、アクセスできないし、コンストラクタごと、オーバーライドしてもだめだっ
 たので、publicに変更した。

 [実行結果]
    [[1, 2, 3, 4, 5]]                    //push
    [[1, 2, 3, 4, 5], [abc, d, xy]]      //push (確かにスタックそのものの出力)
    [[1, 2, 3, 4, 5], [abc, d, xy], 10]  //push
    3                                    //スタックのサイズ 
    1番目10               //pop 
    2番目[abc, d, xy]     //pop
    3番目[1, 2, 3, 4, 5]  //pop

[コメント]
 エラー、試行錯誤の連続。あきらめる寸前だった。pushできるまで、そしてpopできる
までに分けて書いておこう。
A pushできるまで。
1 StackTryの最初のプログラムの宣言は	
     StackOverride data =new StackOverride();
  であった。
   Exception in thread "main" java.lang.NullPointerException
        at StackOverride.push(StackOverride.java:8)
        at StackTry.main(StackTry.java:26)
  というコンバイルエラーで先に進まない。

2 StackOverrideに、Stackをまねて作ったコンストラクターをいれてpushまでは解決。
 しかし、popはだめ。スタックは空だという。
  Exception in thread "main" java.util.EmptyStackException
        at Stack.pop(Stack.java:32)
        at StackTry.main(StackTry.java:30)

B popもできるまで。
3  StackOverride() に、superキーワードを使って、Stacのすべてのメソットをいれ
 て、下記のようにしてみたが、変化なし。
   public StackOverride() {
       public items = new Vector(10);
       public Stack() {
	items = new Vector(10);
      }
       public Object push(Object item) {
	items.addElement(item);	
        return items;       //override
      }
      public synchronized Object pop() {
    	return super.pop();
    }
      public boolean isEmpty() {
	return super.isEmpty();
    }
}
4 前に読んでいた「独習Java」の第6章「継承」のP166の簡単な例がヒントになって、
 前出したように、
   dataをStackの変数として宣言しておいて、
   StackOverrideをインスタンス化してdataにオブジェクト参照を代入。
       Stack data =new StackOverride(); 
         (このように書ける理由は6のコメント3に。)

5 これであっさり解決。3に書いたややこしいものはすべて削除、オーバーライドする
 ものだけの記述ですむようになった。
   ただし、その直前には、StackTry、popの前に、
  data =new Stack();といれると、スタックは空ということになる(定義済みとやられ
 そうだったのだが?)。それも削除して解決。

6 実は後日談があり、6章をやってから、再び、1をトライするとできてしまった。
 詳細は、6章のコメント4参照。

7 push終了後のスタックのサイズを見るため、また一苦労させられた。結果はStackTry
 のプログラム追加にあるように、Stackのメンバ変数であるitems を参照するだけでよ
 かったが、それに気づくのが遅く、下記のような回り道をしてしまった。
   a  System.out.println(items.size());   NO (itemsは直接呼べない)
   b   int len = (data.push(items2)).size(); NO (理由はcからわかる)
   c   Object s=data.push(item1); OKだが、Object型ではsize()がきかず意味ない。

[クラスライブラリとの関連]
   クラスライブラリにはStackクラスがある。それとの関連が気になったので、フォル
 ダから、Stackを落としてやってみた。
	Stack data =new Stack(); はもちろんOK。(7はだめだが)。
 
  しかし、かんじんのオーバーライド 
     Stack data =new StackOverride() も
   StackOverride data=new StackOverride() も1と同じエラーとなり、こんどは解決
 していない。
     Exception in thread "main" java.lang.NullPointerException
        at StackOverride.push(StackOverride.java:12)
        at StackTry.main(StackTry.java:29);

 なお、ライブラリのStackクラスはVectorクラスを継承しているから
 import java.util.* で十分だろうが、念のため、import java.util.Vector.*を
 いれても変わらない。

 [2010.9.28 追記]
 あらためて、トライしているうち、
          System.out.println("0番目 data = " + data); 
 とすると、 0番目 data = Stack@ca0b6 となり、「StackはVectorと違って、一括のリストとしては出せない。」
 とコメントしていた。
  それが、pushの出力をOverrideで変更することでリスト出力ができることまで、トライしていたのに驚いた。

 それを知らず、Vectorの中身を一括ではなく、1ケ1ケ Stackにいれようと、data.push(items.get(i)) をトライしてみた。
        int n=items.size();
        for (int i=0; i < n; ++i){
           System.out.println(items.get(i));
           data.push(items.get(i)); 
        }

 また、独習 P291 には、Enumeration というのがあったが、エラーになった。
        Enumeration d=items.elements(); 
        while (!d.isEmpty()) {
           Object obj1=d.nextElements();
           System.out.println(obj1);
        }

  上記、Overrideも追試したが、StackOverride を独立のファイルにしないと、エラーになる。
 また、size()は、Vectorクラスのメソッドであるが、Stack にextends Vector とすると、
            System.out.println(data.size());として使えるかと思ったが、結果は0。なせ?
  Stack にextends Vectorがないと、下記のエラーとなった。
        StackTry.java:36: シンボルを見つけられません。
          シンボル: メソッド size()
          場所    : StackOverride の クラス
        System.out.println("data.size() = " + data.size());
  StackOverride の クラスというのが疑問。

6 継承問題の確認

前述の5-2のコメントの4の意味が気になってたので、「独習Java」6章の継承に関する小さな例題で確かめてみた。 P175 練習6.3に、継承、オーバーライドを確認するには、ちょうどいいので、とりあげる。

class A3 {
    void hello() {
        System.out.println("Hello from A3");
    }
    void hello(int i) {
        System.out.println("Hello from A3" + i);
    }
}

class B3 extends A3{
    void hello() {
        System.out.println("Hello from B3");
    }
}

class C3 extends B3{
    void hello(String s) {
        System.out.println("Hello from C3" + s);
    }
}

class OverrideTest {
   public static void main(String[] args) {
	A3 obj=new C3();
	obj.hello();
   }
}

 [実行結果]
  Hello from B3

[コメント]
1 この問題は、引数なしのコンストラクタにぶつかるまで、上位クラスにいくようだ。

2  それを確かめるため、B3を下記のように、引数をもつものに変更すると、
    class B3 extends A3{
       void hello(float x) {
          System.out.println("Hello from B3" + x);
       }
    }
  実行結果は 予想どおり、Hello from A3となった。

3  「独習Java」6章の継承に関する他の例題では、
      A3 obj=new C3() に相当するところが、C3 obj=new C3() になっているケースも
  あり、試みに、後者でトライしてみた。結果は変わらない。
    前者について、「独習Java」P174 には「クラスA3の変数を使って、クラスC3のオ
 ブジェクトを参照できるのはC3がA3のサブクラスだからである」とある。
   後者はいたって当然だが、結果が同じになるのは、C3に該当するものがなければ、
 上位を探しにいくということか?

4 そうなってくると、5-2のコメントの1 はなぜだったのかということになる。
  解決したという5-2のコメント4、再び、
      StackOverride data =new StackOverride(); 
  に戻して、トライしなおした。1に書いたNullPointerExceptionのエラーも起こら
 ず、すんなり解決してしまった。狐につままれたような感じ、
   前に、一度ならず、NullPointerExceptionとなったのは別の要因だったのだろうか?

5 話は変わるが、もとに戻ってこのような小さなクラスの集合で、逐一、javaファイル
 を作るのはたまらないと思っていたら、一つのファイルですんだ。
   ではと、Stack,StackOverride,StackTry を一つのファイルにまとめてみたが、
 「クラス Stack は public であり、ファイル Stack.java で宣言しないといけない」
  ということになった。

 [2010.9.28 追記]
 なお、StackとStackTryで、package化もトライしていたが、StackOverride も含めて、3つのファイルを
 ひとつのフォルダにいれて、mainのあるファイルだけをコンパイルすればいいことになり、この場合は、
必ずしもpackage化は必要なさそうだ。
 3つのファイルを一つのファイルにまとめることも可能である。mainのあるclassのみにpublicをつければいい。
 上記のコメントはなにかおかしい。

7 デコンパイラ

話は一転、表題について、面白い情報があったので、書いておこう。
 ネットには、Javaのクラスで動くアプレットのページは多々あるが、ソースがあるのはほとんどなく、単に動くだけでは、私には面白くないと思っていたところへ、偶然にも、Javaのデコンパイラの存在を知った(他にもあるようだが)。
 Jad - the fast JAva Decompiler

jad.exe に対し、Readme.txtも読んで、jad -sjava example1.class で首尾よく、example1.java と、デコンパイルできた。

終わりに
「Javaの基礎」では、再帰とかリスト処理とか、かたよった例題を扱いながら、慣れないと難解なオブジェクトを理解しようとした。

今回の「Javaの基礎2」は、継承に関する例題がを中心。複数のクラスのコンパイルのしかたとか、一歩前進したか? コンパイルエラーの大半は、やはり型に関するもの、import、クラスメソッドやインスタンスメソッドの呼び出し方とか、やはり、基本的なものが多かった。あきらめかけるほど難航したものもあったが、試行錯誤の連続のおかげで、なんとかなった感じである。

継承に関しては、結局、オブジェクトの概念がほんとうにはわかっていないために苦労したが、理解はかなり進んだように思う。

ページ独自カウント