【问题标题】:Cross-package inheritance with package access right (default access right)具有包访问权限的跨包继承(默认访问权限)
【发布时间】:2013-01-25 05:34:32
【问题描述】:

所以我在包 A 中有一个名为 Vehicle 的类,在包 B 中有一个名为 Car 的类。 Car 类扩展了 Vehicle,因此它继承了 Vehicle 的某些元素。我的问题是 Car 继承了什么?

我认为它继承了所有公共方法和变量,但是在我的分配中,我有具有包访问权限的变量(不是公共的,不是私有的),所以我必须从 Vehicle in Car 中重新声明所有变量,对吗?此外,不清楚的是我们是否可以使用 equals() 方法比较 Car 和 Vehicle 对象,因为即使它们具有相同的名称,变量也不相同。另外,即使我在构造函数 Car 中使用 super(),我为什么还要重新声明所有变量?变量不是在 Vehicle 中启动的吗?另外,既然我必须从 Vehicle 中重新声明所有变量,那么我从 Vehicle 继承的所有公共方法都完全没用吗?从只有包访问权限变量的类继承有什么意义?

【问题讨论】:

    标签: java inheritance package


    【解决方案1】:

    你错了。它继承了 Vehicle 类的所有内容。受包保护的元素不能从子类中访问,仅此而已。所以你不能访问这些字段和方法,你也不能覆盖它们。但这并不意味着您需要重新声明它们。

    让我们举个例子。假设您设计了一个 Vehicle 类,并允许子类覆盖并访问车辆的颜色。但是假设您不希望子类与车辆的引擎发生冲突。因此你会有这样的东西:

    public class Vehicle {
        private Engine engine;
        protected Color color = Color.BLACK;
    
        public Vehicle() {
            this.engine = new Engine();
        }
    
        public final void start() {
            System.out.println("starting engine...");
            engine.start();
            System.out.println("engine started");
        }
    
        public final Color getColor() {
            return this.color;
        }
    }
    
    public class Car extends Vehicle {
    
        public Car(Color color) {
            super();
            this.color = color;
        }
    }
    

    汽车就是交通工具。所以既然你可以启动一辆车,你也可以启动一辆车。由于汽车有发动机,汽车也有发动机。无法从 Car 类内部修改引擎或对引擎进行任何操作,因为它是 Vehicle 类私有的,但汽车有。

    但是,color 字段是受保护的。这意味着 Car 类可以访问该字段。例如,它在构造函数中对其进行了修改,以便能够具有除黑色之外的另一种颜色。

    试试下面的代码:

    Car car = new Car();
    car.start();
    

    你会看到引擎启动了。

    【讨论】:

    • 在我的程序中,没有使用访问修饰符(包访问权限),我没有使用受保护的、私有的或公共的。因此,我得到了这个:错误:价格在汽车中不公开;无法从外部包访问。 (第 51 行:this.price == other.price)
    • 而且,类 Car 在另一个包中。
    • @prog 如果engine 是包可见而不是private,这个答案仍然成立。同样,Car 将无法直接访问 engine,但它仍然可供Vehicle 中声明的方法使用。
    • 可是我怎么编译不了呢?
    • 在他的示例中,他没有重新声明变量颜色,但我必须这样做。否则,当我在 Car 类中使用可变价格时,它不会编译。
    猜你喜欢
    • 2017-05-05
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多