ちくやらアーカイブ

このブログは気分よって構成されています。 BGMも気分で流してます。 あなたの忍耐に感謝します。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告|
  3. トラックバック(-)|
  4. コメント(-)

識別子とリテラル

● 識別子
変数・クラス・メソッド・インターフェース・ラベルとかに付ける名前のこと。
規則が三つあって、


1.キーワード、またはリテラルはそのままでは使用できない。
 例えば
 ×case
 ○case1 ※キーワードをちゃんと覚えてないとひっかかりやすい。
 ○Case  「array」とかダメそうでキーワードでないからOKだったりする。

2.数字(1~9)、アルファベット(a~z、A~Z)、$、アンダースコア(_)を使用できる。

3.数字を先頭につけることはできない。$はOK。


例題①
a. 1patu5kaku
b. sjc-p
c. _hensu_
d. strictfp
e. $money
f. c1000


例題②
a. tom&jerry
b. c#
c. $300
d. _hi
e. Goto
f. 2dogs
g. array




①の答え
cef

②の答え
cdeg





● リテラル

ソースコード内に書く基本データ型の値

1.整数リテラル
・10進数…(書かなくてもわかるでしょ)
・8進数…先頭に「0」を置くと8進数になる。
07→7、010→8、011→9 など。
最初の0を除いて21桁まで表現可能。
・16進数…0xまたは0Xを先頭に置くと16進数になる。16桁まで可能。


2.小数リテラル
・floatにいれる時は「F」か「f」を語尾につけないと精度エラーになる。
・doubleは「D」か「d」を語尾につけてもつけなくてもいい。デフォルトの小数のため。


3.論理(ブール)リテラル
・trueかfalseのこと。
・必ず小文字。大文字にすると識別子(変数)になる。


4.文字リテラル
・charに対して' '単一引用符で囲む。必ず一字。
・もしくは\uを先頭につけてUnicode表記にする。


5.空リテラル
・nullのこと。
・必ず小文字。ちなみに大文字にすると識別子扱い。


trueとかfalseとかnullはリテラルだけど予約語ではないので
混乱しないように…(私はたまにそれやってた…w)



スポンサーサイト
  1. 2005/04/02(土) 13:37:46|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

変数初期化関係

● インスタンス変数

インスタンス変数は自動で初期化される。
	
boolean false
char '\u0000'
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
参照型 null




ただし、インスタンス変数でもfinal変数だったら自分で初期化が必要。
それをしないとコンパイルエラー。



● 配列変数の初期化

配列変数は生成時に自動的に初期化される。


boolean [] b = new boolean[3];
System.out.println(b[0]);
→false

int [] c = new int[3];
System.out.println(c[0]);
→0

float [] f = new float[3];
System.out.println(f[0]);
→0.0


String [] s = new String[3];
System.out.println(s[0]);
→null



● ローカル変数

ローカル変数は基本的に自分で初期化が必要。
ただ、ローカル変数は初期化しなくてもコンパイルエラーにはならないが、
初期化してないローカル変数を使おうとするとコンパイルエラーになる。


ローカル変数でstaticはつけることができない。



● その他

Class Date{int d;}

class Sample{
int x;
Date y;

public static void main(String [] args){
Sample s = new Sample();
System.out.println(s.x);
System.out.println(s.y);
}
}

これを実行すると
0
null
が表示される。
Date yが生成されてなさそうで、nullで初期化されている。
s.y.dだったらぬるぽだが、s.yはnullを参照しているのでnullが表示される。








Class Date{int d;}

class Sample{
public static void main(String [] args){
int x;
Date y;
Sample s = new Sample();
System.out.println(s.x);
System.out.println(s.y);
}
}

こっちだとコンパイルエラーになる。
理由は「初期化されていないのにs.xとs.yを使おうとしている」
注意するのは別に初期化しなくてもエラーにはならないということ。
初期化されていないのを使おうとするとエラーになる。





Class Date{int d;}

class Sample{
public static void main(String [] args){
Date [] da = new Data[3];
System.out.println(da);
System.out.println(da[0]);
System.out.println(da[0].d); //実行時にぬるぽ
}
}

配列変数で初期化される。この時はnullで初期化。
だからdaとda[0]は参照値であるnullがでる。





  1. 2005/04/02(土) 13:49:01|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

基本データ型と演算精度など

● 変数の型


変数には基本データ型と参照型の二種類ある。

基本データ型
→boolean byte short int long char float double

参照型
→クラス型、インターフェース型、配列型
※Stringはクラス型


・byte …8ビット。-128~127
・short …16ビット。-32768~32767
・int …32ビット。-2147483648~2147483647
・long …64ビット。

・float …32ビットの浮動小数点。
・double …64ビットの浮動小数点。デフォルトの小数はこっち。

・boolean …true、falseが入る。
・char …16ビットのUnicode。符号無し16ビット整数で0~65535であればいい。


※floatやdoubleに整数をいれる時は語尾にfとかdをつけなくていい。
※double d = 1.0f;はOK。doubleの方が大きいので。



・float宣言の問題で

 float f = '1';
 はOK。'1'はcharである意味整数値なので。

 float f = 3e-2;
 は×。3e-2=3*10の-2乗=0.03。なんで、小数だからfをつけないとfloatにはいれられない。




● キャストと縮小変換


byte < short < int < long < float < long
 I
char---+


charはint以上のものにも変換できる。
shortとbyteを直接charには代入できない。
(int > charってこと)

short = charはキャストしないとNG。
char = short も同様にキャストしないとNG。

byte b = 127;
はintの127がbyteに入る。
が、この時は「縮小変換」されてはいっている。

byte b = 128;
はbyteに縮小変換したときにbyteの範囲をこえているのでコンパイルエラー。

ただ、
int i= 128;
byte b = (byte)i;
はOK。byteにキャストした時に128は-128になる。


int > short

なので
int a = 10;

shortの変数にいれるにはキャストしないとコンパイルエラーになる。
short s = (short)a;




● 演算精度


intより小さい整数は計算するとintに変換される


int a = 300;
float f = a / 7;

はf = 42.0;
a/7はintでのわり算で42になるが、floatに入ると42.0になる。


byte b = 10;
short s = b * b;
はコンパイルエラーになる。

short s = (short)(b * b);
ならエラーにならない。



割り算は「割る数」と「割られる数」が共に整数ならば結果は整数となり、
それ以外は浮動小数となる。



かけ算も、掛け合わせる2つの数値が整数の場合は結果が整数、それ以外は浮動小数。

(short)x / y * 2
で、yがdouble型だったら、この演算はdouble型で返す。



浮動小数点同士の演算ではエラーはおきない。
1.0 / 0.0 でもエラーはでない。


double dcc = 1.0/ 0.0;
をやったら確かにエラーでなかった。

int aaa = 1 / 0;

Exception in thread "main" java.lang.ArithmeticException: / by zero
がでた。


result += i-- * --j ;
という計算式は
result += (i--) * (--j) ;
と同じ。



● 0除算

整数を0で除算すると
java.lang.ArithmeticException: / by zero
がでる。

同様に0で%剰余しても
java.lang.ArithmeticException: / by zero
がでる。


ただし、浮動小数を/や%とかで0で割ってもエラーにならない。
これを「NaN」という。




● 条件演算子

変数 = (ブール式) ? trueの場合に代入する値 : falseの場合に代入する値

int a = 3;
String s = (a > 2) ? "aは2よりでかい" : "aは2以下";


  1. 2005/04/02(土) 13:55:50|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:1

ビット計算

AND
OR
XOR
NOT
についてはそれぞれすでに知っているものとして、



x = -7;

x >> 30は
intは32ビットだから
1111 1111 1111 1111 1111 1111 1111 1001
これを気合いで右に30シフトするが
>>だから符号は保持されるので
1111 1111 1111 1111 1111 1111 1111 1111
の-1

x >>> 30だと0で埋められるから
0000 0000 0000 0000 0000 0000 0000 0011
の3になる。




4 | 5 ^ 6 & 7

これの優先順位は

& > ^ |
である。
つまり、
and > xor > or

すると、
0110
0111のand→0110

0110
0101のxor→0011

0100
0011のor→0111で7が答え。


・-32 >>> 4 >> 4 >>> 4 >> 4 >>> 4 >> 4
という問題。
これ、4*6=24ビットを右にシフトするので
とりあえず32-24=8ビットになるんだけど、
その8ビットが逆に残るというわけ。
元の上位8ビットがそのままのこる。
そんな感じでわざわざやらなくても簡単に求めることが
できるやつもある。



● ~チルダ

・~(チルダ)だが、ビットの反転だけじゃないっぽい。
実際は「-x-1」
という計算扱い。


x=5は
~xで-6になる。

  1. 2005/04/02(土) 14:01:47|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

配列変数

配列の宣言については
「正しい宣言はどれか?」みたいな問題が出るときがある。



↓基本はこれだが
int [] a = {1,2,3,4};





「無名配列」の宣言は必ず覚えておく。

int [] a;
a = new int[]{1,2,3,4};

もし[]の中に要素数を書いたらエラー。




あと、こんな宣言の仕方は普通しないんだけど
int []bar, baz[];

int []bar;     一次元配列
int []baz[];    二次元配列
になる。


  1. 2005/04/02(土) 14:05:18|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

static

メソッドやクラスを特定のインスタンスだけではなく
クラス全体に適用されることを示すために使う。

staticメソッドはstatic変数をアクセスするために使う。
また他のstaticメソッドを呼び出すためにも使う。
ただし、非staticの変数やメソッドを使うには
それらに関するインスタンスを指定する必要がある。
(つまり、クラス参照でやりとりするということ)


class Foo{
static int count = 0;
public Flag(){
count++;
}

public static void main(String [] args){
new Flag();
new Flag();
new Flag();
System.out.println(count + "");
}
}

を実行すると
3
がでる。

staticは一番最初に呼ばれた時は初期化して
二度目以降は値そのままになっているという話。

ここで、
static int count = 0;

int count = 0;
だったら、System.out.println(count + "");でエラーになる。
mainメソッドがstaticなのに対してcountがただのインスタンス変数なので
アクセスできない。




●static初期化子(イニシャライザ)

クラスが最初にロードされた時に処理を行うために使用する。
逆に言うと、一度しか実行されない。

static{

}
で記述する。


class Question{
static int i = 1;
static{
++i;
}

public static void main(String [] args){
plus(i, 5);
display(i);
}

static void plus(int n, int m)
{
n += m;
}

static void display(int n){
System.out.print(n);
}

static{
++i;
}
}

を実行すると、
まずstatic初期化子が先に実行されるので、
i=3
plusメソッドは意味ないので
結果として"3"が表示される。



・メソッド内でstatic変数はつかえない。
 つまり、ローカル変数でstaticはアウツ。

  1. 2005/04/02(土) 14:10:25|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

mainメソッド

public static void main(String [] args)


これが基本形。String配列の変数名は任意だけど、
修飾子とかは必ずこれで無いと実行することができない。
ちょっとでも違うと
コンパイルは通るが、実行時にエラーをだす。


例えば
public static void main(String str)
だとコンパイルは通るが実行はできない。
Stringが配列になってないが、それでもだめ。
mainメソッドに関しては実行するには決まったカタチでないとだめ。


staticがなくてもコンパイルは通るが実行するとエラーがでる。


そんな感じで一見すると良さそうなソースでも
mainメソッドが微妙に違うので実行エラーという
ひっかけ問題がたまにでるので注意が必要。




● 引数について

java TestMain
で実行するとargs.length = 0
コマンドライン引数が一つもない場合も、この配列は常に作成される。



java TestMain a b c
で実行するとargs.length = 3 だと
args[0] = "a";
args[1] = "b";
args[2] = "c";

※↑よく配列の範囲を超えたような問題がでるので注意。


  1. 2005/04/02(土) 14:16:23|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

水曜日-a.m.12:10/非情のインド洋

潜水艦艦長
「追っ手だッ!洗濯物をたたんどけ!」
「撃て撃てッ!なンでもいいから撃て」


恐らく「海賊」だと思われる一味に助けられた麒麟。
だが、その生存は軍が許さず、巨大艦隊により砲撃を受ける。
応戦し一機の戦艦内へ麒麟が侵入し戦いが始まる。



スレイヴァー
「これ人間、そこで何をしておる」
「捨てられたのか?」
「殺したいのだな?」
「ぞんぶんに命を奪うがよい。
 余は滅びを望んでおる」



海上を走るホバーマシンを手に入れた麒麟は
沈み行く戦艦より脱出したが、インド洋上に孤立する。
そこに、かつてのターゲットである「スレイヴァー」が降臨する。
戦闘兵器「狄」としての本能を揺さぶるように囁き
そして「狄」同士の戦いがまた始まる。



狄のカノンス
「兄弟子と戦うのか? よかろう
私たちに似合いの血の道だ」


※「狄」の人間関係がわかる数少ない台詞の一つ。



狄のウィルフ
「狄は4人。いま残ったのは3人。
きさまが死んで2人になる。
いずれ俺がひとり残り、最強兵器の
名を手に入れる」


※狄の戦士が4人いることがわかる台詞。
 また、先の戦いで一人死亡していることもわかる。



狄のティアノン
「麒麟 おまえは美しい
わたしを燃え上がらせるからだ」


※狄が戦闘…殺し合いを楽しんでいるかのような台詞。



  1. 2005/04/02(土) 17:54:12|
  2. レゲー:キャノンダンサー|
  3. トラックバック:0|
  4. コメント:0

switch case

switchに使われる値は基本的にint型。
だからintより型の小さいものは全て使える。
int short char byte
この4つが使える。



byte b = 200;
switch(b){
はコンパイルエラー。
byteの範囲-128~127じゃないから。




caseは基本的にfinal値のみ扱える。
ちなみに
final int a = 10;

case a-2:
は可能。
基本的にfinalだからfinalを使った演算も固定扱い。
 
そのかわり
int a = 10;
だったら無条件でコンパイルエラー。



byte b = 2;
switch(b){
case 128: (略)
}

はコンパイルエラーになる。理由はswitchでbyte型が使われていて
caseでbyteの範囲外の数値を使っているから。

 


あとは、breakがなかったら次のcaseやdefaultへ
処理が流れているってあたりを
抑えていれば問題ないはず。


  1. 2005/04/03(日) 14:32:57|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

instanceof

あるオブジェクトがあるクラスのオブジェクトかどうかをチェックする。

<オブジェクトを参照する変数> instanceof <クラス名>

ちなみに予約語。



class Parent{}
class Child extends Parent{}
class Test{
public static void main(String [] args){
Child c = new Child();
if (c instanceof Child){
System.out.println("c is Child");
}

if (c instanceof Parent){
System.out.println("c is Parent");
}
}
}

を実行すると、
c is Child
c is Parent
を表示する。
継承元のクラス(スーパークラス)もみれる。


class Parent{}
class Child extends Parent{}
class Test{
public static void main(String [] args){
Parent p = new Parent();
if (p instanceof Child){
System.out.println("c is Child");
}

if (p instanceof Parent){
System.out.println("p is Parent");
}

if (p instanceof Object){
System.out.println("p is Object");
}


}
}

これだと、
p is Parent
p is Object
が表示される。
ParentのサブクラスChildは参照しない。
Objectについては、基本的に親クラスのさらに上のスーパークラス。

  1. 2005/04/03(日) 14:41:48|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

論理演算子とif文

if文とかの条件判断に使われる。
ここも知らないと滅茶苦茶ひっかけられる。


&& と || についての注意事として、
左オペランドが成立すると右オペランドは実行しない
というのがある。


A && B においてAがfalseだったら、全体がfalse扱いになりBは実行されない。

A || B においてAがtrueだったら、全体がtrue扱いになりBは実行されない。



例えば
int i = 0;
int j = 0;
の時
if ( i++ == 0 || j++ == 0) System.out.println("i=" + i + " j=" + j);


実行すると
i=1 j=0
を表示する。
つまり、左オペランドが成立しているので右オペランドは無視されてしまったというわけ。



ビット演算子 & と | が使われることがある。
これの時は左オペランドが実行され、
その結果に関わらず右オペランドが実行される。



例えば、
int i = 0;
int j = 0;

if ( i++ == 0 & j++ == 0) System.out.println("i=" + i + " j=" + j);
i=1 j=1

if ( i++ == 0 | j++ == 0) System.out.println("i=" + i + " j=" + j);
i=1 j=1


どっちも同じ。




ついでにif文について

if文はbooleanの値しかとれないので
それ以外だとコンパイルエラーを返す。


boolean b;
if (b = true){}
というように、boolean型の変数だったら
代入を書いてもコンパイルは通り、処理も正常。
ちなみにこの場合はb = trueをしてから(b)の判定をするので
true判定になる。


しかし、
int x = 0;
if (x = 7){}
という書き方をするとエラーになる。





  1. 2005/04/03(日) 14:50:46|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

木曜日-a.m.11:11/記憶の森

ジャック・レイソンのいるプラハに潜入を試みる麒麟。
その前に不思議な森が…
そこは現在なのか、それとも過去なのか…



記憶の森をぬけたプラハ前に狄が立ちはだかる。
しかし彼らの台詞は全て過去形を表していた。



狄のカノンス
「かつての狄麒麟も地に落ちたな
 スレイヴァーから命を買ったのか?
 それほど私に殺されたのが悔しかっ
 たのか?」
「忘れたのなら思い出させてやる。
 お前の死に場所を選ぶがいい!」

killing09.jpg




狄のウィルフ
「ケケケ!亡霊となって現れたか麒麟!
 おまえは とうの昔 俺に切り裂かれ
 て死んだのだ」
「さあ、どこで殺されたか思い出せ!
 思い出を選ばせてやるぜ!」

killing11.jpg




狄のティアノン
「あの日のおまえは勇敢だった。
 忘れたのか?わたしの技に敗れ
 おまえが死んだあの日のことだ。」
「自分がかつて死んだ場所を選ぶがいい
 なにもかも思い出すだろう」

killing13.jpg





戦闘終了後



狄のカノンス
「この私が敗れていたとはな・・・
 いけ!野蛮人の顔は見飽きたわ」




狄のウィルフ
「まさか・・俺が死んでいたなんて!」



狄のティアノン
「そう わたしはこんなふうに死んでい
 た スレイヴァーからいのちを買ってまで
 蘇ったのは 一度でいい ふたたび
 あなたと戦いたかったから・・・」
 



 
  1. 2005/04/03(日) 16:13:57|
  2. トップ|
  3. トラックバック:0|
  4. コメント:0

修飾子とアクセス修飾子

他でもまた同じこと書くだろうけど、とりあえず。



●修飾子
・final
・abstract


●クラスにつけることができる修飾子は
・final
・abstract
・public
・なし


●アクセス修飾子

変数やメソッドとかにつけることができる。
詳しくは↓下記の方を参照のこと。
・public
・protected
・(なし)
・private


※strictfpはメソッドやクラスにつけれる修飾子。
 めったに出ないけど…



●インターフェースの修飾子
・public
・abstract
だけ。これ以外は無し。



●コンストラクタの修飾子

アクセス修飾子のみつけることができる。
・public
・protected
・(なし)
・private



●メソッドの修飾子
abstract
final
static
native
synchronized ※変数にはつけれない。

これらとアクセス修飾子。




※abstractメソッドについてはabstractを参照のこと。
ぶっちゃけ、abstractとはほとんどいっしょに使えない。



●アクセス修飾子について


public class Parent{
int x;
public int y;
protected z;
private w;
}

Package child;

public class Child extends parent.Parent{
public void f(){
System.out.println("x = " + x); //①エラー
System.out.println("y = " + y); //②正常
System.out.println("z = " + z); //③正常
System.out.println("w = " + w); //④エラー
}
}

①は修飾子が無い。パッケージプライベートというかParentパッケ内でしかアクセスできない。
②はいうまでもなくpublic。
③はprotectedはサブクラスからならアクセスできる。
④はprivateだから普通に無理。


まとめると

広い  public …制限なし
↑   protected …そのクラス、そのクラスのサブクラス、そのクラスと同じパッケージ内のクラス
↓   なし …そのクラス、そのクラスと同じパッケージ内のクラス
狭い  private …そのクラス


アクセス範囲についてはメソッドのオーバーライドの問題で
必ず出るので覚えておく必要がある。



  1. 2005/04/05(火) 22:32:57|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

スーパークラスとサブクラス

クラスはextendsを使って継承するが、
一個のクラスしか継承できない。
複数の実装をしたいときはインターフェースをimplementsする。



●スーパークラスとサブクラスのフィールド変数の関係。

メソッドを実行したときとか、スーパークラスかサブクラスの
どちらのメソッドが実行されるのか、
またどちらにある変数が使われるのか、など
慣れないと混乱する。



・変数については「参照変数の型」によって指定される。
 親クラスが型だと、親クラスの変数を参照する。

・メソッドについては「その変数が参照するオブジェクトの型」
 によって指定される。

・インスタンス生成がサブクラスだとサブクラスのメソッドが
 呼ばれる。

・その際、もし子クラスにある同名メソッドが
 「オーバーロード」だった場合は、親クラスのメソッドが使われる。

・ただし、staticについては、変数と同じで「参照変数の型」になる。




class Super{
int num = 10;
static int snum = 20;
void method(){ System.out.println("Super Method");}
static void smethod(){ System.out.println("Super sMethod");}
}

class Sub extends Super{
int num = 30;
static int snum = 40;
void method(){ System.out.println("Sub Method");}
static void smethod(){ System.out.println("Sub sMethod");}
}

class Sample{
public static void main(String [] args){
Super s = new Sub();
System.out.println(s.num);
System.out.println(s.snum);
s.method();
s.smethod();
}
}


Super s = new Sub()は
10
20
Sub Method
Super sMethod
を表示する。



Sub s = new Sub()は
30
40
Sub Method
Sub sMethod


Super s = new Super()は
10
20
Super Method
Super sMethod


Sub s = new Super()
sample.java:20: 互換性のない型
出現: Super
要求: Sub
Sub s = new Super();
^
エラー 1 個




●多様性

同名の変数がスーパークラス、サブクラスの両方にあった場合
どっちが使われるのか?


class Super{
int num = 10;
static int snum = 20;
void method(){ System.out.println("Super Method");}
static void smethod(){ System.out.println("Super sMethod");}
}
class Sub extends Super{
int num = 30;
static int snum = 40;
// void method(){ System.out.println("Sub Method");}
static void smethod(){ System.out.println("Sub sMethod");}
}
class Sample{
public static void main(String [] args){
Sub s = new Sub();
System.out.println(s.num);
System.out.println(s.snum);
s.method();
s.smethod();
}
}

30
40
Super Method10
Sub sMethod


メソッドを実行するクラスの変数を使っている。




あと、スーパークラスとサブクラスの問題では
「デフォルトコンストラクタ絡みのひっかけ問題」が多い。
これについてはまた後で同じことを書くかもしれないが、


class Parent{
Public Parent(String message){
//
}

Public void printMessage(){
//
}
}

class Child extends Parent{
Public void printMessage(){
//
}
}

class Sample{
public static void main(String [] args){
Parent obj = new Child();
obj.printMessage();
}
}


という問題があった場合、
スーパークラスには「コンストラクタがある」が
サブクラスには「コンストラクタがない」。

で、Parent obj = new Child();より
サブクラスで呼び出しているが、この時「デフォルトコンストラクタ」が呼び出す。
サブクラスのコンストラクタが呼び出されると
「スーパークラスのコンストラクタを呼び出す」ことになっているが、
デフォルトコンストラクタは「引数無しのスーパークラスのコンストラクタ」をよびだそうとする。
が、スーパークラスには「引数ありのコンストラクタ」があるため、
super();で呼び出せるコンストラクタが無いため
コンパイルエラーが発生する。


このひっかけ問題はほぼ出てくる。
けど慣れたらソースみた瞬間にコンパイルエラーだというのが
わかるので時間稼ぎにもなる。
  1. 2005/04/10(日) 14:22:28|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

金曜日-a.m.04:27/連邦首都プラハ

三人の狄を倒し、首都に潜入した麒麟は
ジャック・レイソンのいる部屋へと向かう。
(この面は全面通しても難しい)
ボスを倒して、ジャック・レイソンと対峙する麒麟


ジャック・レイソン
「砂漠から、生きてかえっただと?!」
killing14.jpg



パフアから生還した麒麟を見て驚くレイソン。
逃げようとしたその背後からスレイヴァーの剣がつきささった。



スレイヴァー
「こっちへ来い、麒麟」
「余のかわいい殺人兵器よ」
「こっちへくるのだ。
余が、おまえの主人である」



「神」の声に従い、差し出した剣に再び乗る麒麟。
レイソンへの復讐を遂げた今、
麒麟の目的は…?
それともスレイヴァーに飼い慣らされてしまったのか…?



  1. 2005/04/10(日) 15:09:44|
  2. レゲー:キャノンダンサー|
  3. トラックバック:0|
  4. コメント:0

土曜日-a.m.09:03/北極圏

スレイヴァーに連れてこられた世界…北極圏。
そこはかつて麒麟が倒したもの達がうごめく地獄。


敵の本拠地にきた麒麟は、
そこでスレイヴァーに対して牙を剥く!


スレイヴァー
「その殺気!
余と戦うつもりか」



麒麟はその戦闘兵器「狄」としての本能…
殺戮を「神」と呼ばれる存在に対して向けていた。
麒麟の虚像を作りだし戦わせるスレイヴァー。
かつて2面でスレイヴァーの虚像と戦ったが
それはここで生み出されていた。
「命を買う」とは、そのものの虚像を作り出すことなのか。



自分の虚像を倒した麒麟はスレイヴァーの元へと向かう。
その途中、かつて倒した三人の狄が立ちはだかる。


狄のカノンス・狄のウィルフ・狄のティアノン
「地獄で鍛えた無敵の包囲陣
ディ・ルーデル・タクティーク
とくとみよ」



スレイヴァーから命を買い、地獄で麒麟を待ち続けていた
三人の執念という名の殺戮の行く先は…


  1. 2005/04/10(日) 15:36:17|
  2. トップ|
  3. トラックバック:0|
  4. コメント:0

日曜日-a.m.00:00/太陽圏

スレイヴァー戦前


「余か!おまえか!
 強い者が手にする

killing15a.jpg



「褒美は・・・」
「これだ

killing15b.jpg



killing15c.jpg



「神」との最終決戦。
勝ったものは全てを手に入れられる…




スレイヴァー戦後
killing16a.jpg




「わからなくなったのか?
killing16b.jpg




 余は 神であるぞ」

killing16c.jpg





「余が 神であるぞ」
killing16d.jpg




最後の台詞。これはスレイヴァーによるものか…
それとも「神」を殺してしまった麒麟によるものか…
  1. 2005/04/10(日) 16:09:39|
  2. トップ|
  3. トラックバック:0|
  4. コメント:0

オーバーライドとオーバーロード

よくでる問題だけど、慣れると簡単で点数稼ぎになる。


● オーバーライド

最初、名前が混乱するかもしれないが(笑)
オーバーライドとは「上書き」。
サブクラスを作った時にスーパークラスにあるメソッドを
「上書きする」ということである。
私はこんなイメージで覚えました。


で、「上書き」なのでちゃんと規則があり
これを覚える必要があり。


・同じ引数(シグネチャ)であること。
・同じ戻り値であること。
・throwsをつけていた場合、新しい例外や範囲の広がる例外はつけれない。
 ただし、より狭い例外やチェック無しの例外は投げることができる。
・アクセス修飾子については、より厳しいものにはできず、緩いものにはできる。
 例えば、オーバーライド元のメソッドのアクセス修飾子が
 protected → publicは可能だが、逆は×
 修飾子無し → privateも×だが、逆は可。


オーバーライドについて修飾子のレベルと例外のレベルは
↓のような図を書いてイメージで覚えてました。
なんていうか、左は↑が○で右は↓が×みたいな……(汗)


 ○     ×
広がる  広がる
 ↑     ↑
「元の修飾子」メソッド名(シグネチャ)「元の例外」
 ↓     ↓
狭まる  狭まる
 ×     ↓
何もなしとRuntimeException
      ↓
  ○


※RuntimeExceptionは
 Exceptionのサブクラスなので「狭い」になる。

※アクセス修飾子については
 ここを参照





・finalメソッドはオーバーライドできない。
・staticメソッドをオーバーライドする時は、やはりstaticを必ずつける。


Sunのサイトにあった問題。


下記の内、オーバーライドの関係になるものを2つ選択して下さい。
1.native void methoda();
2.final void methoda() {}
3.void final methoda() {}
4.synchronized void methoda() {}
5.synchronized final void methoda() {}

1と4

どのオーバーライドメソッドを使うかは実行時のオブジェクト型で決まる





●オーバーロード


よくでる問題なのが、オーバーロードのメソッドを探せとか
オーバーライドになるメソッドを探せみたいなやつ・


・シグネチャの並び順が変わったら、それだけでオーバーロード対象。
 まずこれだけで見破れる。

・引数の並びが同じだけど戻り値が違う奴とかはオーバーロードではなく
 オーバーライドなんだけどエラーのものである。
 「オーバーライドだったらエラーになる」奴が含まれていることもあるので注意。

・オーバーロードの戻り値は自由に変えることができる。
 オーバーライドの戻り値は変えることができない。


・どのオーバーロードメソッドを使うかはコンパイル時の参照型で決まる
  1. 2005/04/17(日) 16:18:39|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

クラスの宣言

クラスにつけることができる修飾子は
	
・final …継承できない。
・abstract …メソッドの実装はしない。オブジェクトを生成できない。
・public
・なし



このうち、final abstractはできない。
またstaticもつけることができない。



あと、気を付けることは
「一つのソースファイルに二つのpublicクラスを
 存在させることができない」
ということぐらいかな…


理由は、
「1つのソースファイル内には1つのpublicなクラスしか定義できず
 ソースファイルのファイル名は内部に定義されたpublicクラス名と
 同一名称にしなければならない」
から。
だから2つのpuclibクラスがあると、どっちのクラス名を
ソースファイル名にしていいかコンパイラがわからなくなるので
コンパイルエラーになる。


…こんな問題めったに出ませんが。
  1. 2005/04/17(日) 16:26:34|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

コンストラクタ

基礎知識として

コンストラクタの修飾子はアクセス修飾子だけがつかえる。
・public
・protected
・なし
・private


それ以外はだめ。
abstract、static、final、synchronized、nativeはだめ。


他に知識として、
・コンストラクタの継承はできない。
・コンストラクタは戻り値を返さない。
・コンストラクタは例外を発行できる。


クラスにコンストラクタがない場合はデフォルトコンストラクタがよばれる。
そのデフォルトコンストラクタではsuper()が自動的に処理される。


デフォルトコンストラクタの修飾子はクラスにあわせられる。
例えばクラスがpublicだったら、デフォルトコンストラクタもpublicになっている。



まずこれをふまえて…



●super()とthis()


全てのコンストラクタの最初の文は
super()またはthis()の呼び出しでなければならない。


class Child extends Parent{
Public Child(){
System.out.println("test");
super();
}
}

はコンパイルエラー。
super()が先にきていないため。



●実行順

サブクラスのコンストラクタを生成した場合、
親クラスのコンストラクタ実行→サブクラスのコンストラクタ実行
という順番になる。

これは、サブクラスのコンストラクタでsuper()が実行されるので。
(ただし、これはsuper()をじぶんで書かなかった場合)


●デフォルトコンストラクタのひっかけ問題


class Parent{
Public Parent(String message){
//
}

Public void printMessage(){
//
}
}

class Child extends Parent{
Public void printMessage(){
//
}
}

class Sample{
public static void main(String [] args){
Parent obj = new Child();
obj.printMessage();
}
}


という問題。
スーパークラスには「コンストラクタがある」が
サブクラスには「コンストラクタがない」。

というソース。


で、Parent obj = new Child();より
サブクラスで呼び出しているが、この時「デフォルトコンストラクタ」が呼び出される。

サブクラスのコンストラクタが呼び出されると
デフォルトコンストラクタの仕様で
「スーパークラスのコンストラクタを呼び出す」ことになっているが、
デフォルトコンストラクタは「引数無しのスーパークラスのコンストラクタ」をよびだそうとする。
つまりsuper();が実行される。


が、スーパークラスには「引数ありのコンストラクタ」があるため、
コンパイルエラーが発生する。



スーパークラスとサブクラスの問題で
スーパークラスにコンストラクタがあった場合は、このひっかけがでやすい。




あと、こんな問題もあり。

class Sample{
public Sample(){
}

void Sample(){
}
}


これはアリ。
void が戻り値型だからコンストラクタではなくメソッド扱い。
メソッド名とコンストラクタ名は同じでもいい。



最後に例題。
問題.コンストラクタについて正しい記述をすべてあげろ。
1.コンストラクタは最低一つは必ず定義しなければならない。
2.コンストラクタはオーバーロードして記述することができる。
3.コンストラクタはサブクラスからsuper()という記述で呼び出すが、
 super()はコンストラクタ定義の先頭に記述する必要がある。
4.デフォルトコンストラクタは、引数のないコンストラクタが
 定義されていないときに自動的に定義される。
5.コンストラクタはオーバーライドすることができる。
6.Abstractクラスにコンストラクタを定義することはできない。







答え.
1.×
2.○
3.○
4.×。コンストラクタが一つもないときにデフォルトコンストラクタが作られる。
5.×。
6.○.Abstractクラスでもコンストラクタを定義することができる。
  1. 2005/04/17(日) 16:36:36|
  2. 資格:SJC-P|
  3. トラックバック:0|
  4. コメント:0

福本ネタ

一応、「福本サイト」という看板をかついでいた時期があったので
福本ネタは今でもそれなりに好きです。



そんな感じで、思いついた時に福本ネタをやります。



銀と金「悪魔の錬金術?」 人権擁護法案



  1. 2005/04/23(土) 22:28:39|
  2. 福本ネタ|
  3. トラックバック:0|
  4. コメント:0

銀と金「悪魔の錬金術?」 人権擁護法案

なにをどうやって辿り着いたか忘れましたが、
こちらのサイトを見ました。

サルでも分かる?人権擁護法案
http://blog.livedoor.jp/monster_00/archives/cat_847822.html



これらをふまえた上で福本ネタ。
元ネタは「銀と金」7巻第63話「悪魔の錬金術」より。
ちなみに、3秒で思いついたネタなので
かなりてきとーですm(_ _)m



伊沢
「今日は銀さんの話を少し聞きたい
 今 銀さんはわしに肩入れしてくれているが
 その最終的な目標はなんだい…?」


銀二
「まあ伊沢さんが政界を統治した暁には
 そうですね
 メディア界の統治…これを私に任せていただきますか…
 つまりこの国の大企業…それがどんな大企業…
 それこそ、漫画だろうがTVだろうがネットだろうが
 すべてを私が統治する
ginji01.jpg




伊沢
「銀さん…
 仕掛けはなんだい…?
 どうすればそんな状況が生まれるのか…?
 見当もつかん
 その大掛かりな魔術の仕掛け…」

銀二
「フフ…では話しましょう
 簡単なことです
 このマジックのタネは
 人権法案に「擁護」を加えていただければいい」


伊沢
「人権擁護法案…?」


銀二
「ええ…

 人権侵害、「人権侵害を誘発・助長する恐れのある」発言や
 出版などに対し、もし人権侵害などが疑われた場合、
 関係者に出頭を求めたり、証拠品の提出、立ち入り検査を
 行うなどの措置を取ることができる


 …というのが(大分簡略したけど)この法案の趣旨」

 
伊沢
「その法律一本でいいのかい…?
 それでさっき銀さんがいった
 すべてのメディアの上に立つようなことが…?」


銀二
「フフ…可能です
 だいぶ現実感がでてきますね
 その「人権擁護法案」を通していただければ」


伊沢
「ふーん…
 じゃあかりに…
 その法案が通ったとしようか
 で…銀さんはどうする…?」


銀二
「そう…問題はそこからです
 そこから私の出番
 伊沢さん…そうなった場合
 ひとつやっかいな仕事が増えますね

 企業や個人に対する情報の公開内容が
 妥当かどうかというチェックですよ
 これはちょっと考えても
 ぼう大な労力だと想像がつく仕事…

 当然、現在の人権委員会にそんな人材も時間もない
 そこで
 その業務、免許制にして民間に委託していただく」


伊沢
「じゃあ…」


銀二
「ええ…
 その業務、私が一手に引き受けましょう
 嫌われ者の私には似合いの役回り
 すべての企業のメディア公開内容や
 個人によるサイト等の情報公開内容が
 人権を侵害してないかチェックする調査会社」


伊沢
「…なるほど…」


銀二
「ククク…
 この手の人権侵害チェックは
 現在の日本にもあることはありますが
 いかんせん法的拘束力がない
 しかし私どもの会社は違う
 私どもの評価 判断で
 情報操作能力を左右できるのですから
 圧倒的権力を行使できる…!
 すべてのメディアに…



 もっとも
 私も手荒なことは好まない
 脅したりすかしたりの恐喝じみた真似はしませんよ
 そんなことをせず、企業の方からすりよってくるでしょう
 私どものランクづけがメディアの情報内容に
 直結するのだから当然
 ほっといても金は集まってくる」


伊沢
「なるほど…
 いきすぎた人権侵害を管理するはずだった法律が
 いつのまにかすりかわり
 人権ではなくメディアを管理
 それも国でなく一民間企業が
 まさに魔術だな」


銀二
「フフ…
 その魔術のタネは情報…
 この世の中心は情報ですからね
 いちもにもなく情報…
 それだけは間違いない
ginji02.jpg








実際の元ネタは「銀行融資制限法」、
銀行が企業に融資する金額が妥当かどうかチェックするという話ですが
なんとなく人権擁護法案にも似ているなあと思って
作ってみました。


とりあえず、こんな話が私らの知らないところで
進められているということぐらいは
知っておいた方がいいですよ…ということで。
  1. 2005/04/23(土) 22:29:34|
  2. 福本ネタ|
  3. トラックバック:0|
  4. コメント:0

ルナーク

Category

Recent Comments

Recent Entries

Recent Trackbacks

Archives

Links

Search

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。