こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Javaの細かい仕様を教えていただけませんか?

ずっと前にちょろっと触ってJavaは一端離れていましたが
仕様を細かく確認してみたくなったので、駆け足で先ほどまた触れてみました。

なお、それぞれ触れた時間はだいぶ違いますが、プログラミング言語に関してはC、C++、C++/CLI、C#、HLSL、PHPは経験があります。(アセンブリはほんの少しだけ読める程度)

なのでそれら(とくにC++)との比較を教えていただけると早く理解が出来そうで
また、かなり多くの質問があります(だいたいは基本的なことでしょう)が、全部でなくとも、一部でもいいので教えていただけると助かります。

ためしに以下のようなコードを書いてみました。

class MySamplePrint {

private static interface PrintIF {
void Print(); //(1)
}

private static final class MyClass1<T> implements PrintIF {

private final class Nest1{ private int num = 0;}
private final Nest1 n = new Nest1(); //(2)、(3)
private final T data;

MyClass1( T data_, int num_ ){ //(4)
data = data_;
n.num = num_;
}


MyClass1( final T data_ ){ data = data_; } //(5)
//MyClass1(){ this((T)0); } //(6)、(7)

//(8)
public void Print(){
System.out.println(data);
System.out.println(n.num);
}
}

public static void main(String[] arg){

PrintIF a = new MyClass1<Integer>(123); //(9)
a.Print();

final MyClass1 b = new MyClass1("abc"); //(10)
a = b;
a.Print();

a = new MyClass1<String>("def",234);
a.Print();

int i = 0;
{
//int i; //(11)
int x = 0;
}
int x = 1;

//(12)
final PrintIF c = new MyClass1<String>("def",234);
c.Print();

}

}


結果
123
0
abc
0
def
234
def
234



(1) C++ でいうconstメンバ関数はJavaにもないですか?(可能であればvoid Print() const;のようなものを書きたい)

(2)コンストラクタと、このようにメンバの宣言場所でついでに 「型 変数 = 何々;」については、どっちが先かとか明確な順番は規格上定義されているのでしょうか?

(3)メンバ変数にも、このようにfinalを付け、コンストラクタ(か 「型 変数 = 何々;」)で一度だけ値を代入する、といったことが、試したら出来ましたが、これは仕様上普通に可能って事になっていますか?

(4)C++でいう、int num_ = 0など、書かなかった場合それになる、というデフォルト引数というものは、Javaにもないんでしょうか?(つまり、呼び出し側で同じような書き方をしたければこのようにオーバーロードを使う?)

(5)ローカル変数同様、引数にも普通にfinalを指定可能…?

(6)C#ではC++の初期化子リストっぽく MyClass1() : this(何々){ } とか言う書き方になるかと思いますが、Javaでは専ら{}内にのみ記述(this(何々)だったら一行目)でしょうか?

(7)この行はコメントアウトすると
「int から T へキャストすることはできません」
とエラーになります。
んでも(T)""にすると一応通ります。
String型などと整数の0(nullを意図してほしい)は互換性がないのでしょうか

(8)C++やC#のoverrideのようにオーバーライドを明示的に示す方法(や、C#のnewに匹敵するものとか)はありませんか?


(9)<int>はできませんでした。ジェネリックスに指定できる型にはどういう制限があるのでしょうか?

(10)警告は出ましたが、<String>を省略しても通ってしまいました。これは興味本位で、実際は警告も出るので指定はすると思いますが、これは仕様ですか?

(11)この場合、xは可ですがiはダメでした。つまり、CやC++と違い、スコープがより狭い範囲に変わっても「それまでに、より広いスコープで宣言されていた名前」とかぶる変数名の変数は宣言できない、ということでしょうか?

(12)C++的には、このcは参照(というよりポインタに近い)と考えて、この場合finalはc自体の変更を阻止していますが、参照先の内容は変更可能に思います。
CやC++的には
const PrintIF* c = ~
ではなく
PrintIF* const c = ~
と同じ意味

出来れば
const PrintIF* c = ~

const PrintIF* const c = ~

といったことも可能だといいのですが、Javaでは仕様上、それは無理、でしょうか?




その他、コード以外で

(13)アクセス修飾子の指定を書かないと、Javaでは同一パッケージ内で参照可能、ということですが、この「パッケージ内」というのは、これはC#でいうinternalのような意味あいになる、ということでしょうか?

(14)Javaでは非staticなメソッドは全て、C++でいうvirtualに自動的になる、ということでしょうか?(逆に言うと明示的な、virtualに相当する修飾子がない?)

(15)Eclipseで
タブが>
改行が曲がった矢印
で、全部の行に表示されるのですが

テキストの色や背景色(白)の変更や、これらを非表示にする
といったことは可能ですか?

投稿日時 - 2012-03-03 19:13:33

QNo.7340337

困ってます

質問者が選んだベストアンサー

C# は使っていないので簡単なところだけ:
(1) ないです.
(2) あたりまえだけど「初期化子→コンストラクタ」の順.
(3) できます.
(4) ないです. オーバーロードしてください.
(5) できます.
(6) {...} に書いてください.
(7) あるわけがないです.
(8) ありません.
(9) Object を基底に持たないとダメ.
(10) ジェネリックス導入以前との互換性のための仕様.
(11) そういうことです.
(12) 無理.
飛んで (14) そう (virtual でないインスタンスメソッドは作れない).

と, Java SE 7 の言語仕様も参照しながら書いてみる.

投稿日時 - 2012-03-04 00:06:58

お礼

おおw
Tacosanさん、Javaでもどうもありがとうございます♪

わっかりやす~w

あとは13と15だけですね。

「パッケージ内」ってのは、分割(はまだ試してないのでこれから詳細を調べますが)とかのやり方調べて
試してみれば確認できそうな気がするので、やってみます。

投稿日時 - 2012-03-04 00:36:30

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

(15)ですが、その形式はおそらく JStyle でしょう。
メニューの [ウィンドウ] → [設定] → [一般] → [JStyle] で全てのチェックを外せば消えるかと。

投稿日時 - 2012-03-04 01:08:07

補足

パッケージの確認できました。

プロジェクトの中に複数のパッケージが共存可能ということで、同じクラス数でもパッケージを増やせば、結果的にC#のinternalより若干強めな感じで使えるってことなんですね。

こんなに早く解決できるとは、驚きました。

全員ベストアンサーにしたい気持ちですが
システム上出来ないので
最も多くの疑問に答えてくださったTacosanさんの回答をベストアンサーとさせていただきます。

しかし、みなさんには本当に感謝します。

kmeeさんもroot139さんも、どうもありがとうございました♪

投稿日時 - 2012-03-04 01:33:30

お礼

おお!出来ました!
どうもありがとうございます♪

これで見慣れた感じになりましたw

しかも、欲しいと思ったらいつでも簡単に戻せるっぽいですね。

投稿日時 - 2012-03-04 01:19:12

ANo.1

あまり「C++だと..」って考えない方がいいと思います。

例えば(7)
0は数値の零であって、「無いことを表わすオブジェクト」であるnullとは全く別の次元になります。
なので「nullの意味で0を使う」という考え自体がJavaでは不適切です。


他のも、Javaの参考書や解説サイト、個人のブログなどで解説されています。
中途半端にC++の知識をもとに理解しようとしないで、きちんとJavaの解説を見ればわかることです。
それを読んだ上で「C++とはここが違うんだ」って理解の助けにするのはいいと思いますが。

(15)はJavaとは関係無いですね。Eclipseのエディタの設定を変えてください。
私はむしろ編集記号が見える方がありがたいですが。全角空白とかわかりますから。

投稿日時 - 2012-03-03 23:47:38

お礼

ご回答ありがとうございます♪

>あまり「C++だと..」って考えない方がいいと思います。

う~ん、それはどうでしょう?
この考え方で行って、(たぶん)C#は1週間程度でおおよその全体像はつかむに至れたと思いますから、あながち間違ってないと思います。うん、たぶん。

>「nullの意味で0を使う」という考え自体がJavaでは不適切です。

どうも、そこが分かれば十分です。

>他のも、Javaの参考書や解説サイト、個人のブログなどで解説されています。

駆け足ではありますが
すでに百ページ程度は確認済みです

サイトやブログの情報や、自分の理解が確実であるかという保証にはなりません。
「const参照の機能ねぇのか?」→端から端まで調べて見つけるより知ってる人に聞いた方が確実だと思います。
違いが分かれば、自分が行ってるC++のプログラミング手法をどう変形させればよさそうか
という、最短コースで実用レベルに到達できます。


>(15)はJavaとは関係無いですね。Eclipseのエディタの設定を変えてください。
私はむしろ編集記号が見える方がありがたいですが。全角空白とかわかりますから。

色々触ってみたのですが、見つけれていません。
どこいじれば変えれますかね?
せめてタブの「>」と改行の矢印だけは、消せるなら消したいですが。

投稿日時 - 2012-03-04 00:31:35

あなたにオススメの質問