一个简单的需求,竟然不会用 Java 写了。

2022-09-08 05:20:13 +08:00
 cheneydog
public class BaseClass {

    public void func1(){
        System.out.println("fun1");
    }

    public void func2(){
        System.out.println("fun2");
    }

    public void func3(){
        System.out.println("fun3");
    }
}

public class SubClass extends BaseClass {

    private void superFunc1(){
        super.func1();
    }

    @Override
    public void func1() {

        new Thread(new Runnable() {
            @Override
            public void run() {

                // super.func1();  // 错误写法
                superFunc1(); // 能用但是麻烦

            }
        }).start();

    }
}

我就写个例子,子类要把父类的方法放到独立线程里执行。我难道真的要把所有方法都包装一个 superXXX 方法?

2859 次点击
所在节点    问与答
15 条回复
GuuJiang
2022-09-08 07:17:23 +08:00
SubClass.super.func1()
原因是你这里是在一个匿名内部类里
n2l
2022-09-08 08:05:46 +08:00
@GuuJiang 没懂,再指点一下?
sutra
2022-09-08 08:11:33 +08:00
SubClass.this.func1();
n2l
2022-09-08 08:11:43 +08:00
@GuuJiang 哦,明白了,多谢!
sutra
2022-09-08 08:14:22 +08:00
SomeClass.this is used inside anonymous classes to refer to the enclosing class.
dqzcwxb
2022-09-08 09:16:16 +08:00
把匿名内部类换成 lambda 写法
TWorldIsNButThis
2022-09-08 09:36:00 +08:00
为什么不用 lambda ?远离匿名内部类,它会让你变得不幸
daimubai
2022-09-08 11:24:30 +08:00
lambda 的 this 指向的是外部类,所以可以直接使用 super. func1()。
匿名内部类的 this 指向的就是自己,所以找不到的。
wangxiaoaer
2022-09-08 11:36:04 +08:00
@sutra SubClass.this.func1();这样会不会死循环了?因为那个 fun1 已经 override 了。

题主似乎是想把某个类的方法包装成多线程执行,如果是我的话 我会选择组合而不是继承。
sutra
2022-09-08 11:54:32 +08:00
@wangxiaoaer 我去,会。那需要 SubClass.super.func1();
AllenTsui
2022-09-08 15:05:55 +08:00
因为这行写在 Runnable 的匿名内部类中,super 指向了 Runnable ,需要显式加上类名:见 1 楼
admol
2022-09-08 18:13:16 +08:00
new Thread(super::func1).start();

// 或者
new Thread(new Runnable() {
@Override
public void run() {
SubClassService.super.func1();
}
}).start();
winglight2016
2022-09-08 19:28:45 +08:00
@wangxiaoaer 的确,这个子类根本就不需要复用父类的属性和方法,继承是用错了。
wdwwtzy
2022-09-08 19:41:30 +08:00
不考虑一下 C#吗?
```
public class BaseClass {
public void func1(){
Console.WriteLine("base func1");
}
}

public class SubClass : BaseClass {
public void func1() {
Task.Run(()=>{
base.func1();
}).Wait();
}
}
```
ccde8259
2022-09-09 15:15:41 +08:00
第一时间想到的是 cglib 的 Enhancer 的写法……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/878504

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX