JAVA入門

JAVA入門⑧
クラス継承
簡単JAVA説明⑰
1.クラスの継承
①スーパークラスとサブクラス
クラスの拡張
クラスは「拡張」することが可能です。
すでに存在するクラスをもとに、
・新しいメソッド・フィールドの追加
・メソッドの上書き
・新しいクラスの宣言
を可能とします。
クラスを拡張してできた新しいクラスを元のクラスの
「サブクラス」 逆に、もとのクラスを拡張してできた
クラスの「スーパークラス」といいます。
簡単JAVA説明⑰
拡張する側(をクラス)と見ると
拡張された側はサブクラス
クラス
サブクラス
拡張
ス-パー
クラス
クラス
拡張された側(をクラス)と見ると
拡張される側はスーパークラス
簡単JAVA説明⑰
注意点
・スーパークラスは1つ
クラス拡張の際、スーパークラスは、最大1つ(親は一人!)
逆に、
・サブクラスは複数作成可能です。
簡単JAVA説明⑰
2.サブクラスの構文
class クラス名{
}
}
class サブクラス名 extends クラス名(=スーパークラス名){
}
}
簡単JAVA説明⑰
// 例 Testクラスのクラス
classTest{
int no;
double score;
void show(){
System.out.println("Noは" + no);
System.out.println("点数は" + score);
}
}
class KimatuTest extends Test{
}
簡単JAVA説明⑰
3.継承
「サブクラスはスーパークラスのフィールド、メソッドを受け継ぐ」
このことを継承と言います。
1.フィールドの継承
クラス Testは no と scoreをフィールドとしてもっていまし
たが、継承により、 KimatuTest もno と scoreをフィールドと
して持つことになります。
KimatuTestの中に、 noとscoreが宣言されていなくても、
スーパークラスのフィールドが使えます。
簡単JAVA説明⑰
例
class Sample1{
public static void main(String args[]){
KimatuTest kt = new KimatuTest();
kt.no = 11;
kt.score = 75;
kt.show();
}
}
簡単JAVA説明⑰
実行結果
Noは11
点数は75.0
簡単JAVA説明⑰
4.メソッドの継承とコンストラクタ
実は、前sample1でもう示しましたが、メソッドvoid show()がすで
に継承されておりました。 サブクラス KimatuTestでは、 void
show()は宣言されていませんが、kt.show();で用いられていまし
た。
フィールドとメソッドが継承されることは今述べたとおりですが、
コンストラクタは継承されません。
簡単JAVA説明⑰
class Test{
int no;
double score;
Test(){
no = 0;
score = 0.0;
}
Test( int no, double score){
this.no = no;
this. score = score;
}
簡単JAVA説明⑰
void show(){
System.out.println("Noは" + no);
System.out.println("点数は" + score);
}
}
class KimatuTest extends Test{
}
簡単JAVA説明⑰
class Sample2{
コンストラクタ
継承
public static void main(String args[]){
KimatuTest kt = new KimatuTest(1,23);
kt.show();
kt.no = 11;
kt.score = 75;
コンパイルエラー
kt.show();
}
}
簡単JAVA説明⑰
この場合、下記のようにコンパイルエラーになります。
Sample2.java:27: シンボルを見つけられません。
シンボル: 変数 kt
場所 : Sample2 の クラス
kt.show();
^
Sample2.java:28: シンボルを見つけられません。
シンボル: 変数 kt
場所 : Sample2 の クラス
kt.no = 11;
・・・・
エラー 4 個
簡単JAVA説明⑰
5.コンストラクタの自動的な呼び出し
以下の例を見てください。
class Test{
int no;
double score;
Test(){
no = 0;
score = 0.0;
}
Test( int no, double score){
this.no = no;
this. score = score;
}
簡単JAVA説明⑰
class KimatuTest extends Test{
String name;
KimatuTest(){
name = "No Name";
}
KimatuTest( String name){
this.name = name;
}
}
このサブクラスKimatuTestはフイールドnameを“No Name”で初
期化しています。このときの初期化はnameだけでしょうか?
簡単JAVA説明⑰
実は、コンストラクタの初めてでは自動的に、スー
パークラスの引数なしのコンストラクタが自動的
に呼び出されると決まっています。
class KimatuTest extends Test{
String name;
KimatuTest(){
***
name = "No Name";
}
KimatuTest( String name){
***
this.name = name;
}
}
簡単JAVA説明⑰
***の部分に
Test(){
no = 0;
score = 0.0;
}
が入っているのと同じことになっています。
簡単JAVA説明⑰
6.スーパークラスのコンストラクタの明示的な呼び出し
コンストラクタの中から、スーパークラスの引数付きコンストラク
タを呼び出したいときもあります。スーパークラスのコンストラク
タを呼びだす表記法としてsuper()があります。引数付きコンスト
ラクタを呼びだす場合には、super(3、40 ); と書きます。
 Sample3 参照してください。
class Test{
int no;
double score;
Test(){
no = 0;
score = 0.0;
}
Test( int no, double score){
this.no = no;
this. score = score;
}
void show(){
System.out.println("Noは" + no);
System.out.println("点数は" + score);
}
}
class KimatuTest extends Test{
String name;
KimatuTest(){
name = "No Name";
}
KimatuTest(String name){
super(11, 75);
this.name = name;
}
void showk(){
System.out.println("名前は" + name);
}
}
class Sample3{
public static void main(String args[]){
KimatuTest kt = new KimatuTest();
kt.show();
kt.showk();
KimatuTest ktt = new KimatuTest("渡辺");
//
//
ktt.no = 11;
ktt.score = 75;
ktt.show();
ktt.showk();
}
}
簡単JAVA説明⑰
実行結果
Noは11
点数は75.0
名前はNo Name
Noは11
点数は75.0
名前は渡辺
注)なお、 super(11, 75);を加えることは、
メイン(Sample3)でコメントアウトしてある
ktt.no = 11;
ktt.score = 75;
を行うことに該当しています。
簡単JAVA説明⑰
7.明示的なコンストラクタの呼び出し②
明示的なコンストラクタの呼び出しとして
this();
もあります。
サブクラス KimatuTestで
name = "No Name";
=>this("No Name“);
とします。これは
自身のコンストラクタ呼び出し
です。
簡単JAVA説明⑰
class KimatuTest extends Test{
String name;
KimatuTest(){
this("No Name“);
}
KimatuTest(String name){
super(11, 75);
this.name = name;
}
void showk(){
System.out.println("名前は" + name);
}
}
簡単JAVA説明⑰
8.継承とIS-A関係
サブクラスがス-パ-クラスの性質を受け継ぐ
ということを、別の言い方をすれば
「サブクラスはス-パ-クラスの一種である」
と言います。この関係のことを「IS-A関係」といいます。
簡単JAVA説明⑰
9.HAS-A関係
String型のフィールドは、 String型のインスタンスでもあります。
インスタンスをフィールドとして持つと、そのインスタンスを自分
のものとして扱うことが可能です。このような関係を
「HAS-A関係」と言います。「合成」とも言います。
簡単JAVA説明⑰
10.オーバーライド
今までのところでは、
クラス=>継承可能+新たなメソッドを追加という処理を見てきま
したが、継承したフィールド、メソッドを変更することも可能です。
この変更をオーバーライドと言います。
例えば、スーパークラスのメソッドをサブクラスでも同じメソッド
を宣言します。
簡単JAVA説明⑰
class Test{
int no;
double score;
Test(){
no = 0;
score = 0.0;
}
Test( int no, double score){
this.no = no;
スーパークラスの
this. score = score;
void show()
}
void show(){
System.out.println("Noは" + no);
System.out.println("点数は" + score);
}
}
簡単JAVA説明⑰
class KimatuTest extends Test{
String name;
KimatuTest(){
this("No Name“);
}
KimatuTest(String name){
super(11, 75);
this.name = name;
サブクラスの
void show()
}
void show(){
System.out.println("名前は" + name);
}
}
簡単JAVA説明⑰
class Sample4{
public static void main(String args[]){
KimatuTest kt = new KimatuTest();
kt.show();
KimatuTest ktt = new KimatuTest("渡辺");
ktt.show();
}
}
簡単JAVA説明⑰
実行結果
名前はNo Name
名前は渡辺
解説)
オーバーライドすると、サブクラスの方のvoid show()が
呼び出されることになります。
簡単JAVA説明⑰
問い メインを書き換えて
次の結果にするには?
Noは1
点数は75.0
名前は渡辺
簡単JAVA説明⑰
答え
class Sample5{
public static void main(String args[]){
Test kt = new Test(1,75);
kt.show();
KimatuTest ktt = new KimatuTest("渡辺");
ktt.show();
}
}
簡単JAVA説明⑰
11.あとがき
継承の後、オーバーロードを習うと混乱するか
と思います。特にSample5(テキストのSample6)
は混乱を引き起こす気がしてます。
※Sample5 (テキストのSample6)の考え方としては
(継承、オーバーロードを無視して)使いたいメソッドの
あるクラスを生成してその(使いたい)メソッドを呼び出
せばいいと考えればよいわけです。