请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

成员变量与局部变量的转变

老师,ServerSocketChannel和 Selector都有成员变量转为局部变量的代码,想问下这里具体的作用是什么? 。和它的存储位置以及生存时间有关吗?

ServerSocketChannel server = ServerSocketChannel.open();
            // 设置为非阻塞
            server.configureBlocking(false);
            // 绑定本地端口
            server.socket().bind(new InetSocketAddress(port));
            // 注册客户端连接到达监听
            server.register(selector, SelectionKey.OP_ACCEPT);
            System.out.println("服务器信息:" + server.getLocalAddress());
            this.server = server;//将ServerSocketChannel///??????转为局部变量


            
            Selector selector = TCPServer.this.selector;///????转为局部变量
            System.out.println("服务器准备就绪~");

正在回答

1回答

Qiujuer 2020-02-20 00:11:24

转化为局部变量有几个考虑:

  1. 减少java虚拟机访问成员变量的查询过程,有一点点的时间优化,但是不是在循环中几乎无感知;也和虚拟机的实现有关。

  2. 大部分情况是为了解决,在方法中判断成员变量后使用成员变量的情况,比如if(server!=null)...,此时可能出现判断时不为空,后续使用为空的情况,而转化为局部变量后可以规避这样的空指针异常问题。


0 回复 有任何疑惑可以回复我~
  • 提问者 abel_星123 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-02-20 15:56:14
  • “判断时不为空,后续使用为空”,为什么会出现这样的情况呢?为什么转化成局部变量就可以解决呢,它们指向的不还是同一个地址区域吗?
    回复 有任何疑惑可以回复我~ 2020-11-09 17:32:26
  • Qiujuer 回复 小土boo #3
    如果是成员变量,每次使用时,都会从类的地址上去查找当前的变量,然后再在线程栈中使用,而局部变量可以理解为:就一次寻址,然后就在局部变量中存在了,随后都是栈中的局部使用,不存在多次类中变量查找的过程。所以一开始判断了就不需要再判断。
    回复 有任何疑惑可以回复我~ 2020-11-10 09:59:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信