Java函数(方法)随处可用(全局)

Java函数(方法)随处可用(全局),java,function,methods,global,Java,Function,Methods,Global,我最近(4天前)开始用JAVA编程。我有一些C++和PHP的整体编程经验。我的问题是:我们能用JAVA实现一个在所有类中都可用的函数吗?我正在考虑一些全局日志函数,我需要在几个地方调用它(记录事件、错误等) 假设我有两个类,A和B。我需要在这两个类中调用日志函数,但我不想复制整个函数体(我认为这很糟糕),我想严格地调用它(不创建另一个类,实例化它,然后从实例调用),比如logEvent(someVariable)。所以我应该使用抽象类C,A和B将对其进行扩展,但它们已经是其他类(内置)的扩展。由

我最近(4天前)开始用JAVA编程。我有一些C++和PHP的整体编程经验。我的问题是:我们能用JAVA实现一个在所有类中都可用的函数吗?我正在考虑一些全局日志函数,我需要在几个地方调用它(记录事件、错误等)

假设我有两个类,A和B。我需要在这两个类中调用日志函数,但我不想复制整个函数体(我认为这很糟糕),我想严格地调用它(不创建另一个类,实例化它,然后从实例调用),比如
logEvent(someVariable)
。所以我应该使用抽象类C,A和B将对其进行扩展,但它们已经是其他类(内置)的扩展。由于多重继承是不允许的(是吗?),我需要做一些技巧。辛格尔顿也不讨我喜欢。在PHP或C++中,我只需用函数体创建单独的文件,然后将其包含。 下面是我想如何使用它:

public class A extends SomeClass {
    String error = "Error from class A";
    logEvent(error);
}

public class B extends SomeOtherClass {
    String error = "Error from class B";
    logEvent(error);
}

在任何类中放置一个静态方法(它可以是utils类或其他任何类),然后像这样调用它:
ClassName.functionName()

静态方法属于该类,而不是该类的实例,因此不需要实例化该类来访问该方法


但是Java中的所有内容都必须在一个类中,因此没有类名就无法访问它。

您可以使用静态方法

使用静态方法定义类:

public class Util{
    public static void logEvent(String error){
        ...
    }
}
package xxx;

public class Util{
    public static void logEvent(String error){
    ...
    }
}
然后,你可以这样使用静态方法:

public class A extends SomeClass {
    String error = "Error from class A";
    Util.logEvent(error);
}

您可以在此处查看以了解有关静态方法的更多信息,

您应该使用静态方法:

public class Util{
    public static void logEvent(String error){
        ...
    }
}
package xxx;

public class Util{
    public static void logEvent(String error){
    ...
    }
}
和导入静态:

import static xxx.Util.*;

public class A extends SomeClass {
    String error = "Error from class A";
    logEvent(error);
}

您可以阅读有关邪恶
单例模式的内容。@LeeMeador“邪恶”是一个意见问题。如果您不喜欢静态方法,还可以使用一个静态方法返回该类允许的单个实例。将类构造函数设为私有,并将一个实例保留在静态字段中。您还可以使用静态导入,这样您就可以使用静态方法,而无需在每个使用站点使用类名对其进行限定。@DaoWen很好,我忘记了Java的这一功能。更多信息:但请记住,静态导入有点不受欢迎,它们很容易被误用。我不认为每次都要输入类名有什么大不了的,这样可以保持代码的整洁。这是可以接受的,但现在我需要做额外的导入:D。但从我的角度来看,这样做比每次都在
类之前编写要好。希望有更好的解决办法,但经过长时间的研究,我找不到。感谢您的回复:)这种方法有什么优点和缺点吗?我知道静态方法,但我希望避免每次使用它们时都写类名(在20或50次调用之后,可能会令人沮丧:)。但是我可以像上面提到的@DaoWen那样做静态导入。谢谢,这正是我想要的!以前从未见过“导入静态”。谢谢您的回答。导入静态是一种很好的导入方式。这是一个极好的解决方案。