java 声明静态类_为什么你不能在Java中将类声明为静态?

回答(14)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

具有私有构造函数的类是静态的 .

像这样声明你的类:

public class eOAuth {

private eOAuth(){}

public final static int ECodeOauthInvalidGrant = 0x1;

public final static int ECodeOauthUnknown = 0x10;

public static GetSomeStuff(){}

}

你可以不用初始化使用:

if (value == eOAuth.ECodeOauthInvalidGrant)

eOAuth.GetSomeStuff();

...

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

所以,我要迟到了,但这是我的两分钱 - 哲学上增加了科林赫伯特的回答 .

在高级别,您的问题处理对象和类型之间的差异 . 虽然有很多汽车(物体),但只有一种汽车类(类型) . 将某些内容声明为静态意味着您在“类型”空间中操作 . 只有一个 . 顶级类关键字已经在“类型”空间中定义了一个类型 . 结果“公共静态类汽车”是多余的 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

public class Outer {

public static class Inner {}

}

...它可以声明为static - 只要它是一个成员类 .

来自JLS:

成员类可能是静态的,在这种情况下,它们无法访问周围类的实例变量;或者他们可能是内部阶级(§8.1.3) .

和这里:

static关键字可以修改非内部类T体内成员类型C的声明 . 其作用是声明C不是内部类 . 正如T的静态方法在其体内没有T的当前实例一样,C也没有T的当前实例,也没有任何词法封闭实例 .

静态关键字对于顶级类没有任何意义,只是因为顶级类没有封闭类型 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我们在java中编写代码的所有东西都进入了一个类 . 每当我们运行类时,JVM都会实例化一个对象 . 根据定义,JVM可以创建许多对象 . 静态意味着您对所有对象具有相同的副本集 .

因此,如果Java在运行程序时允许顶级类是静态的,那么它会创建一个Object并继续覆盖到相同的内存位置 .

如果您只是在每次运行时更换对象,那么创建它的目的是什么?

所以这就是Java摆脱顶级类静态的原因 .

可能有更具体的原因,但这对我来说具有很大的逻辑意义 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

可以在Eclipse中查看 PlatformUI ,其中包含静态方法和私有构造函数的类,其本身是final .

public final class

{

//static constants

//static memebers

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

只有嵌套类可以是静态的 . 通过这样做,您可以使用嵌套类,而无需外部类的实例 .

class OuterClass{

public static class StaticNestedClass{

}

public class InnerClass{

}

public InnerClass getAnInnerClass(){

return new InnerClass();

}

//This method doesn't work

public static InnerClass getAnInnerClassStatically(){

return new InnerClass();

}

}

class OtherClass{

//Use of a static nested class:

private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();

//Doesn't work

private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

//Use of an inner class:

private OuterClass outerclass= new OuterClass();

private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();

private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();

}

Sources :

On the same topic :

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

唯一可以是静态的类是内部类 . 以下代码工作得很好:

public class whatever {

static class innerclass {

}

}

静态内部类的要点是它们没有对外部类对象的引用 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

当然可以,但只有内部嵌套类 . 在那里,这意味着嵌套类的实例不需要外部类的封闭实例 .

但对于顶级课程,语言设计者无法想到对关键字有用的任何内容,因此不允许这样做 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我觉得这可以像喝一杯咖啡一样简单!看看这个 . 我们在定义类时不会显式使用static关键字 .

public class StaticClass {

static private int me = 3;

public static void printHelloWorld() {

System.out.println("Hello World");

}

public static void main(String[] args) {

StaticClass.printHelloWorld();

System.out.println(StaticClass.me);

}

}

这不是静态类的定义吗?我们只使用绑定到类的函数 . 请注意,在这种情况下,我们可以在嵌套中使用另一个类 . 看这个:

class StaticClass1 {

public static int yum = 4;

static void printHowAreYou() {

System.out.println("How are you?");

}

}

public class StaticClass {

static int me = 3;

public static void printHelloWorld() {

System.out.println("Hello World");

StaticClass1.printHowAreYou();

System.out.println(StaticClass1.yum);

}

public static void main(String[] args) {

StaticClass.printHelloWorld();

System.out.println(StaticClass.me);

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

顶级类默认是静态的 . 默认情况下,内部类是非静态的 . 您可以通过明确地将它们标记为静态来更改内部类的默认值 . 顶级类由于是顶级的,因此不能具有非静态语义,因为没有父类可以引用 . 因此,无法更改顶级类的默认值 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如上所述,除非Class是另一个Class的成员,否则Class不能是静态的 .

如果您正在设计一个“不能有多个实例”的类,您可能需要查看“Singleton”设计模式 .

初学者单身人士信息here .

警告:

如果您正在考虑使用单身模式,请尽力抵抗 . 它是最容易理解的DesignPatterns之一,可能是最受欢迎的,也是最受滥用的 . (来源:上面链接的JavaRanch)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

除了Java如何定义静态内部类之外,还有另一个静态类的定义,根据C#world [1] . 静态类是只具有静态方法(函数)的类,它旨在支持过程式编程 . 这样的类不是真正的类,因为类的用户只对辅助函数感兴趣而不是创建类的实例 . 虽然C#支持静态类,但Java中不存在这样的直接支持 . 但是,您可以使用枚举来模拟Java中的C#静态类,以便用户永远不能创建给定类的实例(甚至使用反射)[2]:

public enum StaticClass2 {

// Empty enum trick to avoid instance creation

; // this semi-colon is important

public static boolean isEmpty(final String s) {

return s == null || s.isEmpty();

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

您可以通过声明枚举类型来创建实用程序类(不能创建实例)没有实例 . 即你特别声明没有实例 .

public enum MyUtilities {;

public static void myMethod();

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果使用静态类的好处不是实例化对象并使用方法,那么只需将该类声明为public,并将此方法声明为static .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值