Java SE 7 Silver対策勉強をしながらメモ 2015/2/4
2015/03/29
本日は継承をどっぷりと。
一気に詰め込んで正解だったかも。
いつものごとくマークダウンで記載したのでそのままJetpack Markdownにお任せでアップします。
継承元に引数なしのコンストラクタがなくてもsuper()の生成を抑制すればよい
[java]
class SuperClass{
private int k;
SuperClass(int i){
k = i;
//code
}
// ここにSuperClass(){}を追加する必要あり
}
public class SubClass extends SuperClass{
public static void main(String[] args){
new SubClass();
new SubClass(3);
}
SubClass(int i){
super(i);
}
SubClass(){
//ここにthis(5);を追加してもOK
//code
}
}
[/java]
- this(5)を追加する事でsuper(i)でSuperClassがインスタンス化出来るのでコンパイルによるsuper()の生成が抑制出来る
インターフェースも継承だから実装時にはゆるいアクセス修飾子でないとならないってことはpublicのみ
- インターフェースでメソッドは修飾子を省略しても暗黙的に public abstractメソッドになる。
- メソッドにpublic abstract以外のfinal static private protectedは指定出来ない
- 変数はpublic static finalになる
[java]
interface A{public int m1();} //暗黙的にpublic abstract int m1();
interface B{void m2();} //暗黙的にpublic abstract int m2();
//実装例1 具象クラスだから実装が必要
class Test implements A,B{
public int m1(){return 0;}
public void m2(){}
}
//実装例2 抽象クラスだから実装しなくても良い
abstract class Test implements A,B{
public int m1(){return 0;}
}
[/java]
クラスのキャスト
[java]
interface Facilities{}
abstract class Room{}
class ClassRoom extends Room implements Facilities{}
class LectureHall extends ClassRoom{}
class Auditorium extends ClassRoom{}
LectureHall lh = new LectureHall();
Auditorium a1;
Facilities f1;
f1 = lh; //LectureHallはFacilitiesの型を持っているので問題ない
//a1 = f1; //AuditoriumはFacilitiesの上位でないのでコンパイルエラー
a1 = (Auditorium)f1; //明示的な型変換によりコンパイル成功
[/java]
- f1変数はLectureHall型のオブジェクトを参照しているので実行時にClassCastException例外が発生
ポリモフィズムを実現するには引数の型をインターフェースかスーパークラスにする
[java]
interface A{public void print();}
class SuperClass implements A{
public void print(){//code}
}
class SubClass extends SuperClass{
//ポリモフィズム実現の例
public void methodA(A a){a.print();}
public void methodB(SuperClass s){s.print();}
}
[/java]
ポリモフィズムはstaticメソッドには適用されず、変数宣言時のクラス側のメソッドが呼び出される
[java]
class Animal{
public static void saySomething(){
System.out.print(” Gurr!”);
}
}
public class Cow extends Animal{
public static void saySomething(){
System.out.print(” Moo!”);
}
public static void main(String[] args){
Animal[] animals = {new Animal(),new Cow()};
for(Animal a:animals){ //ここで宣言している変数側のメソッドが呼び出される
a.saySomething();
}
new Cow().saySomething();
}
}
[/java]
– 出力は「Gurr! Gurr! Moo!」
ポリモフィズムが非staticメソッドで適用される例
[java]
class Animal{
void saySomething(){ //修飾子なし
System.out.print(” Gurr!”);
}
}
public class Cow extends Animal{
protected void saySomething(){ //修飾子なしより緩いprotected
System.out.print(” Moo!”);
}
public static void main(String[] args){
Animal[] animals = {new Animal(),new Cow()};
for(Animal a:animals){
a.saySomething();
}
new Cow().saySomething();
}
}
[/java]
– 出力は「Gurr! Moo! Moo!」
System.arraycopy()
- System.arraycopy(①,②,③,④,⑤);
①コピー元配列名
②コピー元開始添え字
③コピー先配列名
④コピー先開始添え字
⑤コピーする要素数 - コピー先の要素は置き換えられる
[java]
int[] ary = {1,2,3,4,5};
System.arraycopy(ary,1,ary,2,2); //2,3が3,4の位置にコピーされる
for (int i=0;i<ary.length;i++){
System.out.print(ary[i]);
}
// 12235 が出力される
[/java]
java.lang.Longはpublic final class Long というかラッパークラスはだいたいfinal
[java]
class AClass extends java.lang.Object{}//extendsがないとき暗黙的に継承されてるのん
class BClass extends java.lang.ClassLoader{}//abstractなのでOK
//class CClass extends java.lang.Long{} //finalクラスを継承しようとしてコンパイルエラー
[/java]
getClass()の戻り値は参照しているオブジェクトのクラス名(宣言ではない!)
[java]
public class Employee{
public static void main(String[] args){
Manager mgr = new Manager();
Employee emp = new Employee();
emp = mgr;
System.out.print(emp.getClass());
System.out.print(mgr.getClass());
}
}
class Manager extends Employee{
}
[/java]
- empもManagerクラスを参照しているので、出力は「class Managerclass Manager」となる
先にキャストしてメソッドを実行する
[java]
public class Speak{
public static void main(String[] args){
Speak sp = new Tell();
Tell te = new Tell();
((Truth)sp).tell();
((Truth)te).tell();
te.tell();
//(Truth)sp.tell(); //Aコンパイルエラー
//(Truth)te.tell(); //Bコンパイルエラー
}
}
class Tell extends Speak implements Truth{
public void tell(){
System.out.println(“Right on!”);
}
}
interface Truth{
public void tell();
}
[/java]
- Aは戻り値をTruth型にキャストしようとしているがSpeakクラスにはtell()メソッドがないのでコンパイルエラー
- Bはそもそもtell()メソッドの戻り値はvoid型なのでTruth型にはキャストできないのでコンパイルエラー
参照変数のキャストは実行時に行われる!(コンパイル時にはエラーは検知できない!)
[java]
class Parent{}
class Child extends Parent{}
class Main{
public static void main(String[] args){
Parent parent = (Parent)(new Child());
Child child = (Child)(new Child());
Child child2 = (Child)(new Parent()); //エラーだが文法はあってるのでコンパイルはとおる
}
}
[/java]
staticメソッドはsuper.メソッドでは呼び出せない
[java]
class Parent{
protected static int add(int a,int b){
return a + b;
}
}
class Child extends Parent{
public static int add(int a,int b){
// int c = super.add(a,b); //コンパイルエラー
int c = Parent.add(a,b);
return c;
}
}
[/java]
コンストラクタ内で自クラスの引数なしコンストラクタを呼び出すときはthis();を使う!!
[java]
public class Message{
String title;
int value;
public Message(){
title = “Hello “;
}
public Message(int value){
Message(); //コンパイルエラー
this.value = value;
title += ” World”;
}
}
[/java]
抽象クラスは具象クラスを継承する事が出来る!!!
インターフェースのimplementsは「実装」(「継承」ではない)!!!
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
ヤマムギvol.11「AWSではじめるLinux入門ガイド」クイックスタート勉強会を開催しました
2020/7/15に、ヤマムギvol.11としまして、「AWSではじめるLinu …
-
Developers Summit 2024「徹底解剖!?JALインフォテック様が取り組む予兆検知/早期復旧を可能にするデータ分析/活用戦略とは?」を見ました
株式会社JALインフォテック サービス事業本部 IT基盤事業部 共通サービス基盤 …
-
Alexa Day2018で「Alexa連携デバイスクラウドを構成するAWS ソリューション」を聞きました
以下は、思ったことや気になったことをメモしていますので、必ずしも登壇者の発表内容 …
-
「コミュニティリーダーズサミット in 高知 2023初鰹編」に参加しました
始まりました! 今回のテーマは「旗を立てる ~Raise Your Flag~」 …
-
「IBM Cloud Community Summit 2018 フルマネージドデータベースというのは使えるのか?IBM Cloudでのデータ活用事例いろいろ」でIBm Cloudのデータベースサービスを聞かせていただいた
IBM Cloud Community Summit 2018におじゃましました …
-
Salesforce WorldTour Tokyo 2018で、つながる世界の熱気を感じた
去年はたしか芝公園の方だったかと思いますが、今年はビッグサイトです。 数千人レベ …
-
Developers Summit 2024「Kubernetesは怖くない!開発者のためのインフラトラブルシューティング入門」を見ました
高橋 あおいさん つくって、壊して、直して学ぶ Kubernetes入門という本 …
-
「IoT縛りの勉強会/SIer主催版 SIerIoTLT vol4」に行ってきました
「IoT縛りの勉強会/SIer主催版 SIerIoTLT vol4」に行ってきま …
-
「関ジャバ Java開発のためのDocker & てらださんせきらら in MS関西」に行ってきました
「関ジャバ Java開発のためのDocker & てらださんせきらら i …
-
「LINE Bot x AWS CDKハンズオン」に参加しました
CDK久しぶりに触る気がします。 今作ろうと思っている環境がCloudForma …