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

このQ&Aのポイント
  • Javaの細かい仕様を教えていただけませんか?プログラミング言語の経験があり、C++などとの比較をしたいです。
  • Javaの細かい仕様について、特にC++などとの比較を教えていただけませんか?
  • Javaの細かい仕様を学びたいです。プログラミング言語の経験があり、C++などとの比較も知りたいです。
回答を見る
  • ベストアンサー

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で タブが> 改行が曲がった矢印 で、全部の行に表示されるのですが テキストの色や背景色(白)の変更や、これらを非表示にする といったことは可能ですか?

  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

LongSecret
質問者

お礼

おおw Tacosanさん、Javaでもどうもありがとうございます♪ わっかりやす~w あとは13と15だけですね。 「パッケージ内」ってのは、分割(はまだ試してないのでこれから詳細を調べますが)とかのやり方調べて 試してみれば確認できそうな気がするので、やってみます。

その他の回答 (2)

  • root139
  • ベストアンサー率60% (488/809)
回答No.3

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

LongSecret
質問者

お礼

おお!出来ました! どうもありがとうございます♪ これで見慣れた感じになりましたw しかも、欲しいと思ったらいつでも簡単に戻せるっぽいですね。

LongSecret
質問者

補足

パッケージの確認できました。 プロジェクトの中に複数のパッケージが共存可能ということで、同じクラス数でもパッケージを増やせば、結果的にC#のinternalより若干強めな感じで使えるってことなんですね。 こんなに早く解決できるとは、驚きました。 全員ベストアンサーにしたい気持ちですが システム上出来ないので 最も多くの疑問に答えてくださったTacosanさんの回答をベストアンサーとさせていただきます。 しかし、みなさんには本当に感謝します。 kmeeさんもroot139さんも、どうもありがとうございました♪

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

あまり「C++だと..」って考えない方がいいと思います。 例えば(7) 0は数値の零であって、「無いことを表わすオブジェクト」であるnullとは全く別の次元になります。 なので「nullの意味で0を使う」という考え自体がJavaでは不適切です。 他のも、Javaの参考書や解説サイト、個人のブログなどで解説されています。 中途半端にC++の知識をもとに理解しようとしないで、きちんとJavaの解説を見ればわかることです。 それを読んだ上で「C++とはここが違うんだ」って理解の助けにするのはいいと思いますが。 (15)はJavaとは関係無いですね。Eclipseのエディタの設定を変えてください。 私はむしろ編集記号が見える方がありがたいですが。全角空白とかわかりますから。

LongSecret
質問者

お礼

ご回答ありがとうございます♪ >あまり「C++だと..」って考えない方がいいと思います。 う~ん、それはどうでしょう? この考え方で行って、(たぶん)C#は1週間程度でおおよその全体像はつかむに至れたと思いますから、あながち間違ってないと思います。うん、たぶん。 >「nullの意味で0を使う」という考え自体がJavaでは不適切です。 どうも、そこが分かれば十分です。 >他のも、Javaの参考書や解説サイト、個人のブログなどで解説されています。 駆け足ではありますが すでに百ページ程度は確認済みです サイトやブログの情報や、自分の理解が確実であるかという保証にはなりません。 「const参照の機能ねぇのか?」→端から端まで調べて見つけるより知ってる人に聞いた方が確実だと思います。 違いが分かれば、自分が行ってるC++のプログラミング手法をどう変形させればよさそうか という、最短コースで実用レベルに到達できます。 >(15)はJavaとは関係無いですね。Eclipseのエディタの設定を変えてください。 私はむしろ編集記号が見える方がありがたいですが。全角空白とかわかりますから。 色々触ってみたのですが、見つけれていません。 どこいじれば変えれますかね? せめてタブの「>」と改行の矢印だけは、消せるなら消したいですが。

関連するQ&A

  • javaのことで

    ---MainPanel.java--- import java.awt.Dimension; import java.awt.Graphics; import java.event.MouseEvent; import java.event.MouseListener; import javax.swing.JPanel; import java.util.Random; public class MainPanel extends JPanel implements MouseListener { public static final int WIDTH = 640; public static final int HEIGHT = 480; private static final int NUM_FILE = 4; private File[] file; private int prev; public MainPanel() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); file = new File[NUM_FILE]; for (int i = 0; i < NUM_FILE; i++) { file[i] = new File(i, this); } select(); addMouseListener(this); } private void clear() { for (int i = 0; i < NUM_FILE; i++) { file[i].delete(); } } private boolean check(int a, int b) { return a == b || a == prev || b == prev; } private void select() { Random rand = new Random(); int a, b; do { a = rand.nextInt(NUM_FILE); b = rand.nextInt(NUM_FILE); } while (check(a, b)); file[a].set(0, 0); file[b].set(file[a].getX() + file[a].getWith() + File.SPACE, 0); } public void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < NUM_FILE; i++) { if (file[i].isSelected()) { file[i].draw(g); } g.drawString("ファイル" + (i + 1) + " … " + file[i].getCnt(), 0, HEIGHT * 3 / 4 + i * 15); } } public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); for (int i = 0; i < NUM_FILE; i++) { if (file[i].isSelected()) { // 表示されていて // 画像内なら if (x > file[i].getX() && x < file[i].getX() + file[i].getWidth() && y < file[i].getY() && y > file[i].getY() + file[i].getHeight()) { file[i].count(); prev = i; clear(); select(); break; } } } repaint(); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } } フレームを用意してMainPanelを付加し,pack();してください.

  • コンパイラのバグ?それとも

    下のようなコードを書いて、たとえば java PossibleCompilerMalfunction Hello のように実行すると、 Hello と表示されることを期待していたのですが、 null と表示されてしまいます。 (JDK1.5を使っています) final String t = args[0]; の部分を final String t = "Hello"; のように書き換えると、 Hello と表示されます。 つまり、コンパイル時に「t」の値が決まっていなければ nullになってしまうようです。 これってコンパイラのバグでしょうか。 あるいは私の考えに間違いがあるのでしたら、 指摘していただけるとありがたいです。 public class PossibleCompilerMalfunction { public static void main(String[] args) { final String t = args[0]; MyClass mc = new MyClass() { void foo() { System.out.println(t); } }; } static abstract class MyClass { MyClass() { foo(); } abstract void foo(); } }

    • ベストアンサー
    • Java
  • JAVAの継承について

    JavaでクラスA,B,Cがあり、A,BはクラスCを継承しています。 この時にAのインスタンスを生成しCにある変数に値を設定します。 この設定した情報をBのインスタンスに一気に設定することは可能でしょうか? やりたいこととしてはAに設定した情報をBにコピーするようなイメージです。 すべてのsetterを呼びだして設定するのが面倒なので。 例)構文的に間違ってるかもしれませんがやりたいことは以下のような感じです。 A a = new A(); a.setStr("aaa"); a.setInt(5); B b = new B(); b.setStr(a.getStr()); b.setInt(a.getInt(); class A extends C{} class B extends C{} class C {  int x = 0;  String str = "";  private String setStr(String str){this.str=str;}  private String setInt(int i){this.x=i;}  private String getInt(){return this.x;}  private String getStr(){return this.str;} }

    • ベストアンサー
    • Java
  • Javaのスレッドに関して質問です

    Assistantクラスを使い待機状態と再開を確認できるプログラムの作成 loafとrestartメソッドを設ける workメソッドが呼ばれる度loafを呼び出す Managerクラスを定義 checkメソッドを設け、Assistantをcheckし続ける loaf状態ならrestartさせる (Managerクラスはデーモンスレッド) ということなんですが、いまいちうまくいきません さぼっても復帰してくれません public class Assistant implements Runnable { private String name; private Chore c; public Assistant(String name, Chore c) { this.name = name; this.c = c; } public void run() { work(); } public void work() { while (true) { synchronized (c) { if (c.doEnd()) break; System.out.println(name + " : " + c.digest()); loaf(); } } } public synchronized void loaf() { try { c.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void restart() { c.notify(); } } public class Chore { private String name; private int step; private int id; public Chore(String name) { this.name = name; this.step = this.name.length(); this.id = 0; } public synchronized String digest() { String message = "" + id + name.charAt(id); try { Thread.sleep(500); } catch (InterruptedException ie) { } id++; return message; } public synchronized boolean doEnd() { return id >= step; } } public class Manager extends Thread { private String name; private Assistant a; public Manager(String name) { this.name = name; } public void run() { check(); } public void check() { a.restart(); } } public class Test { public static void main(String[] args) { Chore[] ch = { new Chore("掃除"), new Chore("プリント印刷"), new Chore("出欠データ入力") }; Assistant[] a = { new Assistant("あ", ch[0]), new Assistant("\tい", ch[1]), new Assistant("\t\tう", ch[2] }; Thread[] t = new Thread[a.length]; for (int i = 0; i < t.length; i++) { t[i] = new Thread(a[i]); } for (int i = 0; i < t.length; i++) { t[i].start(); } Manager m = new Manager("監査"); m.setDaemon(true); m.start(); for (int i = 0; i < t.length; i++) { try { t[i].join(); } catch( InterruptedException ie ) { } } }

    • ベストアンサー
    • Java
  • java applet

    import java. applet.*; import java. awt. Button; import java. awt. Label; import java. awt. TextField; import java. awt. event.*; public class 1120 extends Applet implements ActionListener { private TextField box1 = new TextField(5); private TextField box2 = new TextField(5); private TextField box3 = new TextField(5); private Label moji1 = new Label(" と "); private Label moji2 = new Label(" の和は "); private Label moji3 = new Label(" である。 "); private Button ok = new Button("OK"); public void init() { resize( 320 , 240); add( box1 ); add( moji1 ); add( box2 ); add( moji2 ); add( box3 ); add( moji3 ); add( ok ); ok.addActionListener( this ); } public void actionPerformed( ActionEvent e ) { int i=0 ,j =0 , k; String t1 = box1.getText(); String t2 = box2.getText(); i = Integer.parseInt( t1 ); j = Integer.parseInt( t2 ); k = i + j; String s = Integer.toString( k ); box3. setText( s ); } } //上記のプログラムを書いたのですが、なぜかエラーが出てしまいます。勿論、自分でも見直しましたが、その理由がわかりませんでした。知識のある方、ご回答の方お願いします。

  • javaプログラム 合ってるかお願いします

    プログラムは非常に苦手なため合ってないと思いますが、合ってないのは何が正解かを教えてください。 よろしくお願いします 1 ローカル変数を全て答えよ args,num 2 インスタンス変数を全て答えよ num 3 インスタンスメソッド名を答えよ Example2 4インスタンスメソッドを呼び出している行 public class Example2{ int num; public static viod main(String[] args){ Example2 ex2 = new Example2(5); int a = ex2.getNum(); System.out.println(a); } Example2(int num){ this.num=num; } int getNum(){ return this.num; } }

    • ベストアンサー
    • Java
  • java 継承

    こんにちは。 javaの問題なのですが、問題文が理解できなかったので質問させていただきます。 問題文 Ex54で作成したRectangleクラスを継承するPlaceRectangleクラスを作成する Ex54 import java.io.*; class Rectangle{ private int width; private int height; public Rectangle(){ width=0; height=0; } public Rectangle(int w, int h){ width=w; height=h; } public int getArea(){ return width*height; } } class Ex54{ public static void main(String args[])throws IOException{ BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); int num=0; while(num < 2){ System.out.print(">"); String wid = br.readLine(); System.out.print(">"); String hei = br.readLine(); int num1 = Integer.parseInt(wid); int num2 = Integer.parseInt(hei); Rectangle rectangle1 = new Rectangle(num1, num2); System.out.println("インスタンスr" + (num+1) + "の面積は" + rectangle1.getArea()); num++; } } } --------------------------------------------------------------- PlacedRectangleクラス 四角形の位置をx座標y座標で表す。 長方形の左端を示しx座標は右に大きくy軸は下に大きくなる。 ・次の三つのコンストラクタを持つ (1)引数なし (2)位置の引数付き (3)位置と大きさの引数付き いづれのコンストラクタも位置のセットはsetLocationメソッドを実行する 大きさのセットはスーパークラスのコンストラクタを呼ぶ (コンストラクタで値を設定しているのになぜ再設定(位置のセット、大きさのセット)する必要があるのか分かりません。) ・setLocationメソッドは位置をセットする mainメソッドから次の操作をする 1引数無しでPalacedRectangleのインスタンスaを作成 2引数12と34でPlacedRectangleのインスタンスbを作成 3引数31と41と59と26でPlacedRectangleのインスタンスcを作成 1、2、3ともそれぞれのインスタンスの位置と面積を表示する 実行例 インスタンスaの面積は1534 位置は(12,13)です。 UML図 PlacedRectangle ----------------- -x:int -y:int ----------------- +PlacedRectangle() +PlacedRectangle(x:int,y:int) +PlacedRectangle(x:int,y:int,width:int,height:int) +setLocation(x:int,y:int):void 「疑問点」 コンストラクタで値を設定しているのになぜ再設定(位置のセット、大きさのセット)する必要があるのか分かりません。 main文のwhile(num < 2){というところをスッキリさせたい(処理が2回しかないため)何かよい方法はないでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • java setterとgetterについて

    データをセットしたファイルとは別のファイルからゲットしたいの ですが、できるのでしょうか? できるのでしたら、方法を教えてください。 具体的には下記のような感じです。 (かなり端折っている&あまり理解できていないので  おかしいsrcかもしれませんが、  やりたいことは、A.javaでセットした値をB.javaでゲットしたい  のです・・・。) 宜しくお願いいたします。 ■Data.java public class Data{   private String mojiData;   public Data(String _mojiData){     mojiData = _mojiData;   }   public void setMojiData(String _mojidata){     mojiData = _mojiData;   }   public void getMojiData(){     return mojiData;   } } ■A.java public class A extend JApplet{   public void init(){     Data[] data = new Data[2];     param[0] = a;     param[1] = i;     for(int i=0; i<2; i++){       data[i] = new Data("");       data[i].setMojiData(param);     }   } } ■B.java public class B extend JApplet{   String strData = new String[2];   public void ren(){     Data[] data;     for(int i=0; i<2; i++){       String strData[i] = data[i].getMojiData();     }   } }

    • ベストアンサー
    • Java
  • javaのprivateって?

    privateの必要性がいまいちわからなくて困ってます。 class Car{ private int num; private double gas; public void setNumGas(int n, double g){ num=n; gas=g; ・・・・・・・ このようなプログラムがあります。 変数をprivateにして、下のメソッドでnの値をnumに格納してします。 ここで変数をprivateにする意味ってあるんですか? 本には、勝手な値(-10など)を代入させないためと書いてあります。 これっておかしくないですか? 変数をprivateにしてもメソッドに「-10」を引数として渡したら余裕で格納できるじゃないですか。 代入させないためと書いてあるのに格納できるって・・・・矛盾してるような気がします。 ここでprivateにする意味がわかりません。 誰か教えてください。

  • オペレータ定義について

    すみません、オペレータ定義について教えてください。 ■以下のようなクラスに、[] が定義されていて、 class String { public:       ・       ・ (メンバ関数がいくつかあり)       ・       // num 番目の文字を返す       char operator[](int num) const;       char& operator[](int num); private:       char* string; }; ■関数はこのように書かれていて、 char String::operator[](int num) const {     // 文字列の num 番目の文字を返す 1     return string[num]; } char& String::operator[](int num) {      // 文字列の num 番目の文字を返す 2      return string[num]; } ■これを →[] main() から使うにはどのようにしたらいいのでしょうか?

専門家に質問してみよう