我正在学习Java,我只是想知道为什么当一个方法或成员是静态的时使用公共和私有?当使用static时,它们是类方法和类成员,可以在不创建对象的情况下从其他类中使用,那么公共和私有是否必要?一些帮助可以预先理解。对不起,如果这个问题对某些人来说太简单了。
答案 0 :(得分:4)
字段或方法的可访问性与它是否为静态的事实是正交的。
您可以从外部访问静态方法,并且只能从类本身内部(通过其他静态或非静态方法)使用静态方法。字段也是如此。
例如:
// not visible from the outside
private static final long MILLISECONDS_IN_A_MINUTE = 1000L * 60 * 60;
public static Date addMinutes(Date d, int amount) {
return addMillis(d, MILLISECONDS_IN_A_MINUTE * amount);
}
// not visible from the outside
private static Date addMillis(Date d, long amount) {
return new Date(d.getTime() + amount);
}
答案 1 :(得分:1)
我正在学习Java,我只是想知道为什么当方法或成员是静态的时使用公共和私有?
我相信你的问题是由于一个常见的误解,即访问修饰符是针对实例,但它们不是!
如果两个不同的实例属于同一个类,则可以访问其他私有成员。
换句话说,访问修饰符适用于类级别。由于静态成员也属于某个类,因此在它们上也有访问修饰符是有意义的。
只应由同一类中的代码使用的静态方法(或变量)(如JB Nizet的示例中所示)应该是私有的,而任何类中的代码可以使用的静态方法或变量应该是公开。
答案 2 :(得分:0)
没有必要,但可以有static
方法和数据成员仅供内部使用。
这方面的一个例子是,如果你想为每个类的实例提供一个唯一的id:
class Foo
{
private static int nextId = 0;
private static int generateId() { return ++nextId; }
private int id;
public Foo()
{
id = generateId();
}
}
如您所见,课堂外不需要nextId
和generateId()
,也不应在课堂外使用。static
和nextId
。类本身负责生成id。但是你需要它们static
(嗯,你需要generateId()
为Foo
,但你也可以static
静态,因为它不会访问非静态成员)。
每当创建一个对象{{1}}时,{{1}}计数器就会递增,因此每个类的实例都会得到不同的id。 (这个例子不是线程安全的)
答案 3 :(得分:0)
假设您有一个静态公共方法,并且此方法必须访问私有属性。此私有属性也必须是静态的。私有静态存在的原因之一。
示例:
public class Test {
private static int myattr = 0;
public static void foo() {
myattr = 2;
}
}
以上,myattr
必须是静态属性,才能在foo()
方法中使用它。
答案 4 :(得分:0)
是的,这是必要的。
如果您有静态方法并且想在该方法中使用私有变量,那么您还需要将其声明为静态。
或者您希望静态变量对其他包不可见,然后不要将其公开。
答案 5 :(得分:0)
根据我的记忆,它并非真正需要。但 public 基本上在任何编程语言中都可以被外部文件使用。使用私有时,只能在该文件中使用,静态表示您无法更改所述引用的值。无论这些是函数还是变量,都适用相同的规则。我可能会离开。在大约一年半的时间里没有完成Java。
您可以合并这些类型的方式取决于您。毕竟,程序只是与用户一样多样化。 ^ _ ^
答案 6 :(得分:0)
公共和私有keywoards与可见性有关:您希望其他类可以访问哪些成员,哪些成员应该被隐藏或封装。 静态成员作为一个整体与类相关,而非静态成员则在对象实例上运行。
答案 7 :(得分:0)
当static与方法一起使用时,它不仅意味着它应该由其他类的成员使用。
当我们访问类的静态方法时,就是这种情况 无法实例化类(包含方法),即不能创建该类的对象。
可能存在两个不同类可能具有相同名称的静态方法的情况。在这种情况下,您希望使用相同类的方法而不是其他类的方法。