Java 正确重写已在父方法中实现的祖父母方法

Java 正确重写已在父方法中实现的祖父母方法,java,polymorphism,overriding,decorator,Java,Polymorphism,Overriding,Decorator,编辑:看来我的问题完全来自其他地方。如果您还没有阅读本主题的其余部分,我有一个a类、一个B类扩展a类、一个B类编辑器扩展B类。 我原以为我无法在我的decorator中重写类B中的特定函数,但经过几天的测试和试用,我的问题似乎在于创建线程的方式。 class A实现Runnable,并有一个函数listen()创建线程并调用start()。 我用参数this创建线程。这一点很重要,因为在创建线程的特定时间,此将属于B类 newbdecorator(newb()); //^线程是在创建此对象时创建

编辑:看来我的问题完全来自其他地方。如果您还没有阅读本主题的其余部分,我有一个
a类
、一个
B类
扩展
a类
、一个
B类编辑器
扩展
B类
。 我原以为我无法在我的decorator中重写
类B
中的特定函数,但经过几天的测试和试用,我的问题似乎在于创建线程的方式。
class A
实现Runnable,并有一个函数
listen()
创建线程并调用
start()
。 我用参数this创建线程。这一点很重要,因为在创建线程的特定时间,
将属于
B类

newbdecorator(newb());
//^线程是在创建此对象时创建的,然后才能作为参数传递给BDecorator
由于线程属于
类B
,因此它将调用用于创建它的
B对象的
foo()

虽然我不会说这个问题已经解决了,但它现在是一个完全不同的问题,与多态性无关。非常感谢。 @akuzminykh、@dreamcrash和@Itay Dumay帮助我解决了这个问题,并正确地格式化了这篇文章


我有一个抽象的
类A
,实现Runnable
A
run()
方法(简称)中执行以下操作:

final public void run(){
试一试{
这个.foo(message),;
}
//...
}
A类
还具有以下功能:

受保护的抽象void foo(字符串消息);
装饰器的第一次迭代:覆盖foo函数。

然后我创建了一个类B,它不是抽象的,这样做:

公共类B扩展了{
//构造函数和getter/setter都在这里
受保护的void foo(字符串消息){
System.out.println(消息);
}
}
这段代码运行良好。此后,我决定通过创建一个装饰器,在
B
中添加一些不会改变整个应用程序工作方式的功能

公共类BDecorator扩展了B{
B装饰B;
公共图书馆(B){
this.decoratedB=b;
}
@凌驾
受保护的void foo(字符串消息){
this.decoratedB.foo(“测试foo装饰程序:“+消息”);
}
}
简而言之,我试图覆盖一个来自父母的方法,这个方法已经从他们自己的父母那里实现了所述方法(孙辈覆盖了来自父母的方法,实现了来自祖父母的方法)

装饰器的第二次迭代:覆盖在
B
中创建的新条形函数

奇怪的是,我还有一个用
B
编写的方法,就像这样:

公共类B扩展了{
//构造函数和getter/setter都在这里
受保护的void foo(字符串消息){
System.out.println(消息);
}
受保护的空栏(字符串消息){
System.out.println(消息);
}
}
条码
A类
中的任何位置都不存在。 我可以确认程序将使用以下覆盖(当我放置断点时)实际调用
BDecorator::bar()

公共类BDecorator扩展了B{
B装饰B;
公共图书馆(B){
this.decoratedB=b;
}
@凌驾
受保护的void foo(字符串消息){
this.decoratedB.foo(“测试foo装饰程序:“+消息”);
}
//此方法不在A中。它只存在于B中,并且由于某些原因被调用。
@凌驾
受保护的空栏(字符串消息){
this.decoratedB.bar(“测试条装饰程序:+消息”);
}
}
以下是我的主要经历:

B firstTestSubject=new-BDecorator(新的B(…);
B计算器secondTestSubject=新的计算器(新的B(…);
//让我们测试两个foo函数
foo(“你好,世界!”);
foo(“你好,世界!”);
//现在让我们测试两个条形函数
firstTestSubject.bar(“再见,世界!”);
第二个testsubject.bar(“再见世界!)”;
输出:

> Hello world!
> Hello world!
> Testing a bar decorator: Goodbye world!
> Testing a bar decorator: Goodbye world!
问题是:为什么从未调用来自
BDecorator
foo override

问题是:为什么从未调用来自BDecorator的
foo
覆盖

它被称为:

BDecorator
类中,添加以下
语句

@Override
protected void foo(String message) {
    System.out.println("Do I even exist?");
    this.decoratedB.foo("Testing a foo decorator: " + message);
}
输出:

Do I even exist?
Testing a foo decorator: Hello world!
Do I even exist?
Testing a foo decorator: Hello world!
Testing a bar decorator: Goodbye world!
Testing a bar decorator: Goodbye world!
调用
BDecorator
类中的foo方法,然后将调用从传递给
BDecorator
构造函数的B转发到
foo
方法

new BDecorator(new B(...));
B
中的实例对象

问题是:为什么从未调用来自BDecorator的
foo
覆盖

它被称为:

BDecorator
类中,添加以下
语句

@Override
protected void foo(String message) {
    System.out.println("Do I even exist?");
    this.decoratedB.foo("Testing a foo decorator: " + message);
}
输出:

Do I even exist?
Testing a foo decorator: Hello world!
Do I even exist?
Testing a foo decorator: Hello world!
Testing a bar decorator: Goodbye world!
Testing a bar decorator: Goodbye world!
调用
BDecorator
类中的foo方法,然后将调用从传递给
BDecorator
构造函数的B转发到
foo
方法

new BDecorator(new B(...));
B
中的实例对象