Java中private、static、final、public和abstract关键字的用法模式

13
除了“abstract”之外,我明白这些关键词的含义。我正在自学Java,我的教育程度相当于中学水平(因为我所在的高中位于糟糕的社区,所以我受到了不公正待遇)...
但是,这些关键词的使用模式是什么?我何时该使用哪个关键词?我何时可以省略它们?在我的类前面添加“public”会使每个使用它的类都需要一个新文件,如果我想创建一个单一的源文件,我可以省略它吗?
我查找的每一个信息,都能解释这些关键词究竟是做什么用的,但却没有清晰地阐述我应该在什么情况下、为什么以及在何处使用它们。
提前感谢您, 安东尼

所以这里的问题是,我认为你刚刚读了一篇关于如何在10天内学习Java的文章/书籍。就像抽象不是一个关键字,private和public是一起使用的,static并不像你说的那样工作。实际上,我很困惑,我认为你需要多读一些,并针对具体的事情提出具体的问题。 - Grammin
2
@Grammin "abstract不是关键字"?你需要自我探索一下或者多读一些相关资料。http://en.wikipedia.org/wiki/List_of_Java_keywords - RichardTheKiwi
@Richard 是的,那是我的错误,我现在处于C++世界中,对此错误感到抱歉。话虽如此,我的观点仍然有效。 - Grammin
官方教程是学习java的好资源,“基础教程”的第二部分应该会有所帮助。http://download.oracle.com/javase/tutorial/ - josefx
4
顺便说一句,我不喜欢“verbosity(啰嗦)”标签。并不是因为 Java 不啰嗦,而是这些关键字并不是导致它啰嗦的原因。 - Bozho
6个回答

42
  • private应该只用于在给定类之外不使用某些内容的情况下:
    • 对于方法和字段 - 当它们仅在同一类中使用时
    • 对于类 - 只有在嵌套类中使用时,当在同一类中使用时
  • protected应该在需要使其可由子类访问时使用:
    • 对于方法和字段 - 当您需要将它们公开给子类时
    • 对于类 - 再次只有在嵌套类中使用时,可由子类访问
  • public用于其他任何类都可以访问的内容。
  • 以上三个是“可见性修饰符”。 当您想将某些方法/字段/类的使用限制为对象组时,并从其他对象中隐藏它们时,它们就会使用。 还有另一个可见性修饰符-默认值(当没有其他修饰符时)。 当您希望您的类/方法/字段仅对来自相同软件包的类可访问时,就会使用它。

  • static用于不需要某个类(即对象)的实例来使用它的情况:
    • 对于字段-当您希望拥有全局字段时
    • 对于方法 - 当需要实用程序函数而不依赖对象状态时
    • 对于嵌套类-当您希望在不使用封闭类的实例的情况下访问它们时。
  • abstract用于当前类中不想提供实现的情况:
    • 对于方法- 当子类必须提供实际实现,但您希望在此类中调用这些方法(无论它们如何实现)时。
    • 对于类 - 表示该类可能具有抽象方法。
  • final 用于您不希望更改的内容。
  • 在字段上,当您仅想分配值一次时。 当您想将局部变量传递给内部类时很有用-您必须声明它为final。
  • 在类和方法上 - 当您不希望子类能够扩展/覆盖它们时使用。

  • 10

    对于初学者,这里是我的经验法则:

    1. 公共的:所有类都应该是公共的(这并不完全正确,但很接近)。对于方法,考虑你的电视机:您希望对电视机执行的操作是“公共的”。
    2. 私有的:实现细节应该是私有的。考虑你的电视机:如果对于电视机的等效操作应该是私有的,因为用户可能会永久损坏电视机、电击等,则功能是私有的。
    3. 受保护的:暂时忽略这个。
    4. 抽象的:在学习Java时我看到的最好的例子是想象“鸟”。鸟是抽象的,因此会有一个“抽象”的飞行方法。鸟的每个物种都知道如何飞行(除非它们是企鹅 - 然后会抛出UnsupportedOperationException)。

    强烈建议您抵制使用单一的巨大源代码文件的冲动。尽量使方法短于一个屏幕,类短于300行。


    是的,我来自Python,那里大多数文件只包含单个文件中的所有源代码。我不打算在Java中构建巨大的项目,现在只是用它来完成一些小任务,由于我没有经验,当它们分成100个不同的文件时,很难跟踪所有类。这个问题主要是为了帮助更好地理解和映射我的Python知识到Java的工作方式。 - ThantiK

    6

    Bozho已经很好地介绍了关键字的用途,但我要补充一点:如果您根本没有声明作用域,那么您的作用域就变成了包私有(package-private),这意味着与类在同一软件包中的任何人都可以使用该类/方法。基本上,它比private更为宽松,但比protected更为严格,因为protected允许从软件包外部访问。

    关于 'no modifier' 访问权限的信息请参考此处:

    我建议通过Java教程进行学习:

    如果您想进一步了解Java,也可以查看书籍相关问题:


    2

    privatepublicprotected 都用于声明类变量的作用域

    static 表示被定义的东西是类的成员,而不是类的实例对象。

    abstract 表示该类不能直接创建,只能由子类使用。抽象方法可以在抽象类中定义,并表示任何子类必须定义一个与定义签名相匹配的方法。

    final 表示变量只能在创建时被赋值一次。一个 final 类/方法不能被继承/覆盖。

    避免将所有内容放在一个大文件中。使用像 Eclipse 这样的 IDE,它会使得每个文件都只有一个类的代码易于处理。这样可以更好地组织代码并封装代码,避免出现所有内容都知道其他内容的情况。这将导致错误,因为很容易意外地使用为执行不同目的而创建的代码。


    1

    一个 private 方法是一种不能被引入范围之外的任何其他对象访问的方法。

    static 方法是属于类而不是类实例的方法。该方法可访问类的每个实例,但在实例中定义的方法只能被该类的成员访问。

    final 关键字在多种情况下用于定义只能分配一次的实体。

    public 成员对所有其他类都是可见的。这意味着任何其他类都可以访问 public 字段或方法。

    abstract 方法没有具体内容,只有方法签名。如果一个普通类扩展了一个抽象类,则该类必须实现抽象父类的所有抽象方法,否则它也必须声明为抽象。


    0
    为了理解这些关键字的使用时机、原因和位置,您必须掌握面向对象编程和Java的一些关键概念。我建议您查阅封装多态性
    另外,我想到的是,“public”是隐含的,所以不是必需的,但将其放在那里是一个好习惯。

    2
    在Java中,大多数情况下(或者也许全部?),“包”可见性是默认的。 - Dan Rosenstark

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接