如何使超类中的某些方法在子类中不可用

时间:2012-08-15 07:05:48

标签: java inheritance polymorphism

让我说我有一个班级

public class Base {}

和一个儿童班

public class Derived extends Base {

    public void Foo(Object i){
        System.out.println("derived - object");
    }
}

和主要课程

public class Main {
    public static void main(String[] args) {
        Derived d = new Derived();
        int i = 5;
        d.Foo(i);
    }
}

在控制台中我们会看到 派生 - 对象

一段时间后,我想像这样修改我的超类:

public class Base {

    public void Foo(int i) {
        System.out.println("base - int");
    }
}

现在如果我运行我的程序,我会看到:

base - int

那么我可以在我的子类中使超类中的方法不可用吗? 结果我想看派生 - 对象

我看到有些人不理解我想要的东西所以我会试着解释一下:

我想只修改超类,我不想修改我的子类..例如,如果我将使用我的超类和jar与我的孩子一起制作jar。我不想改变所有的jar ..我想将方法​​添加到超类中并使其可用于超类.. 这样的代码

    public class Main {
    public static void main(String[] args) {
        Derived d = new Derived();
        int i = 5;
        d.Foo(i);
        Base b = new Base();
        b.Foo(i);
    }
}

给我

派生 - 对象     base - int

4 个答案:

答案 0 :(得分:2)

您应该在基类中使用Foo方法的以下签名:

public void Foo(Object i) {
    System.out.println("base - int");
}

这样您就可以从基类覆盖方法Foo。现在你不要覆盖这个方法,而是重载它。

如果要在基类中使用public void Foo(int i)签名,则可以在基类中将Foo方法定义为private

PS:我希望我能理解你。

答案 1 :(得分:2)

  • 私人成员仅限于班级范围。
  • 默认(此处没有关键字)仅限于同一个套餐的其他成员。
  • 受保护仅限于层次结构。
  • 公开不受限制。

因此,如果您不希望您的子类访问超类的成员(成员意味着方法,枚举,变量......),您应该像这样声明您的foo:

public class Base {

    private void Foo(int i) {
        System.out.println("base - int");
    }
}

从我的评论中编辑: 如果你不希望子类在编译时访问父成员,我看不到任何方法仍允许外部类访问它。 您希望阻止从近距离访问,同时允许更广泛的范围。这只能通过重写方法并为访问或者在编译时但在运行时抛出异常来完成。虽然您可以使用自定义注释,但我不知道如何执行此操作。

答案 2 :(得分:1)

您可以将方法设为final,这意味着子类不能覆盖它。

如果您不这样做并且子类重写该方法,则无法从main调用super class方法。

公约说明:请在java中使用小写方法名称。

答案 3 :(得分:1)

package com.abc;


public class TestParentChild {

    public static void main(String[] asd) {
        Base b = new ChildB();
        b.foo(5);
    }
}

class Base {
    public void foo(int i) {
        System.out.println("derived - int");
    }

}

class ChildB extends Base {
    public void foo(int i) {
        System.out.println("derived - object");
    }
}

这可能对您有所帮助