Javaでのstatic(1)【更新継続】——EclipseのNo enclosing instance of typeについて…

5986 ワード

No enclosing instance of type SomeClass is accessible. Must qualify the allocation with an enclosing instance of type SomeClass (e.g. x.new A() where x is an instance of SomeClass ).
どうやって見つけたの??
EclipseでJavaのAWT/Swingプログラムを記述するとき、public class MainFrame extends JFrameを記述し、メイン関数を1つ入れて次のように書きました.
public static void main(String args[])
{
    MainJFrame frmBase = new MainJFrame("Hello Swing");
    frmBase.setBackground(Color.white);
    frmBase.setVisible(true);
    frmBase.addWindowListener(new MainJWindowListener());    // 

つまり、メイン関数がウィンドウを作成した後も、frmBaseというJFrameウィンドウにウィンドウリスナー(class MainJWindowListener implements WindowListener)を追加し続けたいと思っています.このうちMainJWindowListenerMainFrameの内クラスです.そしてエラーが発生しました・・・
どうしてこんなことになったの??
まあ、実は結局mainstatic修飾が引き起こした災いだ.staticのメンバーも、クラスも、いわゆる「静的」とは「プログラム全体を共有する」という意味であることを知っています.率直に言って、staticのものは非常に「公正無私」です.もちろん、実は私はC#を書くことが多くて、Javaのルールについてまだよく知らないで、JavaはC#のようにpublic static class SomeClassを許可していないようで、Javaにとってもっと静的なメンバーについて討論しました.
大公無私な内容として、staticのメンバーの中で自分で臨時のオブジェクトを構築する以外に、直接引用したクラス、関数はあるオブジェクト特有のものではありません.
あるオブジェクトに特有のものではありませんか??しかし、クラスに定義されている属性である以上、クラスのすべてのオブジェクトにはこの属性があるのではないでしょうか.
いいえ、ここで言う「特有」はそういう意味ではありません.言葉を変えたほうがいいかもしれません.対象の「個性」の属性です.
個性化......しかしこれは何ですか......
やめて、私はあなたがこのことを聞くことを知っています.だから、私はここで栗を砂糖で炒めます.例えば、類Goldは定義されています.
public class Gold
{
    // Properties
    private static float xau = 1504.35f;  //    ,                ,          ……
    private float oz;    //      (                   )   (   )
    
    // Constructor
    public Gold(float oz)
    {
        this.oz = oz;
    }
    // Methods ... 
}

私たちは金単価xauが静的であることを見た.その金がどんなに重くても、どんなに成長しても、金単価はすべての金に対して同じであり、xauが変動すると、すべてのGoldの価格もxauに従って変動するからだ.だからこの属性は“個性”を備えていないで、あなたが私を使ってみんなでいっしょに使うため、つまり、これは全体の“共通性”です.
重さozは違います.金山(Kingsoft)には1 e+xxxのozがあるかもしれませんが、金粒は1 e-xxxのozしかないかもしれません.私はnew Gold(1e+500)で黄金星を構築したことを示しているかもしれません.私はnew Gold(1e-500)で金分子を構築したことを示しているかもしれません.しかし、とにかく、彼らはGoldで、彼らはozを持っていますが、一人一人のozは違います.これは です.
フリースタイル持ってる?
次に、その方法を定義したいものを見てみましょう(しかし、私は今定義していません):
public class Gold
{
    // Properties ...
    
    // Constructor ...

    // Methods
    // GetPrice()             ,    *     
    // Rise(float price)       ,  price 
    // Reduce(float price)       ,  price 
    // ...
}

まずこれらの関数を見てみると、GetPriceのような関数の結果は「個性」であり、xau*ozのうちozは「個性」であり、この結果はもちろん互いに異なる可能性があるという法則が明らかになった.RiseReduceの2つの関数は、修正するxauが共通であり、「共通性」に関連しているだけで、つまり、黄金国全体の金の運命に影響を与える関数である.
ねえ、私なら、全部普通に定義すればいいでしょう.
あ、確かに、静的でないメンバーはクラス内の他のすべてのメンバーにアクセスできるので、静的でも非静的でも構いません.もちろんGetPriceにとってはどうでもいいし、結果自体が「個性」です.
public class Gold
{
    // Properties ...
    
    // Constructor ...

    // Methods
    public float GetPrice() //             ,    *     
    {
        return xau*oz;
    }
    public void Rise(float price) //      ,  price 
    {
        xau += price;
    }
    public void Reduce(float price) //       ,  price 
    {
        xau -= price;
    }
    // ...
}

このように書くともちろん問題ありません.文法の間違いを犯さず、コンパイルは通過します.そして、金をインスタンス化すれば、これらの関数を正しく呼び出し、正しい結果を得ることができます.このように:
public void main(String args[]) //   ,         
{
    Gold gNugget = new Gold(0.01f);
    System.out.println(String.format("%.2f", gNugget.GetPrice()));
    gNugget.Rise(10.0f);
    System.out.println(String.format("%.2f", gNugget.GetPrice()));
    gNugget.Reduce(20.0f);
    System.out.println(String.format("%.2f", gNugget.GetPrice()));
}

出力結果:
15.04
15.14
14.94

結果は確かに大丈夫でした
...もちろんお金をたくさん作って遊ぶこともできますが...
ただ...gNugget.Rise()またはgMountain.Reduce()が呼び出されると、すべての金(もちろんそれら自身を含む)が影響を受ける.想像してみてください.
gNugget.Reduce(1000.0f);

その結果、小さな金の粒が金市場に深刻な金融危機をもたらした.この小さな金の粒の耐性はあまりにも大きいと思いませんか.もちろん、これもRise()/Reduce()publicに変更したのと変わらない.
はい、危険です.それでは、私は望んでいません.どうすればいいですか.
一般的なstaticの関数ではなく、「個性」の行為であることを意味します.
谁でもできる行为だから、来たいならマイペースでやろう.
もちろん、関数がstaticと宣言されると、これは「個性」の行為ではなく、「共通性」の行為であることを意味します.
このような行為はある個人が単独で実行することはできなくて、全種族の運命を賭けなければならなくて、種族の名義で、行きましょう!!!
したがって、金の価格がある金の塊に干渉されたくない場合は、RiseReducestaticでなければなりません.
    public static void Rise(float price) //      ,  price 
    {
        xau += price;
    }
    public static void Reduce(float price) //       ,  price 
    {
        xau -= price;
    }

これにより、RiseおよびReduceは、Goldのインスタンスを呼び出すことなく、Gold.Rise()およびGold.Reduce()で呼び出さなければなりません.つまり、このアクションは、次の文のエラーを引き起こします.
gNugget.Rise(10.0f);
gNugget.Reduce(20.0f);

この2つの関数は「共通性」なので、値上げして値下げしたいと思っています.小さなgNuggetは計算しません.Gold全体の名義で言わなければなりません.Gold.Rise()もちろん、共性行為にもこのような制約があります.例えば、共性の行為は個性の内容を導入することを許さない(書面では静的方法では非静的属性と方法と内部クラスを呼び出すことは許されない).一つの行為が個性の要素にかかわると、このクラス全体の名義ではできないからです.例えばGetPricestaticに変更するとエラーが発生します.
    public static float GetPrice() //   !!!!
    {
        return xau*oz;
    }

このときGold.GetPrice()を呼び出すとき、Gold全体に属するozは存在しないので、1つの金が同じであるからです.
転載先:https://www.cnblogs.com/oberon-zjt0806/p/11632528.html