javaの勉強開始覚書 疑問など

勉強した項目を随時追記 見返し用に疑問があったら書いとく

解決したら書き足していく

 

※表示の都合上[]は全角表示 実際には半角で書くこと

 

==================================

 

public class Test{
     public static void main(String[] args){
          int a = 1;
          System.out.println(a);
     }
}

 

上記が基本形

最初の2行はとりあえずそのまま覚えた

最初のpublicは使用権限先?admin classとかが出てきたりするんだろうか

;は行の末尾につけてないとエラーを吐く

Testはそのプログラムのタイトル 一文字目は大文字にする

複数単語が連なる場合はそれぞれの一文字目を大文字にする(理由は分からんが見ててわかりやすいからヨシ)

 

パブリックスタティックヴォイドメインストリング[]はそのまま覚えた 呪文みたい

argsはなんもわからない アーガス?

 

int aは変数a それに1を代入している(?)

intが変数を決める単語(?) 変数名がa それに1を代入する

よくわからない

名前はなんでもいいのかルールがあるのか

 

System.out.printlnは出力ということから、単語そのままだと思う

Systemは機能?out printで出力みたいなもので末尾lnは改行のために入れてる

改行は英語でnew lineだけどnlではないのか

出力はprint outだったのでイディオムは並びが逆になっている可能性がある

よくわからん new line print out system?

 

public class Test{
     public static void main(String[] args){
          System.out.println(”hello world”);
     }
}

 

有名らしいはろーわーるど

なんか知らんけどよく聞くやつ 元ネタがあるんです?

出力部の()内は""で囲んでないと文字列認識されない罠がある

囲んでたら日本語だろうがなんだろうがそのまま文字列出力される 強い

 

==================================

 

public class VariableTest{
    public static void main(String[] args){
        int age = 35;
        System.out.print("age:");
        System.out.println(age);
        age = age + 1;
        System.out.println("1年後...");
        System.out.print("age:");
        System.out.print(age);
    }
}

 

これは変数使って年齢とか出力したやつ

int age = 35は変数ageに35を代入するという意味

数字は自由に変更できる

pirntとprintlnが混在してる これはage35という風に横並びに出力したかったから

(”age”)はそのままageとして  (age)は変数ageが代入されるので35に変化する

age = age + 1は変数ageに変数age+1したものが代入される

これで最初に出力したageの一年後のageが出力できる

 

==================================

 

テストの結果を管理するプログラムは配列、参照型変数を使う

 

public class Scores{

   public static void main(String[] args){

      int scoreA;

      int scoreB;

      int scoreC;

      int scoreD;

   }

}

 

scoreA,B,C,Dを準備して4人分の点数を入れる変数をそれぞれ準備しておく

なお、改行が多くなるが

      int scoreA,scoreB,scoreC,scoreD

といった形でカンマで区切ることも可能

自分が見やすい方で使い分けたらいいのかな

 

クラスなど30人以上必要な場合などは並べてしまった方がいいかも

これが所謂配列らしい?

 

public class Scores{

   public static void main(String[] args){

      int[] scores;

   }

}

 

int[]のように変数型の後ろに[]がついている場合は、その変数型の配列という意味になる

scoresと複数形になっているのは(配列であること=)複数あることを示すため

配列の場合は初期化でいくつの要素を入れるか入力する必要がある

あとで足していく~はできないので先に個数が判明している場合のみ使用可能!

 

int[] scores;

scores=new int[4];

 

newは演算子の一種 大事

新しく作るものとしての意味?

これで変数scoresの初期化と中に入る要素の数が決定する

 

それぞれの変数に何の値も入れてないけど、「new」のおかげですべての要素は0が代入されている

0が入ったint scoresが4つ準備されているということ

 

int[] scores=new int[4]

 

と、宣言と初期化を一緒にすることも可能

【int型の変数を4つ作って、それをscoresに代入していく。配列の要素(値:50,70,85,100)ではなく、その場所を示す値(ABCD)が配列変数scoresに代入される。

変数の中に値そのものではなく、値を入れた箱の場所を示す参照値が入る。=参照型変数という】

 

 

それぞれに代入する値を設定していく

 

int[] scores=new int[4]

 

scores[0]=50;

scores[1]=70;

scores[2]=85;

scores[3]=100;

 

配列変数名[通し番号]←の形式をとる

注意:通し番号は0から始まる!1から始まらない!

scores[4]といれても、これは5番目の要素への代入となってエラーをはく

つまり通し番号は要素数-1までとなる

 

int[] scores;

scores=new int[]{50,70,85,100};

 

new int[]の後ろに{}で要素の順番を,で区切って書く方法もある

注意:この場合要素の個数としての[4]は書いてはいけない

{}内にある要素の個数がそのまま配列の要素数となる

4人分の点数を入力するが1人休んでいるので要素として5人分あるといった使い方はできない

その場合は new int[5] 箱の個数を定義する形式をとる必要がある

 

この省略形は

int[] scores;

scores={50,70,85,100};

上記の形まで省略することは一応可能ではある

見返しで分かりにくくなるので理解しきるまでは避けた方が無難

 

以下同一内容

------------------------------------------

int[] scores=new int[4]

 

scores[0]=50;

scores[1]=70;

scores[2]=85;

scores[3]=100;

 

------------------------------------------

 

int[] scores=new int{50,70,85,100};

 

------------------------------------------

 

出力はいつもの

System.out.println{"Aさんの点数:"+scores[0]+"点"};

Bさんはscores[1]と[]の中を変えていくのみ

 

注意:[]をつける場所が場合によって変わる 3パターン!

new int[4]:newする時は変数型の後ろ

scores[0]:通し番号を入れるときは変数名の後ろ

int[] scores または int scores[]:変数名の宣言はどちらでも可能

 

 

public class Test2{
     public static void main(String[] args){
          int[] a = new int[]{1,2,3};//①
          int[] b = a;
          b[0] = 5;
          System.out.println(a[0]);

          int c = 1;//②
          int d = c;
          d = 5;
          System.out.println(c);

     }
}

 

例題

①答えは5になってる

int配列aを宣言して、その要素は1,2,3

int配列bを宣言して、そこに配列変数aを代入している

aには3つの箱とそれぞれに入った値が代入されていて

それを代入されたbも同じ数の箱を持っている

bの[0]に値としての5を代入している

これはaが持っている配列の[0]に5を代入しているのと同じ?ここがわからない

b[0]=5までの2行はつまり

int[] a = int[] b =new int[]{1,2,3}ということ?

これにb[0]=5が代入されることで

int[] a = int[] b =new int[]{5,2,3}となるから

a[0]は5になるということ?

 

②答えは1になってる

int変数cを宣言して、そこに値1を代入

int変数dを宣言して、そこに変数c(=1)を代入

ここまでがint c = int d = 1?

dには値5を代入

これによってint c = 1とint d = 5になる?

なので答えが1になっているのかな

 

テストその2

 

public class Test2{

   public static void main(String[] args){

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

      System.out.println(a);

   }

}

 

配列変数aをそのまま出力した場合

答えは [I@36baf30c

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

これでint変数が3種作られていることが決まっているが、aには値が代入されていない

参照先の場所が[I@36baf30cとして出力されている

==================================

 

参照型と値型(基本データ型)の違いで上記の違いが出ているらしい

ならその違いってなんだ?

 

値型(基本データ型)は

boolean byte char short int float long double 8種類

よくわからん!!!

 

==================================

 

Stringはクラス型変数というものだから頭文字が大文字になってる

String型の変数

正確には「java.lang.String」と書くが、「String」だけで通じるため不要

 

Stringはクラス型変数 つまりオブジェクトであり、オブジェクトを作るときにはnew演算子インスタンス化する必要がある(わからんけどこう書いてる)

String s = new String("あ い う え お");

↑は二度手間

""で囲われた文字列は「文字列リテラル」と呼ばれる

文字列リテラルである時点でコンパイラはオブジェクトとして処理しているので

String s = ("あ い う え お")

これだけで正解となる

String型の変数にStringオブジェクト(文字列リテラル)の参照値を代入している。

 

注意 Stringクラスの文字列は基本的に書き換えることができない

Strng s =”あいうえお”;

s="かきくけこ";

この場合変化しているのは変数sであって、Stringオブジェクトが持つ文字列自体は変化していない

????????

 

==================================

 

for文

 

public class PowerOfTwo{
    public static void main(String args){
        int answer = 1;

            answer = answer*2;
            answer = answer*2;
            answer = answer*2;
            answer = answer*2;
            answer = answer*2;

        System.out.print("2の5乗は、");
        System.out.println(answer);
    }
}

 

変数answerを2倍し続けている(5回)

この5回繰り返している部分を簡略化するのがfor文

{answer=answer*2;}を5回繰り返すという書き方が可能

 

 

for(初期設定;実行条件;継続処理){

     ブロック

}

 

()内の処理がどうなっているか↓

 

(int i=0;実行条件;継続処理)

int変数iを宣言して、そこに0を代入(変数名はなんでもいい、カウントとしての使用のみなら「i」を使いことが多い)

変数iは繰り返し回数をカウントするために使う

 

(int i=0);i<5;継続処理)

実行条件はi<5 この条件がtrueであればブロック内が実行される

初期設定ではiは「0」になっているので、この場合「i<5」はtrue

これによって一回目の2倍が実行される

 

(int i=0 ; i<5 ; i++ )

継続処理=ブロックの中を実行した「後」で処理される

++=インクリメント 1増やすときに使用

初期設定で0だったiが++されて1になる

2週目以降は++されていった数値が使用されていく

0,1,2,3,4と増えていき、5週目の継続処理でi=6となるので

6週目の実行条件i<5を満たすことが出来なくなりfalseとなるのでfor文の繰り返しが終了する

 

(int i=1 ; i<=5 ; i++)

上記の書き方でも同様の処理となる

for文を使って書き換えた形は以下

 

public class PowerOfTwo{
    public static void main(String args){
        int n=5;
        int answer = 1;

        for(int i=0;i<n;i++){
            answer=answer*2;
    }

        System.out.print("2の"+n+"乗は、");
        System.out.println(answer);
    }
}

 

新しく変数nを定義して、任意の累乗が計算されるようにしている

for()内のi<n部書き換え忘れがないように注意

また、int型の変数は2の31乗-1までしか入らない

正確な値が出るのは30乗まで 31乗した場合は-2147483648となる

この数値はArkでオーバーフローが出る値と近い、もしくは同じなので

Arkにおいて交配変異の処理にはint型変数が使われているのかもしれない

 

for文は配列を回すのに非常に有用なもの

 

==================================

 

配列、参照型の時に作ったScoresクラスでfor文を使ったらどうなるのか

~さんの点数はscores点を書き連ねていた