静的クラスで非静的メソッドを呼び出そうとするとエラーが発生します。
型再生から非静的メソッドmethodName()への静的参照を作成できません
これもエラーになるので、メソッドを静的にすることはできません。
この静的メソッドは、xInterfaceからインスタンスメソッドを隠すことはできません。
別の静的メソッドで非静的メソッドを呼び出すラウンドを取得する方法はありますか? (2つのメソッドは、個別のパッケージと個別のクラスにあります)。
静的メソッドから非静的メソッドを呼び出す唯一の方法は、非静的メソッドを含むクラスのインスタンスを持つことです。定義上、非静的メソッドはあるクラスのインスタンスで呼び出されるメソッドですが、静的メソッドはクラス自体に属します。
メソッドを呼び出すクラスのインスタンスを作成できます。
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;
}
}
これは間違いなく実行されます。ここでは、(StaticMethod=new Static method()
)以外のクラスの参照を使用して「sm」以外の参照を作成しているため、メソッド1(sm.methodOne()
)を呼び出しています。
これが役立つことを願っています。
メソッドは本当にshouldであるように聞こえます(つまり、データメンバーにアクセスせず、インスタンスを呼び出す必要はありません) 。 「静的クラス」という用語を使用したので、クラス全体がおそらく静的である可能性のあるユーティリティのようなメソッド専用であると理解しています。
ただし、Javaでは、インターフェイス定義メソッドの実装を静的にすることはできません。そのため、(当然)メソッドを静的にしようとすると、「cannot-hide-the-instance-method」エラーが発生します。 (Java言語仕様では 9.4節 :でこれについて言及されています。 "インターフェイスで宣言されたメソッドはstaticまたは静的メソッドは抽象化できないため、コンパイル時エラーが発生します。 ")
したがって、メソッドがxInterface
に存在し、クラスがxInterface
を実装している限り、メソッドを静的にすることはできません。
インターフェイスを変更できない場合(または変更したくない場合)、次のことができます。
xInterface
で定義)、および静的メソッド。インスタンスメソッドは、静的メソッドに委任する1行で構成されます。非静的メソッドを含むクラスのインスタンスが必要です。
インスタンスなしでクラス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*/
}
}
私はインターフェイスを使用して、そのような匿名インスタンスを作成します:
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つ必要です)
このような状況は、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);
2つの方法があります。
この制限を直接回避することはできません。ただし、特定のケースでできる合理的なことがいくつかあります。
たとえば、静的メソッドでクラスのインスタンスを「更新」してから、非静的メソッドを呼び出すことができます。
ただし、クラスを投稿するか、それらのスリム化バージョンを投稿すると、さらに良い提案が得られる場合があります。
以下を使用して、静的メソッド内で非静的メソッドを呼び出すことができます:Classname.class.method()
コンストラクターは、理論的には静的メソッドによって呼び出される「唯一の」非静的メソッドである特別なメソッドです。それ以外は許可されません。
静的メソッド内で非静的メソッドを呼び出すことはできません。その背後にあるロジックは、静的メソッドをインスタンス化するオブジェクトを作成しないが、非静的メソッドをインスタンス化するオブジェクトを作成する必要があるということです。そのため、非静的メソッドは、静的メソッド内でインスタンス化するオブジェクトを取得しないため、インスタンス化できなくなります。