[#0x0002] constructor其实是一个static,且返回void

本文探讨了在Java中main方法如何调用同一类内的静态方法及非静态方法的区别。解释了为什么main方法只能直接调用静态方法和字段,并提到了构造函数的相关特性。

  姑且称包含main方法的类为main class。
  在main方法里,若想直接调用main class的其他方法,必须将该方法设为static。换言之,main方法只能直接调用main class的static方法,non-static方法不能直接调用(原因很简单,因为main方法此时没有创建main class对象)。
  同理,main方法对main class的field的直接访问也是如此。
  不过,main方法可以直接调用main class的constructor(然后就能访问main class的non-static member了)。这从一个侧面说明,constructor其实是一个static。

 

(4月7日补充:见[#0x0018],constructor返回void)

Quit anyway? (y or n) y root@hobot:/map/gus/Release-J6-20251117-71cf856a7/log/dlt# ../../MemoryCruiseService [libprotobuf FATAL google/protobuf/generated_message_util.cc:811] CHECK failed: (scc->visit_status.load(std::memory_order_relaxed)) == (SCCInfoBase::kRunning): terminate called after throwing an instance of &#39;google::protobuf::FatalException&#39; what(): CHECK failed: (scc->visit_status.load(std::memory_order_relaxed)) == (SCCInfoBase::kRunning): Aborted (core dumped) root@hobot:/map/gus/Release-J6-20251117-71cf856a7/log/dlt# gdb ../../MemoryCruiseService GNU gdb (Debian 13.1-3) 13.1 Copyright (C) 2023 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "aarch64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ../../MemoryCruiseService... (gdb) r Starting program: /map/gus/Release-J6-20251117-71cf856a7/MemoryCruiseService [Thread debugging using libthread_db enabled] Using host libthread_db library "/usr/lib/aarch64-linux-gnu/libthread_db.so.1". [New Thread 0xffffe3eacc40 (LWP 72484)] [New Thread 0xffffdfe9cc40 (LWP 72485)] [New Thread 0xffffd9e8cc40 (LWP 72486)] [New Thread 0xffffd5e7cc40 (LWP 72487)] [New Thread 0xffffd0e6cc40 (LWP 72488)] [libprotobuf FATAL google/protobuf/generated_message_util.cc:811] CHECK failed: (scc->visit_status.load(std::memory_order_relaxed)) == (SCCInfoBase::kRunning): terminate called after throwing an instance of &#39;google::protobuf::FatalException&#39; what(): CHECK failed: (scc->visit_status.load(std::memory_order_relaxed)) == (SCCInfoBase::kRunning): Thread 1 "MemoryCruiseSer" received signal SIGABRT, Aborted. __pthread_kill_implementation (threadid=281474505965600, signo=signo@entry=6, no_tid=no_tid@entry=0) at ./nptl/pthread_kill.c:44 44 ./nptl/pthread_kill.c: No such file or directory. (gdb) where #0 __pthread_kill_implementation (threadid=281474505965600, signo=signo@entry=6, no_tid=no_tid@entry=0) at ./nptl/pthread_kill.c:44 #1 0x0000ffffe9a10a64 in __pthread_kill_internal (signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:78 #2 0x0000ffffe99ca76c in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #3 0x0000ffffe99b74bc in __GI_abort () at ./stdlib/abort.c:79 #4 0x0000ffffe9cc49c8 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/aarch64-linux-gnu/libstdc++.so.6 #5 0x0000ffffe9cc23bc in ?? () from /usr/lib/aarch64-linux-gnu/libstdc++.so.6 #6 0x0000ffffe9cc2420 in std::terminate() () from /usr/lib/aarch64-linux-gnu/libstdc++.so.6 #7 0x0000ffffe9cc2704 in __cxa_throw () from /usr/lib/aarch64-linux-gnu/libstdc++.so.6 #8 0x0000ffffed6d4e6c in google::protobuf::internal::LogMessage::Finish() () from /map/kotei/OSS/lib/j5/protobuf/libprotobuf.so.24 #9 0x0000ffffed6d4ea8 in google::protobuf::internal::LogFinisher::operator=(google::protobuf::internal::LogMessage&) () from /map/kotei/OSS/lib/j5/protobuf/libprotobuf.so.24 #10 0x0000ffffed709bb0 in google::protobuf::internal::InitSCCImpl(google::protobuf::internal::SCCInfoBase*) () from /map/kotei/OSS/lib/j5/protobuf/libprotobuf.so.24 #11 0x0000fffff718a654 in google::protobuf::internal::InitSCC(google::protobuf::internal::SCCInfoBase*) () from ../../ALGORITHM/lib/libcruiseplanning_j5.so #12 0x0000fffff71a341c in apollo::common::StatusPb::SharedCtor() () from ../../ALGORITHM/lib/libcruiseplanning_j5.so #13 0x0000fffff71a1ea8 in apollo::common::StatusPb::StatusPb(google::protobuf::Arena*) () from ../../ALGORITHM/lib/libcruiseplanning_j5.so #14 0x0000fffff71a30d8 in apollo::common::StatusPb::StatusPb() () from ../../ALGORITHM/lib/libcruiseplanning_j5.so #15 0x0000fffff11f1a90 in InitDefaultsscc_info_StatusPb_map_5fapollo_2fcommon_5fmsgs_2fbasic_5fmsgs_2ferror_5fcode_2eproto() () from ../../ALGORITHM/lib/libcru_planning_j5.so #16 0x0000ffffed70998c in google::protobuf::internal::(anonymous namespace)::InitSCC_DFS(google::protobuf::internal::SCCInfoBase*) () from /map/kotei/OSS/lib/j5/protobuf/libprotobuf.so.24 #17 0x0000ffffed7098e0 in google::protobuf::internal::(anonymous namespace)::InitSCC_DFS(google::protobuf::internal::SCCInfoBase*) () from /map/kotei/OSS/lib/j5/protobuf/libprotobuf.so.24 #18 0x0000ffffed7098e0 in google::protobuf::internal::(anonymous namespace)::InitSCC_DFS(google::protobuf::internal::SCCInfoBase*) () from /map/kotei/OSS/lib/j5/protobuf/libprotobuf.so.24 #19 0x0000ffffed709bf0 in google::protobuf::internal::InitSCCImpl(google::protobuf::internal::SCCInfoBase*) () from /map/kotei/OSS/lib/j5/protobuf/libprotobuf.so.24 #20 0x0000fffff718a654 in google::protobuf::internal::InitSCC(google::protobuf::internal::SCCInfoBase*) () from ../../ALGORITHM/lib/libcruiseplanning_j5.so #21 0x0000ffffed822420 in google::protobuf::(anonymous namespace)::AddDescriptorsImpl(google::protobuf::internal::DescriptorTable const*) () from /map/kotei/OSS/lib/j5/protobuf/libprotobuf.so.24 #22 0x0000ffffed822570 in google::protobuf::internal::AddDescriptors(google::protobuf::internal::DescriptorTable const*) () from /map/kotei/OSS/lib/j5/protobuf/libprotobuf.so.24 #23 0x0000ffffeb3809d8 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /workspace/proto/msg_series_c/map_msg_apollo.pb.cc:100 #24 0x0000ffffeb380a08 in _GLOBAL__sub_I_map_msg_apollo.pb.cc(void) () at /deps/include/google/protobuf/port_undef.inc:107 #25 0x0000fffff7fb431c in call_init (env=0xffffffffecf8, argv=0xffffffffece8, argc=1, l=<optimized out>) at ./elf/dl-init.c:90 #26 call_init (l=<optimized out>, argc=1, argv=0xffffffffece8, env=0xffffffffecf8) at ./elf/dl-init.c:27 #27 0x0000fffff7fb4424 in _dl_init (main_map=0xfffff7ff1380, argc=1, argv=0xffffffffece8, env=0xffffffffecf8) at ./elf/dl-init.c:137 #28 0x0000fffff7fca9b8 in _start () at ../sysdeps/aarch64/dl-start.S:46 (gdb) q A debugging session is active. Inferior 1 [process 72233] will be killed. Quit anyway? (y or n) y root@hobot:/map/gus/Release-J6-20251117-71cf856a7/log/dlt#
11-18
.class public Lcom/example/floatingball/FloatingBallService; .super Ljava/lang/Object; .source "FloatingBallService.java" # static fields .field private static floatingBall:Landroid/view/View; .field private static windowManager:Landroid/view/WindowManager; .field private static initialX:I .field private static initialY:I .field private static initialTouchX:F .field private static initialTouchY:F # direct methods .method public static constructor <clinit>()V .registers 1 const/4 v0, 0x0 sput-object v0, Lcom/example/floatingball/FloatingBallService;->floatingBall:Landroid/view/View; sput-object v0, Lcom/example/floatingball/FloatingBallService;->windowManager:Landroid/view/WindowManager; sput v0, Lcom/example/floatingball/FloatingBallService;->initialX:I sput v0, Lcom/example/floatingball/FloatingBallService;->initialY:I return-void .end method .method public static constructor <init>()V invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method .method public static start(Landroid/content/Context;)V .registers 10 .local p0, "context":Landroid/content/Context; # 检查是否已创建 sget-object v0, Lcom/example/floatingball/FloatingBallService;->floatingBall:Landroid/view/View; if-nez v0, :end # 获取 WindowManager const-string v0, "window" invoke-virtual {p0, v0}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; move-result-object v0 check-cast v0, Landroid/view/WindowManager; sput-object v0, Lcom/example/floatingball/FloatingBallService;->windowManager:Landroid/view/WindowManager; # 创建 ImageView new-instance v1, Landroid/widget/ImageView; invoke-direct {v1, p0}, Landroid/widget/ImageView;-><init>(Landroid/content/Context;)V sput-object v1, Lcom/example/floatingball/FloatingBallService;->floatingBall:Landroid/view/View; # 设置图标 (系统内置) const v2, 0x108009b # android.R.drawable.ic_dialog_info invoke-virtual {v1, v2}, Landroid/widget/ImageView;->setImageResource(I)V # 创建 LayoutParams const/4 v2, 0x64 # 100px invoke-static {}, Landroid/os/Build$VERSION;->getSdkInt()I move-result v3 const/16 v4, 0x18 # API 24 if-lt v3, v4, :type_phone const/16 v3, 0x1000024 # TYPE_APPLICATION_OVERLAY goto :set_type :type_phone const/16 v3, 0x00000022 # TYPE_PHONE :set_type const/high16 v4, 0x00000040 # FLAG_NOT_FOCUSABLE | FLAG_LAYOUT_IN_SCREEN invoke-static {v2, v2, v3, v4, -0x3}, Landroid/view/WindowManager$LayoutParams;-><init>(IIIILint;)V move-result-object v3 # Gravity: TOP | LEFT const/16 v4, 0x0050 invoke-virtual {v3, v4}, Landroid/view/WindowManager$LayoutParams;->setGravity(I)V # 设置宽高 invoke-virtual {v3, v2}, Landroid/view/WindowManager$LayoutParams;->setWidth(I)V invoke-virtual {v3, v2}, Landroid/view/WindowManager$LayoutParams;->setHeight(I)V # 设置触摸监听 new-instance v4, Lcom/example/floatingball/FloatingBallService$TouchListener; invoke-direct {v4}, Lcom/example/floatingball/FloatingBallService$TouchListener;-><init>()V invoke-virtual {v1, v4}, Landroid/view/View;->setOnTouchListener(Landroid/view/View$OnTouchListener;)V # 添加到窗口 sget-object v4, Lcom/example/floatingball/FloatingBallService;->windowManager:Landroid/view/WindowManager; invoke-interface {v4, v1, v3}, Landroid/view/WindowManager;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V :end return-void .end method # 内部类 TouchListener .class public Lcom/example/floatingball/FloatingBallService$TouchListener; .super Ljava/lang/Object; .implements Landroid/view/View$OnTouchListener; .method public constructor <init>()V invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method .method public onTouch(Landroid/view/View;Landroid/view/MotionEvent;)Z .registers 10 .local p2, "event":Landroid/view/MotionEvent; invoke-virtual {p2}, Landroid/view/MotionEvent;->getAction()I move-result v0 packed-switch v0, :sw_data const/4 v0, 0x0 return v0 :case_down invoke-virtual {p2}, Landroid/view/MotionEvent;->getX()F move-result v1 invoke-virtual {p2}, Landroid/view/MotionEvent;->getY()F move-result v2 sput v1, Lcom/example/floatingball/FloatingBallService;->initialTouchX:F sput v2, Lcom/example/floatingball/FloatingBallService;->initialTouchY:F invoke-virtual {p1}, Landroid/view/View;->getLeft()I move-result v1 invoke-virtual {p1}, Landroid/view/View;->getTop()I move-result v2 sput v1, Lcom/example/floatingball/FloatingBallService;->initialX:I sput v2, Lcom/example/floatingball/FloatingBallService;->initialY:I const/4 v0, 0x1 return v0 :case_move invoke-virtual {p2}, Landroid/view/MotionEvent;->getX()F move-result v1 invoke-virtual {p2}, Landroid/view/MotionEvent;->getY()F move-result v2 sget v3, Lcom/example/floatingball/FloatingBallService;->initialX:I sget v4, Lcom/example/floatingball/FloatingBallService;->initialTouchX:F sub-float/2addr v1, v4 invoke-static {v1}, Ljava/lang/Math;->round(F)I move-result v1 add-int/2addr v1, v3 sget v3, Lcom/example/floatingball/FloatingBallService;->initialY:I sget v4, Lcom/example/floatingball/FloatingBallService;->initialTouchY:F sub-float/2addr v2, v4 invoke-static {v2}, Ljava/lang/Math;->round(F)I move-result v2 add-int/2addr v2, v3 invoke-virtual {p1, v1, v2, v1, v2}, Landroid/view/View;->layout(IIII)V const/4 v0, 0x1 return v0 :case_up invoke-virtual {p2}, Landroid/view/MotionEvent;->getX()F move-result v1 invoke-virtual {p2}, Landroid/view/MotionEvent;->getY()F move-result v2 sget v3, Lcom/example/floatingball/FloatingBallService;->initialTouchX:F sub-float/2addr v1, v3 invoke-static {v1}, Ljava/lang/Math;->abs(F)F move-result v1 sget v3, Lcom/example/floatingball/FloatingBallService;->initialTouchY:F sub-float/2addr v2, v3 invoke-static {v2}, Ljava/lang/Math;->abs(F)F move-result v2 const/high16 v3, 0x3f000000 # 0.5f cmpl-float v1, v1, v3 cmpg-float v2, v2, v3 or-int/2addr v1, v2 if-nez v1, :not_click # 单击事件:显示 Toast const-string v1, "悬浮球被点击!" const/4 v2, 0x0 invoke-static {p0, v1, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v1 invoke-virtual {v1}, Landroid/widget/Toast;->show()V :not_click const/4 v0, 0x1 return v0 nop :sw_data .packed-switch 0x0 :case_down :case_move :case_up .end packed-switch .end method 完整写出修改后方案
10-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值