Java SE 7 Silver対策勉強をしながらメモ 2015/2/2
2015/03/29
本日はクラス定義とオブジェクト。
一気に範囲が広がった感。
いつものごとくマークダウンで記載したのでそのままJetpack Markdownにお任せでアップ
static イニシャライザの位置に惑わされない!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Test{ public static void main(string[] args){ Test t = new Test(); } Test(){ //コンストラクタだけどstaticイニシャライザがあるからその後 } static { //staticイニシャライザなのでここが先 } } |
staticメンバの記述位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Cow { final static Cow cow = new Cow(); public static void main(String[] args){ Cow cowOne = cow; Cow cowTwo = cow.dive(cow); Cow cowThree = cow; System.out.println(cowOne == cowTwo); System.out.println(cowOne == cowThree); } Cow dive(Cow c){ c = new Cow(); return c; } } |
宣言時に初期化していないfinal変数はコンストラクタで初期化されればOK
1 2 3 4 5 |
public class Test{ final int a; //初期化されていない Test(int b){a=b}; //コンストラクタで初期化しているのはOK void method(int c){a=c}; //この再代入でコンパイルエラー } |
staticメソッドはインスタンス変数に直接アクセス出来ない!!!
1 2 3 4 5 6 7 8 |
class MyClass{ int i = 5; //インスタンス変数 static int j = 7; //static変数 public static void printSomething(){ //staticメソッド System.out.println("i: " + i); //コンパイルエラー System.out.println("j: " + j); //static変数なので直接アクセス可 } } |
staticメソッドはインスタンスメソッドに直接アクセス出来ない!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Methods{ static void methodOne(){ methodTwo(); Methods.methodTwo(); methodThree(); //staticメソッドからインスタンスメソッド呼出でコンパイルエラー Methods.methodFour();//staticメソッドからインスタンスメソッド呼出でコンパイルエラー } static void methodTwo(){} void methodThree{ methodOne(); Methods.methodTwo(); methodFour(); Methods.methodFour(); //クラス名.メソッド名()はstaticメソッド呼出し時のみ可能なのでコンパイルエラー } void methodFour(){} } |
スコープに注意!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class Test{ int x = 3; //インスタンス変数 static int y = 2; //static変数 public static void main(String[] args){ int x = 10; //ローカル変数 int y = 10; //ローカル変数 Test obj = new Test(); obj.printIt(); obj.printIt(y); //ローカル変数のy(10)を引数にしている } Test(){x = x+1;} //コンストラクタでインスタンス変数に1を加算->4 static {y += y;} //staticイニシャライザでyにyを加算->4 void printIt(){ System.out.print(++x);//前置きインクリメントで1加算してから出力 } void printIt(int y){ System.out.print(" " + ++y);//前置きインクリメントで1加算してから出力 } } |
– 5 11が出力される
ローカル変数に修飾子は指定出来ない!!!!
1 2 3 4 5 |
public class Test{ public void message(int i){ public int j = i;//コンパイルエラー } } |
finalize()メソッド!!!
- Objectクラスで定義
- 任意でオーバーライド可能
- 明示的に呼び出すことが可能
- ガベージコレクタによってオブジェクトが破棄されるタイミングで呼び出される
ガベージコレクタの破棄対象になるタイミングは注意深く参照がなくなるタイミングを見る!!!
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Test{ private String s; private void funcX(String a){s = a;} public void funcY(){ String s = new String(); //1 ローカル変数sが参照 funcX(s); //1をインスタンス変数sも参照 s = new String(); //ローカル変数sは2つめのオブジェクトを参照 funcX(null); //インスタンス変数sが1の参照をやめたので、ここで1つめのオブジェクトがガベージコレクタの対象 s = null; } } |
静的インポート!!!
[/java]text
import static パッケージ名.クラス名.static変数名;
import static パッケージ名.クラス名.staticメソッド名;
import static パッケージ名.クラス名.*;
[/java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package tests; import static tests.Int.i; //静的インポート public class Int{ static int i;//静的インポート対象 } class Main{ public static void main(String[] args){ i = 10; //静的インポートしているので宣言なしでOK sum(i); //sumメソッドに渡しているが基本データ型で戻していない System.out.println(i);//そのまま10が出力される } static void sum(int i){ i += i; } } |
暗黙の型変換!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Test{ public static void foo(long l){ //code } public static void foo(int i){ //code } public static void main(String[] args){ short x = 1; long y = 2; foo(x); foo(y); } } |
- 一見foo(y)はいけてもfoo(x)がコンパイルエラーっぽいがshort型はint型に暗黙の型変換によりコンパイル、実行が可能
可変長引数
- …(ドット文字3つ)をパラメータ変数の後に書く
- 下記はString[] s と同じ
1 2 3 4 5 6 7 8 9 |
class Doit{ public Doit(String... s){ //code } new Doit(); new Doit("0"); new Doit("0","1"); } |
ああローカル変数!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Dog{ int i; //インスタンス変数(ずっと0のまま) Dog(){ //con1 this(10);//con2を実行 } Dog(int i){ //con2 this(i,10); //con3を実行 i = i * 10; //引数のローカル変数iを更新 } Dog(int i,int y){ //con3 i = i * y; //引数のローカル変数iを更新 } public static void main(String[] args){ System.out.println(new Dog().i);//con1からインスタンス変数を出力 } } |
this()の引数内でthisキーワードを使用して変数を指定することは出来ない
1 2 3 4 |
Dog(int i){ this(this.i,10); //コンパイルエラー this.i = i * 10; } |
アクセス範囲
1 2 3 4 |
package test; class Message{ //Messageクラスは同じtestパッケージからのみアクセス可能 public string str = "hello"; //なのでstr変数も同じtestパッケージからのみアクセス可能 } |
1 2 3 4 |
package test; public class Message{ //Messageクラスはパッケージ内外問わずアクセス可能 public string str = "hello"; //なのでstr変数もパッケージ内外問わずアクセス可能 } |
インターフェースの変数の修飾子
- インターフェースには定数を定義
- なので final , static , private
カプセル化のメリット
- 呼び出し元を変更せずにメソッド内の実装を変更できる
- オブジェクトのデータを隠蔽できる
インターフェース型のオブジェクトを引数にする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
interface Foo{ void bar(); } class Bar implements Foo{ public void bar(){<br /> } public void fubar(Foo foo){ foo.bar(); } public void BarFoo(){ fubar(new Bar()); //インターフェースの直接インスタンス化出来ない //Barオブジェクトを生成すればFooインターフェース型として扱える } } |

開発ベンダー5年、ユーザ企業システム部門通算9年、ITトレーナー2年目のSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
「MasterCloud-Alexa makes the world a better place-」で登壇しました
クラウド全体を扱う勉強会MasterCloudのAlexaの会で登壇してきました …
-
-
持ち帰って欲しいもの
「カスタマーサクセス Advent Calendar 2018」にお誘いを受けま …
-
-
DevLOVE関西「SIerから飛び出して、それからどうするの?」に行ってきました
DevLOVE関西「SIerから飛び出して、それからどうするの?」に行ってきまし …
-
-
「GCPUG Tokyo Container Builder Day February 2018」に行ってきました
GCPUGは神戸以来の2回目で参加させていただきました。 申し込もうかと思ったら …
-
-
ヤマムギvol.5 「BI ファーストステップ ~re:dash , PowerBI , Google Data Studio , Wave~」を開催しました
僭越ながら主催運営していますヤマムギの第5回目勉強会「BI ファーストステップ …
-
-
再会の日 ~re:Union 2018 Osaka by JAWS-UG~
8/5は大阪でre:Unionでした。 「再会」と名うったこのイベントは、6月に …
-
-
第四回 八子クラウド座談会in関西 「メーカーとITが急接近!?IoTってどないやねん!?」に参加しました
第四回 八子クラウド座談会in関西 「メーカーとITが急接近!?IoTってどない …
-
-
Developers Summit 2018 「Building Real-time Application With AWS AppSync 〜GraphQLの始め方〜」を聞きました
以下は、思ったことや気になったことをメモしていますので、必ずしも登壇者の発表内容 …
-
-
JAWS-UG 関西IoT専門支部「マクニカkibo + AWS IoTハンズオン」に行ってきました、というか運営メンバーとして参加してきました
2015/12/19(土)はJAWS-UG 関西IoT専門支部の記念すべき1回目 …
-
-
AWS Summit 2016 Tokyoに参加してきました (Day3)
飛天3日目です。 JAWS-UGブースのすぐ前にあったこのお水がめちゃめちゃおい …