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 方法?
1 GuuJiang 2022-09-08 07:17:23 +08:00 via iPhone SubClass.super.func1() 原因是你这里是在一个匿名内部类里 |
![]() | 3 sutra 2022-09-08 08:11:33 +08:00 SubClass.this.func1(); |
![]() | 5 sutra 2022-09-08 08:14:22 +08:00 SomeClass.this is used inside anonymous classes to refer to the enclosing class. |
6 dqzcwxb 2022-09-08 09:16:16 +08:00 把匿名内部类换成 lambda 写法 |
7 TWorldIsNButThis 2022-09-08 09:36:00 +08:00 via iPhone 为什么不用 lambda ?远离匿名内部类,它会让你变得不幸 |
8 daimubai 2022-09-08 11:24:30 +08:00 lambda 的 this 指向的是外部类,所以可以直接使用 super. func1()。 匿名内部类的 this 指向的就是自己,所以找不到的。 |
9 wangxiaoaer 2022-09-08 11:36:04 +08:00 @sutra SubClass.this.func1();这样会不会死循环了?因为那个 fun1 已经 override 了。 题主似乎是想把某个类的方法包装成多线程执行,如果是我的话 我会选择组合而不是继承。 |
![]() | 10 sutra 2022-09-08 11:54:32 +08:00 @wangxiaoaer 我去,会。那需要 SubClass.super.func1(); |
![]() | 11 AllenTsui 2022-09-08 15:05:55 +08:00 因为这行写在 Runnable 的匿名内部类中,super 指向了 Runnable ,需要显式加上类名:见 1 楼 |
![]() | 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(); |
![]() | 13 winglight2016 2022-09-08 19:28:45 +08:00 @wangxiaoaer 的确,这个子类根本就不需要复用父类的属性和方法,继承是用错了。 |
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(); } } ``` |
15 ccde8259 2022-09-09 15:15:41 +08:00 第一时间想到的是 cglib 的 Enhancer 的写法…… |