ヤマムギ

growing hard days.

*

Java SE 7 Silver対策勉強をしながらメモ 2015/2/2

      2015/03/29


本日はクラス定義とオブジェクト。

一気に範囲が広がった感。
いつものごとくマークダウンで記載したのでそのままJetpack Markdownにお任せでアップ

static イニシャライザの位置に惑わされない!!

[java]
public class Test{
public static void main(string[] args){
Test t = new Test();
}

Test(){
//コンストラクタだけどstaticイニシャライザがあるからその後
}

static {
//staticイニシャライザなのでここが先
}

}
[/java]

staticメンバの記述位置

[java]
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;
}
}
[/java]

宣言時に初期化していないfinal変数はコンストラクタで初期化されればOK

[java]
public class Test{
final int a; //初期化されていない
Test(int b){a=b}; //コンストラクタで初期化しているのはOK
void method(int c){a=c}; //この再代入でコンパイルエラー
}
[/java]

staticメソッドはインスタンス変数に直接アクセス出来ない!!!

[java]
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変数なので直接アクセス可
}
}
[/java]

staticメソッドはインスタンスメソッドに直接アクセス出来ない!!!

[java]
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(){}
}
[/java]

スコープに注意!!!

[java]
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加算してから出力
}
}
[/java]
– 5 11が出力される

ローカル変数に修飾子は指定出来ない!!!!

[java]
public class Test{
public void message(int i){
public int j = i;//コンパイルエラー
}
}
[/java]

finalize()メソッド!!!

  • Objectクラスで定義
  • 任意でオーバーライド可能
  • 明示的に呼び出すことが可能
  • ガベージコレクタによってオブジェクトが破棄されるタイミングで呼び出される

ガベージコレクタの破棄対象になるタイミングは注意深く参照がなくなるタイミングを見る!!!

[java]
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]

静的インポート!!!

[/java]text
import static パッケージ名.クラス名.static変数名;
import static パッケージ名.クラス名.staticメソッド名;
import static パッケージ名.クラス名.*;
[/java]

[java]
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;
}
}
[/java]

暗黙の型変換!!!

[java]
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);
}
}
[/java]

  • 一見foo(y)はいけてもfoo(x)がコンパイルエラーっぽいがshort型はint型に暗黙の型変換によりコンパイル、実行が可能

可変長引数

  • …(ドット文字3つ)をパラメータ変数の後に書く
  • 下記はString[] s と同じ

[java]
class Doit{
public Doit(String… s){
//code
}

new Doit();
new Doit(“0”);
new Doit(“0″,”1”);
}
[/java]

ああローカル変数!!

[java]
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からインスタンス変数を出力
}
}
[/java]

this()の引数内でthisキーワードを使用して変数を指定することは出来ない

[java]
Dog(int i){
this(this.i,10); //コンパイルエラー
this.i = i * 10;
}
[/java]

アクセス範囲

[java]
package test;
class Message{ //Messageクラスは同じtestパッケージからのみアクセス可能
public string str = “hello”; //なのでstr変数も同じtestパッケージからのみアクセス可能
}
[/java]

[java]
package test;
public class Message{ //Messageクラスはパッケージ内外問わずアクセス可能
public string str = “hello”; //なのでstr変数もパッケージ内外問わずアクセス可能
}
[/java]

インターフェースの変数の修飾子

  • インターフェースには定数を定義
  • なので final , static , private

カプセル化のメリット

  • 呼び出し元を変更せずにメソッド内の実装を変更できる
  • オブジェクトのデータを隠蔽できる

インターフェース型のオブジェクトを引数にする

[java]
interface Foo{
void bar();
}

class Bar implements Foo{
public void bar(){
}
public void fubar(Foo foo){
foo.bar();
}
public void BarFoo(){
fubar(new Bar());
//インターフェースの直接インスタンス化出来ない
//Barオブジェクトを生成すればFooインターフェース型として扱える
}
}

[/java]


最後までお読みいただきましてありがとうございました!

【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。

【PR】 「AWSではじめるLinux入門ガイド」という本を書きました。

 - Java, study , ,

ad

ad

  関連記事

「自ら修羅の道を作り、修羅場を楽しみ、自内外に変化を起こし続ける」(『ソフトウェアファースト』読書感想)

「ソフトウェア・ファースト あらゆるビジネスを一変させる最強戦略」を読みました。 …

Java SE 7 Silver対策勉強をしながらメモ 2015/2/6

本日は例外の続き。 これで参考書の章立てはとりあえず終了!! 明日からは模試と練 …

Developers Summit 2018 「夢は正夢〜「野球エンジニア」になるまでの歩み」を聞きました

以下は、思ったことや気になったことをメモしていますので、必ずしも登壇者の発表内容 …

「SendGrid Night in Osaka #2」でLTさせていただきました

SendGrid Night in Osaka #2でLTをしてきました。 会場 …

「Fin-JAWS 第13回 PCI DSS と AWS の混ぜご飯」リモート開催に参加しました

Youtube Liveでリモート開催の「Fin-JAWS 第13回 PCI D …

JAWS DAYS 2018 振り返り(特にコミュニティフレンドシップ)

JAWS DAYS 2018を振り返りたいと思います。 やったこと コミュニティ …

「kintone Café 大阪 Vol.14 〜モザイクなし!うちのkintoneはこれだ!〜」で登壇しました

「kintone Café 大阪 Vol.14 〜モザイクなし!うちのkinto …

AlexaのSmart HomeをAWSで作る方法(Alexa Day 2019でのブログ)

以下は、気になったことのメモとか感想を書いています。 登壇者、発表者、主催企業な …

「Meguro.dev #1 」でモブプログラミングを体験してみました

「AWSの各サービスを道具としてアプリケーション開発を行うデベロッパーのための新 …

「IoT縛りの勉強会/SIer主催版 SIerIoTLT vol4」に行ってきました

「IoT縛りの勉強会/SIer主催版 SIerIoTLT vol4」に行ってきま …