大家好,我对java很陌生,还在学习OOP原理。直接回答问题。所以我有一个抽象类和两个继承自它的类。看起来是这样的:
public abstract class A { ... }
public class B extends A {
...
void methodB() { ... }
public class C extends A {
...
void methodC() { ... }
现在我做到了:
A a = null;
if (that)
a = new B();
else
a = new C();
在这一点上,我想做a.methodB();
或a.methodC();
(当然不是两者都做,因为我创建了一个孩子),但我两者都不能做。
这是您可以做到的:
if (a instanceof B) ((B)a).methodB();
else if (a instanceof C) ((C)a).methodC();
但这是一个反模式,我建议将方法A
定义为A
抽象
类
中的抽象
方法。B
和C
将实现它两者,然后您可以轻松调用a.methodA()
,然后将调用方法A
的正确实现。
如何从父抽象类调用childs类方法
这是不可能的。使用超类型的引用,您只能根据权限改造机制直接访问超类型的成员。但是,您可以强制转换对子类的引用并访问子类的成员。
对其使用instanceof运算符。
演示:
abstract class SomeA {
abstract void commonMethod();
}
class SomeB extends SomeA {
void methodB() {
System.out.println("methodB()");
}
@Override
public void commonMethod() {
System.out.println("SomeB's implementation of commonMethod()");
}
}
class SomeC extends SomeA {
void methodC() {
System.out.println("methodC()");
}
@Override
public void commonMethod() {
System.out.println("SomeC's implementation of commonMethod()");
}
}
public class Testing {
public static void main(String[] args) {
SomeB bb = new SomeB();
bb.commonMethod();
bb.methodB();
SomeC cc = new SomeC();
cc.commonMethod();
cc.methodC();
SomeA b = new SomeB();
SomeA c = new SomeC();
System.out.println(b instanceof SomeB);
System.out.println(c instanceof SomeB);
System.out.println(b instanceof SomeC);
System.out.println(c instanceof SomeC);
b.commonMethod();
// b.methodB();//Error as b is a reference of super type
((SomeB) b).commonMethod();// Fine after casting the super type reference to SomeB
c.commonMethod();
// c.methodC();//Error as c is a reference of super type
((SomeC) c).commonMethod();// Fine after casting the super type reference to SomeC
}
}
输出:
SomeB's implementation of commonMethod()
methodB()
SomeC's implementation of commonMethod()
methodC()
true
false
false
true
SomeB's implementation of commonMethod()
SomeB's implementation of commonMethod()
SomeC's implementation of commonMethod()
SomeC's implementation of commonMethod()
你违反了OOPS的概念。因为父类不需要知道子类的行为。你可以做的是在A类中创建一个抽象方法,然后调用方法A。某物()。只需在B和C类中覆盖它的某物方法,并给出相同的实现,您可以在方法B和方法C中给出相同的实现。
public abstract class A { abstract something(); }
public class B { overide something(){} }
public class C { overide something(){} }
A a = null;
if (that)
a = new B();
else
a = new C();
if that is true then it equivalent to B.something() else C.something(). You can read more about method overriding/runtime polymorphism.
问题内容: 我有以下课程 这只是我实际架构的简化版本。最初,我不知道需要创建的人员类型,因此处理这些对象创建的函数将常规对象作为参数。 现在,我想使用此父类对象访问子类的方法。我还需要不时访问父类方法,所以 我不能 使其 抽象 。 我想我在上面的示例中简化太多了,所以这是实际的结构。 if语句显示“无法为QuestionOption找到getMultiple”。OuestionOption具有更多
这似乎是一个基本问题。但在采访前需要澄清。 我在抽象类中有一个非抽象方法。它的具体类重写了该方法。但我想调用父类的原始方法来调用,而不是重写方法。有什么办法吗? 据我所知,没有办法调用原始方法?
问题内容: 我想在自己的类中调用抽象类的方法。抽象类是: 我想调用上面的方法,并且调用的类是: 每当我尝试运行上述类时,它都会在line上引发NullPointerException 。谁能告诉我如何解决这个问题? 问题答案: 首先,一个抽象类,因此您不能直接实例化它。您必须创建一个子类,比如说它覆盖Call中的任何抽象方法。 获得一个意味着您作为参数传入的任何内容都尚未初始化。因此,在创建Cal
问题内容: 在Python中创建简单的对象层次结构时,我希望能够从派生类中调用父类的方法。在Perl和Java中,有一个用于此的关键字()。在Perl中,我可以这样做: 在Python中,似乎必须从子代中明确命名父类。在上面的示例中,我将不得不执行。 这似乎不正确,因为这种行为使创建深层次结构变得困难。如果孩子们需要知道哪个类定义了一个继承的方法,那么就会造成各种各样的信息痛苦。 这是python
这是一个与实现相关的问题,或者我可能想多了。假设我有一个子类继承了父类。根据我的理解,它将继承父类的方法定义,而不是构造函数。我们需要通过超级方法调用提供或编译器将提供构造函数。我们这样做的原因是,如果没有父类对象实例,我们从子类中的父类获得的方法定义将不存在。 这是否意味着,当我调用父类对象定义的方法(该方法尚未在子类中重写)时,将在父对象实例的子类内部调用?我在想,由于子类会调用父类构造函数并
下面是抽象类的代码: 现在,我应该如何为编写单元测试,并且应该如何在中模拟会话? 我在Stackoverflow上尝试了不同的解决方案,但仍然无法模拟它并获得会话模拟。