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入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
「関ジャバ Java開発のためのDocker & てらださんせきらら in MS関西」に行ってきました
「関ジャバ Java開発のためのDocker & てらださんせきらら i …
-
ヤマムギ vol.9 (AWS)EC2からAWS CLIコマンドを実行してみようハンズオン 手順
このブログは2020/5/5に開催しました、「ヤマムギ vol.9 (AWS)E …
-
「DevLOVE関西 ShareWisサービス開発の現場」に行ってきました
DevLOVE関西とは 「DevLOVE関西は素振りの場、現場は実践の場」 いつ …
-
AWS Toolkit for Eclipseをセットアップする
AWSでそろそろ課金がされつつありますので、夜中はインスタンスを自動停止して朝自 …
-
Media-JAWS【第8回】「AWS人材教育について語る!」に参加しました。
Media-JAWS【第8回】「AWS人材教育について語る!」に参加しました。 …
-
Linux Mint 17 MATE 64bit にAptana Studio 3をインストールして日本語化
JDKのインストール 過去記事「Linux Mint 17 MATE 64bit …
-
Alexa Day 2018 で「金融機関向けAmazon Echo/Alexaへの取り組み事例紹介」を聞きました
Alexa Day 2018 で「金融機関向けAmazon Echo/Alexa …
-
JAWS DAYSで人生が変わった話
明日はJAWS DAYS 2021です! JAWS DAYSが変えた私の人生 「 …
-
MonotaRO TechTalk #4「データ分析」に行ってきました
本日の一杯目。MonotaRO TechTalk #4「データ分析」もちろん呑み …
-
JAWS SONIC 2020 & MIDNIGHT JAWS 2020 の深夜のパワポカラオケに挑戦しました
2020/9/12(土) 16:50 ~ 2020/9/13(日) 17:20( …