呼び非staticメソッドはstaticメソッドJava[複製]
-
19-09-2019 - |
質問
この質問に答えはこちら
もしかしたらエラーにしよう呼び非staticメソッドは、静的クラスです。
できませんので静的に非staticメソッドmethodName()タイプから再生
作ができませんの方法で静止してもエラーです。
このstaticメソッドできない非表示のインスタンスメソッドからxInterface
必要があります。レストランも呼非staticメソッドを別の静的方法は?(二つの方法は別パッケージ別のクラス).
解決
静的メソッドから非静的メソッドを呼び出すための唯一の方法は、非静的メソッドを含むクラスのインスタンスを持つことです。定義によって、非静的メソッドは、静的メソッドは、クラス自体に属し、一方、いくつかのクラスのインスタンスで呼び出されるものである。
他のヒント
あなたは、例えば、あなたは上のメソッドを呼び出したいクラスのインスタンスを作成することができます
new Foo().nonStaticMethod();
まずクラスのインスタンスを作成し、そのインスタンスを使用して非静的メソッドを呼び出します。 例えば、
class demo {
public static void main(String args[]) {
demo d = new demo();
d.add(10,20); // to call the non-static method
}
public void add(int x ,int y) {
int a = x;
int b = y;
int c = a + b;
System.out.println("addition" + c);
}
}
public class StaticMethod{
public static void main(String []args)throws Exception{
methodOne();
}
public int methodOne(){
System.out.println("we are in first methodOne");
return 1;
}
}
静的メソッドは、そのクラスの参照を持っている必要があるため、上記のコードを実行していない。
public class StaticMethod{
public static void main(String []args)throws Exception{
StaticMethod sm=new StaticMethod();
sm.methodOne();
}
public int methodOne(){
System.out.println("we are in first methodOne");
return 1;
}
}
これは間違いなく実行を取得します。ここにいるので、私たちは何もありません、そのクラスの参照を用いて基準は何もなく、「SM」を作成しています
しかし、(StaticMethod=new Static method()
)我々は、メソッド1(sm.methodOne()
)を呼んでいます。
私はこれが役立つことを願っています。
そのような方法も すべ 静電気の帯びにく(なデータへのアクセスメする必要はありませんのインスタンスをメソッドが呼び出されます。以降をご利用された期間"静のクラス"、このクラスは専用ユーティリティ-のような方法できる。
しかし、Javaすることを認めていませんの実装インタフェース定義の方法です。なんとなく(自然に)するために努力することが方法を使い頂くには"できない-非表示のインスタンスよりエラーとなります。("Java言語仕様"に記載す 部9.4: "ご注意ことを宣言したメソッドのインタフェースはならないstaticとして宣言された、またはコンパイル時にエラーが発生したため、staticメソッドできない抽象的である。")
などの方法が存在 xInterface
, と、クラスを実装し xInterface
, いきなりの方法に対応します。
場合は変更することができませんのインターフェイス(またはしたくない、あるいつものことができるの?
- のクラスシングルトン:のコンストラクタの民間、静的なデータメンバは、クラスのみ、既存のインスタンス.このようにするメソッドを呼び出して、メインスタンスが少なくともすることはできませんの作成新しいインスタンス毎に必要なメソッドを呼び出し.
- 実施した2つの方法が、クラス:インスタンスメソッドで定めるもの
xInterface
は、静的な方法です。のインスタンスメソッドは単一のラインに委譲する静的な方法です。
あなたは非静的メソッドを含むクラスのインスタンスを必要としています。
あなたは、インスタンスなしで、クラスstartsWith
の非静的メソッドString
を起動しようとすると、のようなものです:
String.startsWith("Hello");
あなたが必要なもののインスタンスを持って、その後、非静的メソッドを呼び出すことです。
String greeting = new String("Hello World");
greeting.startsWith("Hello"); // returns true
だから、あなたはそれを呼び出すために作成し、インスタンスする必要があります。
静的メソッドから非静的メソッドを呼び出すための唯一の方法は、非静的メソッドを含むクラスのインスタンスを持つことである。
class A
{
void method()
{
}
}
class Demo
{
static void method2()
{
A a=new A();
a.method();
}
/*
void method3()
{
A a=new A();
a.method();
}
*/
public static void main(String args[])
{
A a=new A();
/*an instance of the class is created to access non-static method from a static method */
a.method();
method2();
/*method3();it will show error non-static method can not be accessed from a static method*/
}
}
方法が二つあります:
- 通話の非staticメソッドからのインスタンスの静的な方法です。見fabienの回答のためonelinerサンプル...このよう強くお勧めします。彼とえばそのインスタンスを作成し、クラスでだけ使用す一つの方法だけで廃棄しておくことが出来ます。今からとっても待ち遠しいですので取り扱うインスタンスのように静ます。
- 変更のstaticメソッド非対応します。
あなたはありません、直接この制限を回避することはできません。しかし、あなたはあなたの特定のケースで行うことができますいくつかの合理的なものがあるかもしれません。
たとえば、あなただけの静的メソッドでは、あなたのクラスのインスタンス「アップ新」、そして非静的メソッドを呼び出すことができます。
しかし、あなたがあなたのクラス(複数可)を投稿する場合は、より良い提案を得る可能性があります - またはそれらのスリムダウンバージョン
。静的メソッド、またはその逆です...
内の非静的メソッド/フィールドを使用する最も簡単な方法(これは、このクラスの少なくとも1つのインスタンスが存在しなければならない動作するために)
このタイプの状況は、Androidアプリの開発などでは非常に一般的である: - 活動で、少なくとも1インスタンス
があります。public class ParentClass{
private static ParentClass mParentInstance = null;
ParentClass(){
mParentInstance = ParentClass.this;
}
void instanceMethod1(){
}
static void staticMethod1(){
mParentInstance.instanceMethod1();
}
public static class InnerClass{
void innerClassMethod1(){
mParentInstance.staticMethod1();
mParentInstance.instanceMethod1();
}
}
}
注: - これは、このようなビルダーの方法として使用することはできません.....
String.valueOf(100);
私はインターフェイスを使用するので、同じように匿名のインスタンスを作成します:
AppEntryPoint.java
public interface AppEntryPoint
{
public void entryMethod();
}
Main.java
public class Main
{
public static AppEntryPoint entryPoint;
public static void main(String[] args)
{
entryPoint = new AppEntryPoint()
{
//You now have an environment to run your app from
@Override
public void entryMethod()
{
//Do something...
System.out.println("Hello World!");
}
}
entryPoint.entryMethod();
}
public static AppEntryPoint getApplicationEntryPoint()
{
return entryPoint;
}
}
基本的に、そのクラスのインスタンスを作成し、独自のメソッドを呼び出すが、同じことを実現ほどのエレガントされていません。それをするだけで、別の方法でます。
コンストラクタは、理論的には任意の静的メソッドによって呼び出さ「のみ」非静的メソッドである特殊な方法です。他にその許可されていません。
あなたは使用してスタティック1内の非静的メソッドを呼び出すことができます。
Classname.class.method()
静的メソッド内の非静的メソッドを呼び出すことはできません。その背後にある論理は、我々は、静的メソッドをインスタンス化するオブジェクトを作成しませんが、我々は非静的メソッドをインスタンス化するオブジェクトを作成する必要があります。だから、非静的メソッドは、このようにインスタンス化されているため、それができない作り、静的メソッド内でそのインスタンス化のためのオブジェクトを取得することはできません。