Java中的范围或可见性限制是什么?

时间:2018-04-07 07:37:25

标签: java c++ scope

我从2000年开始用Java编程,而自1987年开始用C ++编写。因此,大多数时候我都能很容易地掌握Java概念,并且很容易通过C ++知识来帮助它。但在某些情况下,它给了我一种“文化”的冲击(对于一个根深蒂固的C ++文化的人来说)。如果我在C ++中有以下程序:

// override.cpp
class Base
{
public:
   void f(int) { }
};

class Derived : public Base
{
public:
   void f(char *) { }
};

int main()
{
   Derived d;
   d.f(5); // This line throws a compilation error
}

通过Derived对象调用f(5)会抛出错误,因为在Derived类的范围内,f()只能接受一个字符指针。如果我将这个程序翻译成Java:

// Override.java
class Base
{
    public void f(int i) { System.out.println("Base.f()"); }
}

class Derived extends Base
{
    public void f(String s) { System.out.println("derived.f()"); }

    public static void main(String [] args)
    {
        Derived d = new Derived();
        d.f(5);
    }
}

编译器不会抛出任何错误,程序会产生输出:

Base.f()

这显然具有误导性。我是否应该在调用Derived范围内不可用的函数时遇到编译错误?

4 个答案:

答案 0 :(得分:1)

重写方法必须具有相同的参数列表。 如果没有,那么函数就可以作为重载函数 在上面的例子中,您的基类函数在d.f(5);调用时匹配。

答案 1 :(得分:0)

在java中,public void f(int i)等非私有成员将由子类继承,这意味着它将是子类的方法成员,因此

  • public void f(String s)
  • public void f(int i)

可在子类中访问。

答案 2 :(得分:0)

在C ++中,它默认不搜索基类来调用函数/方法。在您的情况下,您需要通过关键字python ensemble_plsr.py example_settings.txt(例如using)明确指定相同内容。但是在Java的情况下,默认情况下会这样做.using语句将重载函数带入同一范围,以便它可以参与重载决策。下面的C ++代码对我来说很好。所以区别仅在于默认行为。

using Base::f;

答案 3 :(得分:0)

所有公共函数都可以从类及其所有基类中获得(一直到Object.class)。这里的关键是实例的声明类型。例如:

Base b = new Derived();
b.f(10); // prints Base.f()
b.f("foo"); // does not compile

Derived d = new Derived();
d.f(10); // prints Base.f()
d.f("foo"); // prints derived.f()

即使b的运行时类型为Derived.class,声明的类型为Base.class。您会看到与接口相同的行为:

List list = new ArrayList();

您只能访问List中声明的方法,而不能访问ArrayList中的所有方法。