java为什么我可以在非公共类中拥有公共成员? 1 日,15 小时 Questions & Answers 2186 class MyClass { public static final int num=90; } 为什么允许我在非公共类中创建公共成员李> 是否有其他我不知道的访问此成员的方法(除了通过类名)李>
# 1 楼答案 当你声明一个变量public时,它本质上就是这样;它可以在整个程序中看到,而不需要任何特殊的getter/setter。类的成员也必须是公共的,而不必是public 请记住,在Java中,每个编译单元(.java文件)只能有一个公共类,并且该公共类需要与编译单元具有相同的名称。除此之外,它不“拥有”关键字public的所有权 您将num声明为public和static的事实允许您说系统。出来println(MyClass.num)。public属性允许您直接获取num变量。因此,您不必创建一个方法来为您返回num。因为它是公开的,你也可以说 MyClass mc = new MyClass(); System.out.println(mc.num); 但是,由于还添加了static声明,因此应该只通过类名(即MyClass)访问它。num 要点:公共变量可以存在于任何类型的类中,它们允许您在不需要getter和setter的情况下访问它们。然而,公共类并不是唯一可以拥有公共变量的类
# 2 楼答案 不要忘记,具有default访问权限的类可以被同一个包中的public类子类化 package package1; class MyDefaultClass { public static final int MY_CONSTANT = 0xCAFEBABE; } public class PublicExporter extends MyDefaultClass { } 现在public类充当了一个桥梁,您可以使用其他包中的MyDefaultClass{}成员 package package2; import package1.PublicExporter; public class Consumer { public static void main(String[] args) { System.out.printf("%x\n", PublicExporter.MY_CONSTANT); } } 消费者甚至可以导入静态成员: import static package1.PublicExporter.MY_CONSTANT; public class Consumer { public static void main(String[] args) { System.out.printf("%x\n", MY_CONSTANT); } }
# 3 楼答案 因为您的问题是关于members,所以我将讨论字段和方法(非静态;Anthony Accioly's answer涉及另一个良好的用例,其中也包括静态字段) 虽然在许多情况下,这只是语言语法的一个模糊结果(特别是:在非公共类中的publicfields,如您的示例片段所示),但有很好的理由需要能够在非公共类中使用public方法 展开在{a3}回答,考虑,例如,下面的(设计实例): import ...; class BleebleAscendingComparator implements Comparator<Bleeble> { @Override public int compare (Bleeble o1, Bleeble o2) { ... } } class BleebleDescendingComparator implements Comparator<Bleeble> { @Override public int compare (Bleeble o1, Bleeble o2) { ... } } public class BleebleView { public enum SortMode { ASC, DESC }; public Comparator<Bleeble> getDisplayOrderComparator (SortMode mode) { if (mode == SortMode.ASC) return new BleebleAscendingComparator(); else return new BleebleDescendingComparator(); } } 您不能直接在该上下文之外实例化其中一个Comparator实现,但它们必须重写Comparator的公共方法,并且它们的功能可以通过Comparator接口访问 同样的推理也适用于private或protected内部类。如果不能声明方法public,则无法重写它们继承的接口或扩展的类的public方法 实例: 每次重写匿名内部类中的公共方法时(例如,每次重写匿名内部类中的public void actionPerformed),都使用此 < P>考虑任何您想存储在^ {CD10>}中的非公共类。您将覆盖该非公共类中的公共equals()和hashCode(),并且HashMap的实现可以访问它们,而不管该类是非公共的 经常被重写的public toString()是潜在非公共类的公共成员的另一个常见示例 一个更复杂的例子是在java.sql.DriverManager中使用java.sql.Driver(通常,工厂类型设计大量使用这个概念)——SQL驱动程序实现可能不会使实现类公开(例如Oracle驱动程序生成非公开的Connection对象) 还有很多。。。如果你留心这方面的例子,你会惊讶于它是多么普遍
# 4 楼答案 当属于封闭类A的public方法返回对其具有默认作用域的内部类B的引用(public超类型引用,如接口)时,外部客户端(在A的包之外)只能调用B的方法,但不能创建B的新实例 如果B的方法不是public,则外部客户端无法访问它们,更糟糕的是:由于没有很好地实现其接口,将导致编译错误 这种建模在特定环境下可能很有用,可以改进代码设计
# 1 楼答案
当你声明一个变量
public
时,它本质上就是这样;它可以在整个程序中看到,而不需要任何特殊的getter/setter。类的成员也必须是公共的,而不必是public
请记住,在Java中,每个编译单元(.
java
文件)只能有一个公共类,并且该公共类需要与编译单元具有相同的名称。除此之外,它不“拥有”关键字public的所有权您将
num
声明为public
和static
的事实允许您说系统。出来println(MyClass.num)。public
属性允许您直接获取num
变量。因此,您不必创建一个方法来为您返回num
。因为它是公开的,你也可以说但是,由于还添加了
static
声明,因此应该只通过类名(即MyClass)访问它。num要点:公共变量可以存在于任何类型的类中,它们允许您在不需要getter和setter的情况下访问它们。然而,公共类并不是唯一可以拥有公共变量的类
# 2 楼答案
不要忘记,具有
default
访问权限的类可以被同一个包中的public
类子类化现在}成员
public
类充当了一个桥梁,您可以使用其他包中的MyDefaultClass
{消费者甚至可以导入静态成员:
# 3 楼答案
因为您的问题是关于members,所以我将讨论字段和方法(非静态;Anthony Accioly's answer涉及另一个良好的用例,其中也包括静态字段)
虽然在许多情况下,这只是语言语法的一个模糊结果(特别是:在非公共类中的publicfields,如您的示例片段所示),但有很好的理由需要能够在非公共类中使用public方法
展开在{a3}回答,考虑,例如,下面的(设计实例):
您不能直接在该上下文之外实例化其中一个
Comparator
实现,但它们必须重写Comparator
的公共方法,并且它们的功能可以通过Comparator
接口访问同样的推理也适用于
private
或protected
内部类。如果不能声明方法public
,则无法重写它们继承的接口或扩展的类的public
方法实例:
每次重写匿名内部类中的公共方法时(例如,每次重写匿名内部类中的
public void actionPerformed
),都使用此equals()
和hashCode()
,并且HashMap
的实现可以访问它们,而不管该类是非公共的经常被重写的
public toString()
是潜在非公共类的公共成员的另一个常见示例一个更复杂的例子是在java.sql.DriverManager中使用
java.sql.Driver
(通常,工厂类型设计大量使用这个概念)——SQL驱动程序实现可能不会使实现类公开(例如Oracle驱动程序生成非公开的Connection
对象)还有很多。。。如果你留心这方面的例子,你会惊讶于它是多么普遍
# 4 楼答案
当属于封闭类
A
的public
方法返回对其具有默认作用域的内部类B
的引用(public
超类型引用,如接口)时,外部客户端(在A
的包之外)只能调用B
的方法,但不能创建B
的新实例如果
B
的方法不是public
,则外部客户端无法访问它们,更糟糕的是:由于没有很好地实现其接口,将导致编译错误这种建模在特定环境下可能很有用,可以改进代码设计