V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cheneydog
V2EX  ›  问与答

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

  •  
  •   cheneydog · 2022-09-08 05:20:13 +08:00 · 2835 次点击
    这是一个创建于 806 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   3542 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 04:22 · PVG 12:22 · LAX 20:22 · JFK 23:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.