1

假设我有一堂课

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

给我吗

派生 - 对象 基础 - int

4

4 回答 4

2

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

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

这样您就可以覆盖Foo基类中的方法。现在您不覆盖此方法,而是重载它。

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

PS:希望我能理解你。

于 2012-08-15T07:09:17.083 回答
2
  • 私有成员仅限于类范围。
  • 默认(这个没有关键字)仅限于同一包的其他成员。
  • protected仅限于层次结构。
  • 公众不受限制。

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

public class Base {

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

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

于 2012-08-15T07:14:39.420 回答
1

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

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

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

于 2012-08-15T07:09:51.550 回答
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");
    }
}

这可能会帮助你

于 2012-08-15T07:22:57.823 回答