第7回Java勉強会

概要

スーパークラスとサブクラス

  • 下-P.44

継承

  • 下-P.50

Objectクラス

  • 下-P.48~49

オーバーロードとオーバーライド

  • 上-P.164
  • 下-P.60, 下-P.61

superとthis

  • 下-P.55
     

詳細

継承

継承とはクラスを拡張する手段です。 あるクラスを拡張して新たなクラスを作成することを継承といいます。
メソッドやフィールドを追加したり、既にあるメソッドを上書きしたりすることができます。

 
  • 継承するにはextendsを使用します。
  • 継承を行うことにより、スーパークラスのメソッドやフィールドといった情報が引き継がれます。
    これにより、サブクラスのソースコードでは記述されていないメソッドやフィールドでも、スーパークラスの機能を引き継ぐという意味で
    スーパークラスのメソッドやフィールドを使用することができます。
  • コンストラクタは引き継がれません。
    public class クラス名 extends 元になるクラス名 {
    }
     

スーパークラスとサブクラス

継承の元になるクラスをスーパークラス、継承したクラスをサブクラスといいます。
スーパークラスのことを「親クラス」、サブクラスのことを「子クラス」と呼ぶこともあります。

 
  • 円に関するクラス(Circle)、そのクラスを拡張した円柱クラス(Cylinder)を作成しクラスの拡張について動作を確認します
    Circleクラスの作成
    ファイル名:Circle.java
    public class Circle {
        
        // 半径
        int r;
        
        // 円周率を定数として定義します
        public static final double PI = 3.14;
        
        double getArea(){
            return (this.r * this.r * Circle.PI);
        }
        
    }
    Circleクラスを拡張したCylinderクラスを作成
    ファイル名:Cylinder.java
    /**
     * Circleクラスを拡張したCylinder(円柱)クラスです
     */
    public class Cylinder extends Circle {
    
        // 高さについて追加のフィールドを定義します
        double height;
    
        /**
         * 体積の計算を行います
         */
        double getVolume() {
            return (this.r * this.r * Circle.PI * this.height);
        }
    
    }
    Circleクラスを継承したCylinderクラスについて動作を確認します
    スーパークラスで定義されていたメソッドやフィールドはサブクラスのソースコードでは記述されていませんが、サブクラスでも使用できることが確認できます。
    ファイル名:UseCylinder?.java
    public class UseCylinder {
    
        public static void main(String[] args) {
            
            // Cylinderをインスタンス化します。
            Cylinder c = new Cylinder();
            
            // Cylinderの半径と高さを設定する
            c.r = 5;
            c.height = 10;
            
            // 継承したCircleクラスのメソッドを使用できることを確認する
            System.out.println("Cylinderの面積=" + c.getArea());
            
            // 拡張したメソッドを確認する
            System.out.println("Cylinderの体積=" + c.getVolume());
    
        }
    
    }

Objectクラス

Objectクラスは他の全てのクラスのスーパークラスです。
extendsを書いていないクラスは継承をしていないように見えますが、実はObjectクラスを継承しています。
なので、extendsを書いていないクラスでもObjectクラスのメソッド(toStringやequals)を使うことができます。

 
  • Objectのextendsを記述していないクラス
    ファイル名:ExtendObject?.java
    /**
     * クラスを継承していない(ように見える)クラス
     */
    public class ExtendObject {
    
    }
    上記で作成したExtendObject?クラスはObjectクラスを継承するとは記述していないが、実際はObjectクラスのtoString()メソッドを使用できるので
    Objectクラスを継承しているということがわかります。
    ファイル名:ObjectTest?.java
    public class ObjectTest {
    
        public static void main(String[] args) {
            
            // ExtendObjectのインスタンスを生成します
            ExtendObject obj = new ExtendObject();
            
            // ExtendsObjectクラスの定義ではextends Objectとは書いていないが
            // ObjectクラスのtoString()メソッドを使用できることが確認できます。
            System.out.println(obj.toString());
    
        }
    
    }
     

オーバーロードとオーバーライド

はじめのうちはオーバーロードとオーバーライドで混乱しやすいので気をつけてください。

 
  • オーバーロード
    同じ名前のメソッドを、引数を変えることで多数定義すること。
  • オーバーライド
    スーパークラスのメソッドを上書きすること。
     
  • オーバーロード(多重定義)
    • オーバーロードの使用例です
      オーバーロードを定義しているクラスを作成します。
      ファイル名:OverLoadSample?.java
      public class OverLoadSample {
          
          void printParameter(){
              System.out.println("printParameter()が呼び出されました");
          }
      
          void printParameter(String str){
              System.out.println("printParameter(String str)が呼び出されました");
              System.out.println("引数 str=" + str);
          }
          
      }
       
      オーバーロードを実装したクラスを生成し動作を確認します。
      ファイル名:OverLoadTest?.java
      public class OverLoadTest {
      
          public static void main(String[] args) {
              
              // オーバーロードの確認用クラスをインスタンス化します
              OverLoadSample ol = new OverLoadSample();
              
              //=============================================
              //以下オーバーロードの使用例
              ol.printParameter();
              ol.printParameter("hogehoge");
      
          }
      
      }
  • オーバーライド(上書き定義)
    スーパークラスのメソッドと同じ名前、引数、戻り値のメソッドをサブクラスで上書き定義することをオーバーライドといいます。
    • スーパークラスとしてOverRideSuper?クラスを作成し、サブクラスでオーバーライドを行うためのOverRideSub?クラスを作成します。
      そして、オーバーライドの実装を確認するためにOverRideTest?クラスのmain()で処理がオーバーライド(上書き)されていことを確認してください。
      ファイル名:OverRideSuper?.java
      class OverRideSuper {
      
          /**
           * オーバーライド用の動作確認メソッドです
           */
          void printClassName(){
              System.out.println("OverRideSampleです");
          }
          
          
      }
       
      ファイル名:OverRideSub?.java
      class OverRideSub extends OverRideSuper{
      
          /** 
           * スーパークラスのメソッドをオーバーライド(上書き)します
           */
          void printClassName() {
              System.out.println("OverRideSubです");
          }
          
      }
       
      ファイル名:OverRideTest?.java
      /**
       * オーバーライドについての確認のクラスです
       *
       */
      class OverRideTest {
      
          public static void main(String[] args) {
              
              // スーパークラスのメソッドの処理を確認します
              OverRideSuper superClass = new OverRideSuper();
              superClass.printClassName();
              
              // サブクラスでオーバーライドしたメソッドの処理を確認します
              OverRideSub subClass = new OverRideSub();
              subClass.printClassName();
              
      
          }
      
      }
       

superとthis

  • this
    • インスタンス自身を示すためにはthisというキーワードを使用します。
    • 明示的に自身のフィールドを指定したり、自身のメソッドを指定したりします。
    • ThisSample?クラスでは明示的に、変数やメソッドを指定しています。
      ファイル名:ThisSample?.java
      class ThisSample {
          
          int i;
      
          ThisSample() {
              this.i = 1;
              this.methodA();
              this.methodB();
      
              // thisは省略できます
              i = 100;
              methodA();
              methodB();
          }
      
          void methodA() {
              System.out.println("This is methodA.");
          }
      
          void methodB() {
              System.out.println("This is methodB.");
          }
       
  • super
    • スーパークラスのフィールドやメソッドにアクセスするときにsuperをつけてアクセスします。
       
    • スーパークラスのフィールドにアクセスしているサンプルです。
      public class Super {
          public int a;
      }
      
      public class Sub extends Super {
      
          public int getSuperClassFieldA() {
              return super.a;
          }
      }
       
    • super()
      前回のデフォルトコンストラクタのときにでてきましたが、super()とはスーパークラスのコンストラクタを呼び出していることを意味します。
      スーパークラスのコンストラクタにアクセスするときはsuper()と書きます。
       
    • スーパークラスのコンストラクタを呼び出すサンプル
      ファイル名:SuperClass?.java
      public class SuperClass {
          
          /**
           * 引数なしのコンストラクタです
           * コンストラクタが呼び出されたことを確認するために標準出力しています
           */
          public SuperClass() {
              System.out.println("コンストラクタ:SuperClass()が呼び出されました");
          }
      
          /**
           * 引数ありのコンストラクタです
           * コンストラクタが呼び出されたことを確認するために標準出力しています
           */
          public SuperClass(int i) {
              System.out.println("コンストラクタ:SuperClass(int i)が呼び出されました");
          }
      }
      サブクラスを作成します。
      ファイル名:SubClass?.java
      public class SubClass extends SuperClass {
      
          /**
           * サブクラスのコンストラクタです
           * スーパークラスのコンストラクタを呼び出しています
           */
          public SubClass() {
              
              // 引数ありのコンストラクタを呼び出しています
              super(1); 
          }    
      }
      SuperSmaple?クラスのmain()にてSubClass?のインスタンスを生成し、そのコンストラクタの中でスーパークラスを呼び出しているので
      実際にスーパークラスのコンストラクタが呼び出されていることを確認します。
      ファイル名:SuperSmaple?.java
      public class SuperSmaple {
      
          public static void main(String[] args) {
              
              // SubClassのインスタンスを生成します
              // SubClassのコンストラクタの中ではスーパークラスのコンストラクタを呼び出しているので
              // そのことが標準出力されます
              SubClass subclass = new SubClass();
      
          }
      
      }
       
    • スーパークラスのメソッドを呼び出す
      サブクラス内でオーバーライドしたメソッドでもスーパークラスの処理を利用した場合は、そのメソッドを使用することができます。
      ファイル名:Triangle.java
      public class Triangle {
      
          // 底辺の長さ
          private int teihen;
          
          // 高さ
          private int takasa;
          
          /**
           * コンストラクタ
           */
          public Triangle(int teihen, int takasa) {
              this.teihen = teihen;
              this.takasa = takasa;
          }
          
          /**
           * 面積を計算します
           */
          public int calc() {
              return (teihen * takasa / 2);
          }
          
      }
      ファイル名:TriangleBox?.java
      public class TriangleBox extends Triangle {
          
          // 体積を求めるための高さ
          private int height;
          
          /**
           * コンストラクタ
           */
          public TriangleBox(int teihen, int takasa, int height) {
              super(teihen, takasa);
              this.height = height;
          }
      
          /**
           * 体積を計算します
           */
          public int calc() {
              
              // スーパークラスの処理を利用できる。
              int area = super.calc();
              
              return (area * height);
          }
          
          /**
           * 面積を計算します
           */
          public int calcArea() {
              
              // スーパークラスで面積の計算をしているので、その処理をそのまま利用します。
              return super.calc();
          }
      }
      ファイル名:TestTriangleMain?.java
      public class TestTriangleMain {
      
          public static void main(String[] args) {
      
              TriangleBox tb = new TriangleBox(10, 20, 30);
              
              System.out.println("tbの計算結果=" + tb.calc());
              
          }
      
      }

練習問題


Java勉強会カリキュラムに戻る


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-12-03 (水) 10:24:14 (643d)