ヤマムギ

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

  関連記事

docomo雑談APIのAPIキーを発行する

docomo雑談 APIのキー取得の方法です。 (2017年8月13日時点の情報 …

「SIerIoTLT vol9@サポーターズ 」でLTしました〜

サポーターズさんで開催されたSIerIoTLT vol9でLTしてきました。 今 …

「JAWS-UG 名古屋 AWS Demo-1グランプリ」を開催しました

「JAWS-UG 名古屋 AWS Demo-1グランプリ」を開催しました! 「開 …

Alexa Day 2018で「Alexa はどこにでも。AVSが開くAlexa Enabled なライフスタイル」を聞きました

photo by 金春さん スピーカーはオランダから一時帰国中の伊東のともさん …

走った!しゃべった!呑んだ!JAWS DAYS 2016 re:cap 〜JAWS-UG大阪&関西女子会 特別合同企画〜

先日のJAWS DAYS 2016 re:cap 〜JAWS-UG大阪&関西女子 …

「第14回RxTStudy(Redmine勉強会)」に行ってきました

土曜日の真っ昼間に半分以上が初参加者さんで80席が満席。 それだけRedmine …

LINEとAWSとTwilioとkintoneでBOTを作ってみるハンズオン (1)LambdaからSlackへ通知する1

作る部分 SlackのWebURLを確認する Slackでチームを作成してbot …

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

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

「AWS認定 デベロッパーアソシエイトの試験に出るかもなデモ見せあいっこ(ヤマムギvol.12)」を開催しました

デモ勉強会を開催しました! 2021/4/7にヤマムギ12回目の勉強会「AWS認 …

「Engineering Productivity Meetup #2 in 大阪」に参加しました

AWS SSOのしくみを AWS IAM Identity Centerへ移行し …