一个简单的需求,竟然不会用 Java 写了。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cheneydog
V2EX    问与答

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

  •  
  •   cheneydog 2022-09-08 05:20:13 +08:00 3106 次点击
    这是一个创建于 1135 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 方法?

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

    题主似乎是想把某个类的方法包装成多线程执行,如果是我的话 我会选择组合而不是继承。
    sutra
        10
    sutra  
       2022-09-08 11:54:32 +08:00
    @wangxiaoaer 我去,会。那需要 SubClass.super.func1();
    AllenTsui
        11
    AllenTsui  
       2022-09-08 15:05:55 +08:00
    因为这行写在 Runnable 的匿名内部类中,super 指向了 Runnable ,需要显式加上类名:见 1 楼
    admol
        12
    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
        13
    winglight2016  
       2022-09-08 19:28:45 +08:00
    @wangxiaoaer 的确,这个子类根本就不需要复用父类的属性和方法,继承是用错了。
    wdwwtzy
        14
    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
        15
    ccde8259  
       2022-09-09 15:15:41 +08:00
    第一时间想到的是 cglib 的 Enhancer 的写法……
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6357 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 02:31 PVG 10:31 LAX 19:31 JFK 22:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86