【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください

Javaでfinal修飾子があると学びました.
・メソッドはオーバーライドできない
・変数は値の変更ができない
・クラスは継承できない
この3点を実現することが可能ですよね?
#間違っている・他にもあるなら教えてください.

私はfinalを引数につけてみました.

public class Test {
  public static void main(String[] args) {
     char[] s = {'s','a','t','o'};
     System.out.println(s);
     modify(s);
     // finalのはずが変更されている
     System.out.println(s);

     Integer i = 3;
     Integer j = 6;

     swap(i, j);

     System.out.println(i + ":" + j);

     Foo f1, f2;
     f1 = new Foo();
     f2 = new Foo();

     f1.i = 3;
     f2.i = 6;

     swap(f1, f2);

     System.out.println(f1.i + ":" + f2.i);
   }
   static void modify(final char[] s) {
     s[0] = 'k';
   }
   static void swap(Integer i, Integer j) {
     Integer temp;
     temp = i;
     i = j;
     j = temp;
   }
   static void swap(Foo f1, Foo f2) {
     int temp;
     temp = f1.i;
     f1.i = f2.i;
     f2.i = temp;
   }
}

class Foo {
   int i;
}

modify関数でfinal修飾子をつけるとsatoがkatoにならないと予想していました.
ですが,実際にはコンパイルエラーにもならずsato→katoになりました.
final修飾子はC言語でいうところのchar * const c;でしょうか?
#ポインタの値は変更できないが,参照先の値は変更できるということですか?

あと,swap関数についても質問があります.
そもそもポインタがないので,基本型を実引数に与えるときはコピーされ,
参照型はコピーされないですよね?
なので,swap関数を2つ用意してみました.
Fooクラスのswap関数,Integerクラスのswap関数の2つです.
Fooクラスがうまく交換でき,Integerクラスが交換できない理由がわかりません.
#Integer temp;を使って参照値を交換していると思うのですが,違うのでしょうか?

A 回答 (2件)

Cをある程度ご存知なようなので.


参照は、ポインタをイメージすると、理解の助けになるでしょう。

> inal修飾子はC言語でいうところのchar * const c;でしょうか?

そうです。

> あと,swap関数についても質問があります

あなたのコードと同等のCのコードは、次のようになります。

   static void swap(Integer * i, Integer * j) {
     Integer * temp;
     temp = i;
     i = j;
     j = temp;
   }
   static void swap(Foo * f1, Foo * f2) {
     int temp;
     temp = f1->i;
     f1->i = f2->i;
     f2->i = temp;
   }
    • good
    • 0

>Integerクラスが交換できない理由がわかりません.



Integerクラスは immutable なので、値の変更はできません。

また swapは参照を別の変数に渡すだけで、また、Integer同士の代入は参照の
代入なので、結局、元のi, j が持つ参照は何も変わりません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報