• ベストアンサー

インスタンス変数へのアクセスについて

理論的な質問ですが・・ public class pra extends JFrame{ JLabel myj; public pra(){ ~初期化 } public static void main(String args[]){ pra p=new pra(); p.myj.setText("ready"); *1 p.jlset(); } private void jlset(){ myj.setText("go"); *2 } } *1では変数myjにアクセスするのに、オブジェクト参照 変数p が必要ですが、*2では、必要ありません。 この違いがよくわかりません。理屈では*2でもpを つけるべきだと思いますが(p.myj)、これをつけると エラーになってしまいます。 なにかアドバイスお願いします。

noname#10667
noname#10667
  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

mainはstaticがついているから特殊なメソッドなのです。 クラスの中身で、staticがついているもの(変数・メソッド)は、中途半端な位置にいます。 「お客さん」といった感じです。 本来、staticがついているものは、同じクラスの中にある必要はないのです。 ただ、関係の深いデータや、よく使うメソッドをいっしょに記述すると便利なので、 staticという宣言によって、クラスの中に共存させています。 staticでないメソッドは、(staticでない)変数を自由に使えます。 メソッドの中でmyjとなっていたら、 「メソッドを呼びだされたときのオブジェクトにある 変数myj」を意味します。 ところが、mainはstaticがついているので、 クラスの中身を自由に使えません。 だから、他のクラスから使うときのようにする必要があります。 逆に、staticのつかない普通のメソッドでオブジェクトpとかあると、 「そのpはなんだ!? 宣言してないぞ?!」 となります。 (宣言はメソッドの中だけが有効期限なので、 メソッドを離れると宣言されていないことになります。 たとえmainから呼びだしたメソッドでも同じです) 上の説明でわかりにくかったらごめんなさい。 この質問はかなり本質的です。 これがわかるとオブジェクト指向が半分くらい理解できたことになります。

noname#10667
質問者

お礼

回答ありがとうございました。 非常に参考になりました(本はたくさんありますが こういう説明の仕方ははじめてでした)。 まだ完全には理解していませんが、これをきっかけに 理解できそうな気がします。

その他の回答 (2)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.3

staticなものとstaticでないものの違いについて、しっかりと理解しておくべきでしょう。

参考URL:
http://msugai.fc2web.com/java/static.html
noname#10667
質問者

お礼

回答ありがとうございます。 本当、JAVAのエラーはstatic関連ばっかりです。 参考URLは参考になりそうです。 またお願いします。

noname#17227
noname#17227
回答No.2

main メソッドは static がついているので、「クラスメソッド」です。jlset メソッドは、 static がついていないので「インスタンスメソッド」です。インスタンスメソッドはインスタンス変数にアクセスできます。 オブジェクト p は main メソッド内のローカル変数ですので、jltest() メソッドからアクセスすることはできません。 もし、 private void jlset() { pra p = new pra(); p.myj.setText("go"); } とした場合は、コンパイルエラーはでないはずです。ただし、この記述をした場合は、自分のインスタンス内の myj オブジェクトを操作しているわけではないので注意が必要です。 ・クラスメソッドとインスタンスメソッド ・クラス変数とインスタンス変数 ・スコープ これらについて学習した方がいいと思います。

noname#10667
質問者

お礼

回答ありがとうございました。 クラスメソッドとインスタンスメソッドについて、 今回の質問をきっかけにもう一度、よく 考えてみようと思います。

関連するQ&A

  • 配列に対してsetText()は使えないんでしょうか?

    こんにちは、いつもお世話になっております。 3つのラベルの配列に文字列を表示したいのですが 下記のコードをコンパイルし実行すると、 Exception in thread "main" java.lang.NullPointerException at txtest.main(txtest.java:16) というエラーが出てしまいます。(コンパイルはできる。) 「setText()」を「=new JLabel(right1)」という風に書き変えると 正しく、表示されるのですが、この方法は使いたくないのです。 何かよい方法ご存知でしたら、是非教えていただけますか? どうかよろしくお願いいたします。 import java.awt.*; import javax.swing.*; class txtest { public static void main(String[] args) { JFrame f=new JFrame(); JPanel p=new JPanel(); JLabel label[]=new JLabel[3]; label[0].setText("right1"); label[1].setText("right2"); label[2].setText("right3"); for(int i=0;i<=2;i++) { p.add(l[i]); } Container ct=f.getContentPane(); ct.add(p); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); } }

    • ベストアンサー
    • Java
  • actionListenerについて

    ど素人です 改行の関係でimportは省略してます labelにActionListenerが登録できないのですが、なぜでしょうか class test extends JFrame{ test() { getContentPane().setLayout(new FlowLayout()); JLabel label = new JLabel("てすと"); JButton b1 = new JButton("OK"); b1.addActionListener(label); getContentPane().add(b1); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("JButtonTest"); setSize(200, 100); setVisible(true); } public static void main(String[] args) { new test(); } } class LetLabel extends JLabel implements ActionListener{ public void LetLabe(){ } public void actionPerformed(ActionEvent ae){ } }

    • ベストアンサー
    • Java
  • 決められて時間が経過するとアラーム音を鳴らしたい

    swingで時計を作っているんですがラジオボタンで選択した時間が経過するとアラーム音がなるようにしたいのですが、どのようにしたらよいでしょうか? 時間を表示するところまでできたのですが、アラーム音についてはわからなくて。。どなたかお願いします! public class Clock extends JFrame implements ActionListener{ private JLabel jLabel = null; //アラームのラジオグループを作る ButtonGroup group1 = new ButtonGroup(); JMenuItem button1 = new JRadioButtonMenuItem("30分", false); JMenuItem button2 = new JRadioButtonMenuItem("1時間", false); JMenuItem button3 = new JRadioButtonMenuItem("1時間30分 ", false); JMenuItem button7 = new JRadioButtonMenuItem("設定解除", false); public static void main(String[] args) { public Clock() { AlarmAction alarmAction = new AlarmAction(); ~~省略~~ } private void initialize() { new Timer(30, this).start(); } private javax.swing.JPanel getJContentPane() { if(jContentPane == null) { jLabel = new JLabel("",JLabel.CENTER); ~~省略~~ } public void actionPerformed(ActionEvent e) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); jLabel.setText(sdf.format(new Date())); } //アラームのクラス class AlarmAction extends AbstractAction{ AlarmAction(){ } public void actionPerformed(ActionEvent e){ } }

  •  インスタンスの作る場合の型宣言

     インスタンスの作る場合の型宣言  今晩は、JAVA初心者です、宜しくお願いします。  下のようなプログラムを書いてやりました。 //JFrame_Test jf = new JFrame_Test(); JFrame jf = new JFrame_Test(); と書き変えてやってもエラーもなく、正常に同じ動作をします。  この両者は文法的にはどのように違うものなのでしょうか。  どうも両者は別の意味を持っているような気がして、色々と調べてみましたが、 よく分かりませんでした。  また、JFrame jf = new JFrame(); とかいても、正常に動作します。 この違いもよく理解出来ないのですが、  これは、JFrame_Testではなく、JFrameという親クラスのオブジェクトを作っ ているということでしょうか、以上宜しくお願いします。 ======================================================== public class JFrame_Test extends JFrame { JFrame_Test() { setSize(200,200); } public void paint(Graphics g) { super.paint(g); g.drawString("XYZ",50,50); } public static void main(String[] args) { JFrame jf = new JFrame_Test(); // JFrame_Test jf = new JFrame_Test(); jf.setVisible(true); } }

    • ベストアンサー
    • Java
  • Eclipseから実行すると画像が読み込まれない

    下記のコードをEclipseから実行すると画像が読み込まれないのですが、コマンドプロンプトから実行すると画像が読み込まれます。 コードが同じなのに不思議です…。 原因はどんなことが考えられるのでしょうか? class test extends JFrame{ public static void main(String args[]){ test frame = new test("タイトル"); frame.setVisible(true); } test(String title){ setTitle(title); setBounds(100, 100, 500, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); ImageIcon icon1 = new ImageIcon("img.jpg"); JLabel label1 = new JLabel(icon1); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • インスタンス変数について

    JAVA勉強中のものです。 インスタンス変数についてわからないのですが、 class Data{int d;} classSample{ public static void main(String[] args){ Data data1 =new Data(); Data data2 =new Data(); data1.d = 100; data2 = data1; data2.d = 200; System.out.println(data1.d); } } 実行すると200が表示されますが、new演算子によってできたオブジェクトの実体を参照する ID がdata1およびdata2に入るのは理解できるのですが、 インスタンス変数のdはメモリ上でどう設定されているかイメージがわきません。 わかる方どうぞ教えて下さい。

    • ベストアンサー
    • Java
  • JPanelで宣言したメソッドについて

    JPanelを継承したクラスで、引数をもらってその引数を表示するメソッドを作成します。そして別のJFrameを継承したクラスの中で、さきほど作成したメソッドを利用したいのですが、どうすればできるのでしょうか?そもそもこのやり方できちんと表示されるのでしょうか? ぜひともご教授のほど宜しくお願いします。 以下はプログラムになります。 import java.awt.*; import java.awt.event.*; import javax.swing.*; class Ptest extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("よろしく", 50, 50); } public void draw(String s) { Graphics g = getGraphics(); g.drawString(s, 100, 100); } } class Ftest extends JFrame { JLabel jlb; public Ftest() { setSize(350, 300); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); Container c = getContentPane(); Ptest p = new Ptest(); p.draw("yoroshiku"); c.add(p); p.setLayout(null); jlb = new JLabel("frame"); p.add(jlb); jlb.setBounds(70, 70, 50, 50); } } public class Test1 { public static void main(String[] args) { JFrame w = new Ftest(); w.show(); } }

    • ベストアンサー
    • Java
  • JavaSwingのファンクションキーのイベント

    JavaのSwingでファンクションキーのイベントをひろいたいの ですが、F10キーやF12キーで思うようにイベントをひろえま せん。 たとえば下のように書いて、フレームにフォーカスがあるときボ タンを押すとカウントが増えていくものを作ったとき、アルファベ ットやほかのFキーならスムーズにカウントされていくのにF10は 2回に1回しかカウントされず、F12だと途中で反応したりしなか ったりします。 この原因と対処法を知っているひとがいたら教えてください。 よろしくお願いします。 public class WindowTest extends JFrame implements KeyListener{ public static int intKeyPress =0; JLabel lbl = new JLabel("0"); public static void main(String[] args) { WindowTest w = new WindowTest(); } public WindowTest() { addKeyListener(this); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(320, 160); this.add(lbl); this.setLocationRelativeTo(null); this.setVisible(true); } @Override public void keyPressed(KeyEvent e) { lbl.setText(String.valueOf(intKeyPress++)); } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) {} }

    • ベストアンサー
    • Java
  • [C#]Public変数の使い方

    今までVBを使っており、C#は初心者です。 VBでは、各関数にまたがって使う変数は、 private Hensu as integer Sub Kansuu1() Hensu = 2 Call Kansuu2() End Sub Sub Kansuu2() MsgBox Hensu End Sub と宣言すれば、使えますが、C#でそのような使い方はできないのでしょうか? 変数Hensu3をMainとMain2双方で使いたいとき、 using System; namespace ns1 { static class Program { public string Hensu3; static void Main(string[] args) { ・・・ } static void Main2() { ・・・ } } } と書きましたが、ビルドエラーになります。

  •  static 参照するには??

     static 参照するには??  Java初心者です、宜しくお願いします。  下のようなプログラムを書きましたが、「Container gc = getContentPane();」 の箇所で、「型 JFrame の非 static メソッド getContentPane() を static 参照することはできません」とエラーが出ます。 意味がわかりません、またどのように変更してやればよいのでしょうか。 宜しくお願いします。  ======================================================================= class Canvas1 extends JFrame { public void paint(Graphics g) { g.drawRect(150, 150, 50, 50); } } public class SimpleDraw extends JFrame { public static void main(String[] args) { JFrame jf = new JFrame(); JPanel jp = new JPanel(); Container gc = getContentPane(); gc.add(jp); Canvas1 c = new Canvas1; jp.add(c); jf.add(jp); jf.setVisible(true); } }

    • ベストアンサー
    • Java