staticメソッドの引数thisについて

このQ&Aのポイント
  • javaの『static メソッド』の中では、thisが使用できないようです
  • myclsFFTクラスの中のThread(this)の引数の代わりの記述方法はあるのか?
  • 本記事では、staticメソッドの中でthisを使用する代替手段について探求します
回答を見る
  • ベストアンサー

static methodの引数thisについて

javaの『static メソッド』の中では、thisが使用できないようです(再質問)。 毎度、お世話になります。 出来れば、下記のコードでthisの部分の変更をお教え頂けないでしょうか? 尚、この場合のthisは、myclsFFTクラスの中の、Thread(this)の引数と なっています(下記のコード参照)。 Q1) このthisに代わる記述、方法はありますか? static void start_threadFFT(int sw_curve){ ..... new Thread(this).start(); .... } 以上、宜しくお願い申し上げます。 ========================================== public class myclsFFT extends myDrawClass implements Runnable{ myclsFFT(){ } static void start_threadFFT(int sw_curve){ ..... new Thread(this).start(); .... } ...... } ==========================================

  • Java
  • 回答数6
  • ありがとう数1

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

classとは定義だけで実体がありません。 new演算子を使うことで、始めて実体ができます。 同じclassに幾つもnewを行うことができます。 すると、newの度に別々の実体が発生します。 この一つ一つをインスタンスと言います。 従って、クラス内のstatic属性でない変数は同じ 名前でもインスタンス毎に値が異なります。 thisとは現在の自分自身を指すインスタンスのことです。 staticは最初から唯一の実体が存在するという意味です。 従って、static属性の関数はインスタンスという観念が なく、class内のインスタンス変数(staticのない変数)は インスタンスを識別する方法が無いので扱えません。 インスタンス本体であるthisも当然ですが扱えません。 解決手段としてはこのstatic関数を呼び出すインスタンス関数が インスタンスを渡すことです。関数の引数でインスタンスを渡す ことは可能だからです。 void outfunc(int sw_curve) { //呼び出す側のインスタンス関数 start_threadFFT(sw_curve,this); } static void start_threadFFT(int sw_curve,myclsFFT xxx){ ..... new Thread(xxx).start(); .... }

bakabon_X
質問者

お礼

notnotさん以外は、有意義な回答でありました。 その内容はまだ十分把握していませんが、再度読み返してみます。 貴方の答え以外にも、良い回答があると思いますが、代表して ベストアンサーにさせて頂きます。 今後とも、宜しくお願いします。

その他の回答 (5)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.6

>私はjavaの初心者ですから、簡単明瞭に記述して頂かないと対応できません。 >つまり、コードの記述が出来ません。 では#4の回答のメソッド static void start_threadFFT(int sw_curve,myclsFFT xxx) を呼ぶとき第2引数は何を指定するつもりなんでしょうか。 myclsFFT.start_threadFFT(sw_curve, new myclsFFT()); としますか? ただ、これだとstaticメソッドにする意味がないです。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.5

>thisの替わりは、xxxx でした。 >xxxxの内容は差し控えますが、他の方から明快な回答をえました。 #4の回答なんでしょうけど、その意味はわかってるんでしょうか? 私はそれと同じ事、 http://okwave.jp/qa/q8917477.html の#1で書いてるんですけど。

bakabon_X
質問者

補足

wormholeさんへ notnotさんの下記の回答について私はコメントさせて頂きました。 『どこかもっと前の段階で方向が狂っていると思われますので、最初から考え直した方が良いです』 私はjavaの初心者ですから、簡単明瞭に記述して頂かないと対応できません。 つまり、コードの記述が出来ません。 既に、回答を得ましたのでその結果として、貴方の回答の意味は理解していますし、 そもそも、質問の趣旨が、そのものずばりの回答を得ることでした。 幾ら正しい解答でも、回答者に、的確、明確にわからないと質問者の目的は達成 されませんし、再質問もできません。 私は、簡単明瞭な回答を期待しています、ただ貴方の回答につきましては、感謝はしても、 批判や文句は言いません。 上記の、『何処かが狂っている』との回答があり、当方も多少気分が悪くしている次第です。 何度も申しますが、下記の回答に納得できない所がありますので、コメントの 投稿をした次第です。 『どこかもっと前の段階で方向が狂っていると思われますので、最初から考え直した方が良いです』 以上

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.3

>質問者が、無知であるとか、考え方が間違っている等の解答は、無意味です。 質問者にとって、最適なアドバイス(これこれの点について理解が足りないので勉強するべき)をしています。 「理解するつもりは無い。当面の答えだけ教えて」というのが質問者の情況ならおっしゃることもうなずけますが、デジタルライフカテゴリならともかく、ここは技術者向けのカテゴリなので、特に記述が無ければ質問者はIT技術者であると仮定して回答しています。 「理解するつもりは無い。当面の答えだけ教えて」ということであれば、質問文にその旨書いていただけると助かります。

bakabon_X
質問者

補足

notnot さま 私は、貴方の講釈を聞きたいのではありません。 書きましたように、thisについて質問しています。 『勉強しなさい』と言う様な、助言は、貴方が、私の質問に答えて初めて言えると思います。 『考えなおしなさい』と言う様な、全く無意味です。 今回の質問に関しましては、貴方の知識不足といわざるを得ません。 既に、私は正解を得ています。 貴方も相当な自信家の様ですから、回答をお願いします、その上で、再度 考えて、システムの批判、助言をお願いします。 以上、お気に障りましたら、お許しください。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.2

>出来れば、下記のコードでthisの部分の変更をお教え頂けないでしょうか? #1でも書かれいますが、thisとは何なのかstaticメソッドとは何なのか勉強しなおしましょう。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

スタティックメソッドとは何か、thisとは何かを理解していればこういう質問は出てこないはずです。 どこかもっと前の段階で方向が狂っていると思われますので、最初から考え直した方が良いです。

bakabon_X
質問者

補足

無意味な回答はやめましょう。 つまり、回答としましては、 yyyyであると明言すべきです。それが出来なけば、回答はしないほうが良いと思います。 質問者が、無知であるとか、考え方が間違っている等の解答は、無意味です。 thisの替わりは、xxxx でした。 xxxxの内容は差し控えますが、他の方から明快な回答をえました。

関連するQ&A

  • javaのstatic メソッドのthisについて

    javaの『static メソッド』の中では、thisが使用できないようです(下記のコード参照)。 毎度、お世話になります。 Q1) このthisに代わる記述、方法はありますか? static void start_threadFFT(int sw_curve){ ..... new Thread(this).start(); .... } 以上、宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • static 及びthisについて

    javaの勉強をしていて、下記のような簡単なプログラムを書きました。 interface Const{ int c1=85,c2=94,c3=72; } //コントロール&実装クラス public class TestInterface implements Const { void tsum(){ int total ; total = c1+c2+c3; System.out.println("Total : "+total); total = total/3; System.out.println("Average : " +total); } public static void main(String[] args) { this.tsum(); } } これについて2つ質問があります。 1.下から2行目this.tsum()でコンパイルエラーになりますが、理由がわかりません。 2.thisを使うのやめ、public static の前にコンストラクタ TestInterface obj = new TestInterface(); を追加し、 this.tsum()をobj.tsum() に変更したところ、obj.tsum()のところで、エラーになります。コンストラクタにstaticの修飾子をつけるとコンパイルされます。 どうして、staticをつけなければいけないのかわかりません。 基本的な質問で申し訳ございませんが、以上2点おわかりの方がいらっしゃいましたら、教えていただけないでしょうか。 よろしくおねがいします。

    • ベストアンサー
    • Java
  • コンパイルエラー(Threadオブジェクト化)

    Runnableを継承したNormalClassをThreadとしてオブジェクト化しようとしているのですが、コンパイルエラーが出現して困っています。どうすればいいでしょうか? 下記エラー参照 Main.java:1: NormalClass は abstract でなく、java.lang.Runnable 内の abstract メソッド run() をオーバーライドしません。 下記ソース class NormalClass implements Runnable{ } class Main extends Thread{ public static void main(String args[]){ test = new Thread(new NormalClass()); } }

    • ベストアンサー
    • Java
  • synchronized を施しているのに・・・

    java初心者です。宜しくお願い致します。 あるスレッドがsynchronizedのメソッドを実行すると、そのメソッドの仕事は連続したひとかたまりの処理として実行される、と習いました。 なるほど、と思ったのですが、 自分で次のようなコードを書いてみると、そのようになりません。 ならない時もある、と言ったほうが正確でしょう。 具体的には、 0 1 別の処理 2 や、 0 別の処理 1 2 となったりします。 ご面倒でしょうが、コードを書きますので、解析して解りやすく教えて頂けると嬉しく思います。 class MyRunnable10 implements Runnable{ public synchronized void run(){ for(int i=0 ; i<3 ; i++){ System.out.print(i + " "); } } } class MyRunnable20 implements Runnable{ public void run(){ System.out.print("別な処理"); } } public class Exec2 { public static void main(String[] args) { Runnable m = new MyRunnable10(); Runnable m2 = new MyRunnable20(); Thread t1 = new Thread(m,"A"); Thread t2 = new Thread(m2); t1.start(); t2.start(); } }

    • ベストアンサー
    • Java
  • Runnableのインスタンス化について

    下記のコードについてです。 Runnableがインスタンス化されていますが、 どうしてそれが可能なのかが分かりません。 分からない点は 1.Runnableはインタフェースであるから、本来、直接インスタンス化は不可能であるはず。 2.しかし、Runnableはクラスライブラリjava.langパッケージに含まれている。 だからインスタンス化は可能なのかもしれない。 3.あるいは、下記のコードではメソッド内の無名クラスであるから、「new Runnable(){」の 部分でスーパークラスとしてのRunnableを継承したサブクラスを生成しているのかもしれない。 アドバイスをよろしくお願い致します。 public class Main{ public static void main(String[]args){ Runnable task = new Runnable(){ public void run(){ System.out.println("run"); } }; Thread thread = new Thread(task){ public synchronized void start(){ System.out.println("start"); } }; thread.start(); } }

    • ベストアンサー
    • Java
  • Java言語のインタフェースについて

    Java言語を学習している者です。 インターフェースについて理解できずに困っております。 ここでは、Runnableインターフェースを例にとります。 (1)正しいコード public class ThreadTest implements Runnable { public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (1)のコードは正常に動きます。 (2)間違ったコード (implements Runnableを記述しなかった場合) public class ThreadTest{ public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (2)のコードでは、 Thread th = new Thread(ins); で、 コンストラクタ―Thread(ThreadTest)は未定義です。 とエラーが出てしまいます。 確かに未定義なのですが、(1)でも定義していないように思えます。 Runnableインターフェースの働きのお陰だと言うことはわかるのですが、どういった働きによるものなのかがわかりません。 インターフェースのについて、 ・インターフェースのフィールドは必ず定数。 ・インターフェースのメソッドは必ず抽象メソッド。 ・インターフェースはインスタンスを作ることが出来ない。 ・抽象メソッドは必ず実装しなければならない。 は理解しているつもりです。 今回の質問をするに当たって、 RunnableのAPI http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Runnable.html を見たのですが、それでも理由が分からないので質問致します。 もし宜しかったら、APIの見方についてもコメントして頂けるとありがたいです。 宜しくお願いします。

    • ベストアンサー
    • Java
  • NoSuchMethodErrorが解決できません。

    実行時エラーNoSuchMethodErrorが出て困っています。 どこを修正すればいいのでしょうか? class A implements Runnable{ int x; int y; public void run(){ for(int i = 0;i < 100;i++){ x++; y++; System.out.println("x="+x+"y="+y); } } } class B{ public static void main(String args[]){ new Thread(new A()).start(); new Thread(new A()).start(); } }

    • ベストアンサー
    • Java
  • private voidなメソッドはstatic コンテキストですか

    コンパイルエラーで、 「static コンテキストから参照することはできません」 と表示されます。 ソースにstaticという文字は有りません。 private voidなメソッドはstatic コンテキストですか? [Foo.java] import com.nttdocomo.ui.*; public class Foo extends IApplication {  public void start() {   Display.setCurrent(new MyPanel());  } } class MyPanel extends Panel {  private void e() {   Bar.DShow(Dialog.DIALOG_ERROR, "", "");  } } [Bar.java] import com.nttdocomo.ui.*; public class Bar {  public void DShow(int type, String title, String body) {   Dialog d = new Dialog(type, title);   d.setText(body);   d.show();  } }

    • ベストアンサー
    • Java
  • ThreadとRunnableのlogへの表示差異

    マルチスレッドでsleep()の時間を指定して動かすのを前提で、 Threadを継承した時は、時間通りに(リアルタイムで) eclipseのコンソールへ表示されるのですが、 Runnableをインプリメントしての動作では、 eclipseのコンソールに一瞬で表示されるのは何故でしょうか? public class MultiThread3 implements Runnable{ int time; MultiThread3(int time) { this.time = time; } public void run() { for(int i=0; i<5; i++) System.out.println("No."+i+":"+Thread.currentThread().getName()); try{ Thread.sleep(time); }catch (InterruptedException e) {} } } class MultiThreadTest3{ public static void main(String[] args) { MultiThread3 a = new MultiThread3(500); MultiThread3 b = new MultiThread3(700); MultiThread3 c = new MultiThread3(1100); Thread ta = new Thread(a); Thread tb = new Thread(b); Thread tc = new Thread(c); ta.setName("A"); tb.setName("\tB"); tc.setName("\t\tC"); ta.start(); tb.start(); tc.start(); } }

    • ベストアンサー
    • Java
  • Javaのメモリ・リークについて

    Javaのメモリ・リークについて 以下のコードはスレッド内で、無限ループをしています。 コンストラクタで呼び出し、ずっとこのままにしておいてもフリーズするか否かが知りたいです。 (jconsole.jarというツールがありますが、まだ理解に至っておりません。) ご存知の方がおられましたら教えてください。 よろしくお願いいたします。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class ActioneventRoopTest extends JFrame implements Runnable, ActionListener { JButton start = new JButton(); JButton change = new JButton("切り替え"); Boolean flag = true; public static void main(String[] args) { new ActioneventRoopTest(); } public ActioneventRoopTest() { change.addActionListener(this); start.addActionListener(this); this.add(change); this.pack(); this.setVisible(true); Thread thread = new Thread(this); thread.start(); } public void actionPerformed(ActionEvent e) { if (e.getSource() == change) { if (flag) { flag = false; } else if (!flag) { flag = true; } } } public void run() { while (true) { while (flag) { System.out.println("リンゴ"); } while (!flag) { System.out.println("ミカン"); } } } }

    • ベストアンサー
    • Java

専門家に質問してみよう