在没有编译错误的情况下更改对方法的访问

时间:2014-04-11 15:03:29

标签: java private public access-modifiers

有人可以演示一个简单程序的示例,其中在工作程序中将一个方法的访问权限从私有方式更改为公共方式将不会导致编译错误,但只会导致程序行为不同吗?

此外,何时添加新的私有方法会导致编译错误或导致程序行为不同?

2 个答案:

答案 0 :(得分:5)

这与继承发挥作用。子类可以在其父类中使用与私有方法具有相同签名的方法,但不能覆盖它。

public class Scratchpad {
    public static void main(String[] args) {
        new Sub().doSomething();
    }
}

class Super {
    public void doSomething() {
        System.out.println(computeOutput());
    }

    private String computeOutput() {
        return "Foo";
    }
}

class Sub extends Super {
    public String computeOutput() {
        return "Bar";
    }
}

如果按原样运行,则会得到Foo。如果您将Super#computeOutput()更改为public,则会获得Bar。那是因为Sub#computeOutput()现在会覆盖Super#computeOutput()

答案 1 :(得分:3)

  

同样何时添加新的私有方法会导致编译错误或导致程序行为不同?

借用Mark的代码,如果将私有方法添加到Sub,则以下内容将无法编译,因为doSomething()的可见性已降低。

class Super {
  public void doSomething() {
    System.out.println("Foo");
  }
}

class Sub extends Super {      
  private void doSomething() {
    System.out.println("Harr!");
  }
}

  

此外,何时添加新的私有方法会导致编译错误或导致程序行为异常

如果添加的私有方法比前一个更具体,则可以调整程序行为。下面的例子打印“bar”,除非你添加(取消注释)另一个方法,它打印“foo”。

public class Test {

  public static void main(String[] args) throws Exception {
    String foo = "hello";
    methodOne(foo);
  }

  // private static void methodOne(String args) {
  // System.out.println("foo");
  // }

  private static void methodOne(Object arg) {
    System.out.println("bar");
  }
}