ヤマムギ

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

  関連記事

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

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

Lotusphere 2010に行ってきました

Lotus Technical Award 2009 for Best Arch …

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

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

JAWS-UG 関西IoT専門支部「マクニカkibo + AWS IoTハンズオン」に行ってきました、というか運営メンバーとして参加してきました

2015/12/19(土)はJAWS-UG 関西IoT専門支部の記念すべき1回目 …

AWS Summit 2016 Tokyoに参加してきました (前日 ~ Day1)

AWS Summit 2016 Tokyoにて、セッション聴講、ブース展示拝見、 …

LINEとAWSとTwilioとkintoneでBOTを作ってみるハンズオン (6) Twilioからの電話受付と登録処理

作るところ 電話がかかってきてTwilioで受け付けてStepFunctions …

DevLOVE関西「SIerから飛び出して、それからどうするの?」に行ってきました

DevLOVE関西「SIerから飛び出して、それからどうするの?」に行ってきまし …

JAWS-UG Osaka 第15回勉強会 AWS Summit Tokyo 2016 アップデート追っかけ会

「JAWS-UG Osaka 第15回勉強会 AWS Summit Tokyo …

DevLOVE関西「プログラミングを楽しく続けるための健康Hack」に行ってきました

DevLOVE関西「プログラミングを楽しく続けるための健康Hack」に行ってきま …

ActRoomの仕様を書いてみた

これはLow-Code/No-Code Advent Calendar 2018 …