インターフェースと抽象クラスの実装
インターフェースを実装する際には必ず実装元のクラスは
インターフェースで宣言したメソッドは必ず実装する必要があります。
しかし実装元が抽象クラスだった場合には実装しなくても問題ないようです。
下記コードは問題なくコンパイルされます。
interface Inter01 {
public abstract void I01_a();
public abstract void I01_b();
}
interface Inter02 {
public abstract void I02();
}
abstract class A03 implements Inter01, Inter02 {
// 抽象クラスの場合はインターフェースを実装しなくてもよい。
}
class B03 extends A03{
//ただしインターフェースを実装した抽象クラスを継承する場合は実装が必須になります。
public void I01_a() {}
public void I01_b() {}
public void I02() {}
}
//メインメソッドは省略
勉強を進めだすといろいろとこんがらがりますね。
なのでメモメモ汗
コンストラクタの注意点
またまた基本的な事メモ汗
なるので要注意しないといけない。
class SuperA{
SuperA(String str){System.out.println("Aコンストラクタ");}
}
class B extends SuperA{
B(){System.out.println("Bコンストラクタ");}
}
public class ConstTest {
public static void main(String args) {
B b = new B();
}
}
コンストラクタが実行されるんですが、スーパークラスに引数ありの
コンストラクタを定義していた場合には下記のどちらかを明示的に
記載しないとコンパイルエラーになってしまいます。
class SuperA{
SuperA(){}
SuperA(String str){
System.out.println(str);
}
}
class B extends SuperA{
B(){
super("Aコンストラクタ");
System.out.println("Bコンストラクタ"); }
}
public class ConstTest {
public static void main(String args) {
B b = new B();
}
}
要注意です。
とうとうモバイルWiFiを買い替える!!
ここ数年のインターネットは自宅も屋外も統一してモバイルWiFiで
つないでいます。引っ越し時や移動時に楽チンなので。。
とはいえデビューした時に使用したのがソフトバンクさんの
発売当時は「こんなもんかなー」って使っていましたがやっぱり性能が低い!!涙
- 時間帯によって接続スピードが激減する。
- 通信制限を超えたらスピードがさらに激減する。
- 起動が遅い
- ほっとくとフリーズする。
- ボタンを押しても無反応(押してもノーアクションなので押せたのか確認不能)
という事で今人気の?WiMAXへ乗り換える事にしました。
- 2年間は通信量制限なし!
- WiMAXハイパワー対応で接続もよりスムーズ!
- 下り最大110Mbpsで今よりは早くなる!
- 14000円キャッシュバック!
- 薄い!軽い!
- そして・・スマホのパケ放題を段階プランにして節約できる!(スマホをWiFi通信のみでがんばった場合)
- なのに2年間は月額¥3,420で今より¥500円ぐらい安い!ただしソフトバンクのWiFiを解約するために1万円弱かかってきます(TへT)
ちなみにプロバイダはniftyさんです。
キャッシュバックがより多いお得なプロバイダーさんはあったのですが
実際はキャッシュバックの手続きや解約手続きがめんどくさいみたいです。
手元に届いたら感想を書いてみます。わくわく。
スーパークラス型でインスタンスすると。。。
すごく基本的な事ですがよくこんがらがるのでメモメモ。。
下記のようにスーパークラス型でサブクラスをインスタンスすると
オーバラライドしたサブクラス以外(サブクラス独自のメソッド)は使えなくなります。
abstract class Super_ab {
protected abstract void AA();
protected abstract void BB();
}
class Sub_ab extends Super_ab {
public void AA() {}
protected void BB() {}
public void CC() {}
}
public class Test20 {
public static void main(String[] args) {
Super_ab s = new Sub_ab(); //スーパークラス型でインスタンス
s.AA();
s.BB();
//s.CC(); サブクラス独自のメソッドを使用できない。
((Sub_ab)s).CC(); //しかし!サブクラスでキャストすると呼び出せます。
}
}
サブクラスを沢山実装したい場合にスーパークラス型で宣言しておけば
統一した型で宣言できる事にあるようです。。
うーん。やっぱこんがらがりそう。
参照渡しの勘違い(java)
ただいまJavaについて勉強中ですが下記の実行結果の理由がどうしても
分からず立ち止まってしまっていました。
結果的に僕が参照渡しの考え方を間違えていたんですね。。分かりづらいぜ。。
public class Test {
public static void main(String args) {
Test ojb1 = new Test();
Test ojb2 = new Test();
System.out.print(ojb1 == ojb2)
ojb2 = operate(ojb1, ojb2);
System.out.println(" " + (ojb1 == ojb2));
}
static Test operate(Test ojb1, Test ojb2) {
Test ojb3 = ojb1;
ojb1 = ojb2;
return ojb3;
}
}
正結果:false true
誤結果:false false
ずっと誤結果になるはずと思い込んで1時間は立ち止まってしまいました。。
「operate」クラスに参照渡しをすると「main」クラスに戻っても反映された
ままになる。
訳ではなく、あくまでも「operate」クラスで
新たなメモリ領域に作った変数「ojb1」,「ojb2」にアドレスを格納してるだけ
なんですね。汗
なのでreturnしたデータ以外はmainクラスではなにも影響はないんですね。
こちらのサイトに非常に分かりやすい説明がありますのでリンクさせていただきます。
http://www.tec-q.com/note/2007/04/_java_13.html
のちに気づいたのですが、こちらの方の説明はString型での説明でしたので
正しい結果ですが僕の気になっている部分と少し違っておりました。
もしも基本型配列などの参照型(int、double[]、etc...)の場合、呼び出し先のメソッド内で値を変更するとmainに戻ってきたら値は反映されます。
(※String型は値変更が不可能で別アドレス上に変数を作成しますが基本型配列は
同アドレス上で変更できるため)
進めるほどこんがらがります。汗
デザインとは?
デザインとは何なのか!?
うーん。言っときながらなかなか難しいですね。
でも5年間を経験して理解したことは
「デザインは着飾ることではない!」まーデザインしてる人は承知ですね。
でもデザインって「これでOK!」って思うのは自分なので没頭すればするほど
「これでいいのか俺!?」って迷いだすんですね。。さらに!
もっとデザイン性を高めようと着飾る意識を持ち出してしますと
デザインは足し算となってどんどん伝わらないデザインになっていきます。
デザインのためのデザインってやつです。
(ちなみに5年間のうち3年はその意識をガッツリ持ってました。。)
基本は分かりやすく伝わるもの、そして美しいこと!
その対策はやっぱり「デザイン」の意味となっている「計画」をする事に尽きます。
このデザインは何のために作るんだっけ?みたいな計画を思い出す。
目的のためのデザインをしっかり意識するとブレない可能性が高いです。
僕はそれでもガッツリブレます!
eclipse使えるショートカット(徐々に増える)
現行でよく使うショートカット一覧を記入していく俺。。
え?使ってるショートカット少なすぎやん。。
と思いながらも自分の成長とともに増えていくでしょう汗
- 行削除 command + D
- 単語補完 control + .
- 行コピー comand + option + ⬇️
- フォーマット comand + shift + f
- 一括コメント comand + /