【问题标题】:How to make some methods from superclass not avaliable in child class如何使超类中的某些方法在子类中不可用
【发布时间】:2012-08-15 07:05:47
【问题描述】:

假设我有一堂课

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。我不想改变所有的罐子..我想将方法​​添加到超类中并使其可用于超类.. 还有这样的代码

    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);
    }
}

给我

派生 - 对象 基数 - 整数

【问题讨论】:

  • 我知道c++和c#有一些功能可以帮助解决这个问题,但我不知道如何在java中实现
  • 使用 @Override 注释也可能会有所帮助,以便您在编译时知道您实际上是在覆盖基方法。
  • 现在您尝试与覆盖/重载、继承和装箱/拆箱作斗争。通常这是一个坏主意。您可以尝试发现 Java 语言规范,以完全了解编译器如何决定它应该使用的确切方法。也许你能以某种方式解决你的问题,但如果你这样做了,你的 API 将很难理解。

标签: java inheritance polymorphism


【解决方案1】:

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

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

这样你可以覆盖基类中的方法Foo。现在你不重写这个方法,而是重载它。

如果你想在你的基类中使用public void Foo(int i)签名,那么你可以在基类中定义Foo方法为private

PS:希望我能理解你。

【讨论】:

  • 但是如果我把它设为私有我就不能这样写 Base base = new Base; base.foo(5);
  • 如果你想总是能够覆盖你应该使用这个:public void Foo(Object... i) 它应该捕获所有东西
  • @Aleksei 如果孩子在编译时无法访问,我看不到任何让外部类访问它的方法。您希望在允许更大范围的同时阻止关闭范围。这只能通过重写方法并抛出访问违规或其他异常来完成
【解决方案2】:
  • private 成员仅限于类范围。
  • 默认(这个没有关键字)仅限于同一包的其他成员。
  • 受保护仅限于层次结构。
  • 公开不受限制。

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

public class Base {

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

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

【讨论】:

    【解决方案3】:

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

    如果你不这样做并且子类覆盖了方法,你就不能从你的主类调用超类方法。

    约定注意事项:请在 java 中使用小写的方法名。

    【讨论】:

    • 当我在超类中使我的 foo 方法最终并运行程序时,我看到“base - int”。所以我认为我的子类覆盖了方法((
    【解决方案4】:
    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");
        }
    }
    

    这可能对你有帮助

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 2014-03-22
      • 2012-05-24
      • 1970-01-01
      • 2012-02-25
      • 2020-07-15
      相关资源
      最近更新 更多