ヤマムギ

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]


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

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

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

 - Java, study , ,

ad

ad

  関連記事

Windowsでの自動化について考える会に出席させていただいた

2015年2月21日 土曜日 詳細はSlideShareの資料を確認してもらえれ …

Developers Summit 2024「AI時代のソフトウェアテストの現在と未来」を見ました

Launchable, Inc. Co-CEO 川口 耕介さん 和田 卓人 さん …

Alexaで操作するスマートホームシステムの概要(Alexa Day 2019でのブログ)

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

コミュニティリーダーサミット in 高知 2024初鰹編に参加しました

13回目のCLS高知に参加しました! 今回は220人もの方が参加されているそうで …

Linux Mint 17 MATE 64bit にAptana Studio 3をインストールして日本語化

JDKのインストール 過去記事「Linux Mint 17 MATE 64bit …

「JAWS-UG in AWS Cloud Roadshow 2017 大阪」で運営をしました

AWS Cloud Roadshow 2017 大阪のナイトイベントで、「JAW …

Alexa Day 2018にサポーターの中の人として(初)参加しました

2018/2/11に神戸三ノ宮のスペースアルファ三宮で開催されたAlexa Da …

「第1回 ぶろぐの勉強会」を開催します!

このブログは2021/3/2開催の「第1回 ぶろぐの勉強会」冒頭挨拶の共有資料代 …

「第二回 AWSマルチアカウント事例祭り」に参加しました

AWSマルチアカウント事例祭りに参加しました。 YouTube配信でした。 マル …

Alexa Day2018で「Alexa連携デバイスクラウドを構成するAWS ソリューション」を聞きました

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