第7回Java勉強会 †
概要 †
スーパークラスとサブクラス †
継承 †
Objectクラス †
オーバーロードとオーバーライド †
superとthis †
詳細 †
継承 †
継承とはクラスを拡張する手段です。
あるクラスを拡張して新たなクラスを作成することを継承といいます。
メソッドやフィールドを追加したり、既にあるメソッドを上書きしたりすることができます。
- 継承するには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
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 c = new Cylinder();
c.r = 5;
c.height = 10;
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 obj = new ExtendObject();
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();
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 = 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勉強会カリキュラムに戻る