有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (4) 个答案

  1. # 1 楼答案

    当你声明一个变量public时,它本质上就是这样;它可以在整个程序中看到,而不需要任何特殊的getter/setter。类的成员也必须是公共的,而不必是public

    请记住,在Java中,每个编译单元(.java文件)只能有一个公共类,并且该公共类需要与编译单元具有相同的名称。除此之外,它不“拥有”关键字public的所有权

    您将num声明为publicstatic的事实允许您说系统。出来println(MyClass.num)。public属性允许您直接获取num变量。因此,您不必创建一个方法来为您返回num。因为它是公开的,你也可以说

          MyClass mc = new MyClass();
          System.out.println(mc.num);
    

    但是,由于还添加了static声明,因此应该只通过类名(即MyClass)访问它。num

    要点:公共变量可以存在于任何类型的类中,它们允许您在不需要getter和setter的情况下访问它们。然而,公共类并不是唯一可以拥有公共变量的类

  2. # 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. # 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接口访问

    同样的推理也适用于privateprotected内部类。如果不能声明方法public,则无法重写它们继承的接口或扩展的类的public方法

    实例:

    • 每次重写匿名内部类中的公共方法时(例如,每次重写匿名内部类中的public void actionPerformed),都使用此

    • < P>考虑任何您想存储在^ {CD10>}中的非公共类。您将覆盖该非公共类中的公共equals()hashCode(),并且HashMap的实现可以访问它们,而不管该类是非公共的

    • 经常被重写的public toString()是潜在非公共类的公共成员的另一个常见示例

    • 一个更复杂的例子是在java.sql.DriverManager中使用java.sql.Driver(通常,工厂类型设计大量使用这个概念)——SQL驱动程序实现可能不会使实现类公开(例如Oracle驱动程序生成非公开的Connection对象)

    • 还有很多。。。如果你留心这方面的例子,你会惊讶于它是多么普遍

  4. # 4 楼答案

    当属于封闭类Apublic方法返回对其具有默认作用域的内部类B的引用(public超类型引用,如接口)时,外部客户端(在A的包之外)只能调用B的方法,但不能创建B的新实例

    如果B的方法不是public,则外部客户端无法访问它们,更糟糕的是:由于没有很好地实现其接口,将导致编译错误

    这种建模在特定环境下可能很有用,可以改进代码设计