recherche

Maison  >  Questions et réponses  >  le corps du texte

java - 在循环里一直new对象为什么是可以的?

菜鸟一枚,如果问题问的不恰当请各位轻喷。
第二次编辑:抱歉各位!我似乎误导了大家!
在学习客户端与服务器端的通信时,当中这么一段代码:

while(true){
//等待客户端的连接
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
    //启动线程
serverThread.start();
}

我想问:为什么一个同名对象能一直被new出来(当客户端建立起一个连接时)?比如这个serverThread。
但是如果我这么写:

while(true){
//等待客户端的连接
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
    ServerThread serverThread = new ServerThread(socket);
    //启动线程
serverThread.start();
}

我知道这是错的,new相同名字的对象是不可以的。
但是在无限循环中,也是在不停的new出对象啊,ServerThread serverThread = new ServerThread(socket);
不停的被执行,serverThread不停的创建..这样为什么可以呢?

天蓬老师天蓬老师2769 Il y a quelques jours888

répondre à tous(6)je répondrai

  • PHPz

    PHPz2017-04-17 17:28:53

    对象有作用域,像第一个循环里的serverThread在结束一次循环时候就会被销毁,也就是在while(true){…}的“{”和“}”之间属于一个作用域。

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 17:28:53

    C语言是块作用域,只要你写了一个{ }就会生成一级作用域。所以serverThread 类似于函数的局部变量。每一次循环都是函数的不同调用,所以不会有什么问题。

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:28:53

    每次循环可以当一个作用域吧,第二个是在同一个作用域里有两个相同变量名了,肯定是不行的吧。
    把第二个变量名改下就好了吧。
    补充:你这个变量是循环内部的一个局部变量,你可以这么认为:这一次的循环和下一次的循环不在同一个作用域,所以你本质上是在不同的作用域创建了相同的名称的变量。

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:28:53

    while (true) {
        int localValue = 100;
        // int localValue = 200; // ERROR!在当前作用域,已经存在名为 localValue 的变量,不可重复声明变量
    }
    
    int localValue = 200; // OK!当前作用域没有名为 localValue 的变量

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:28:53

    实际上这个只是变量重复声明错误

    ServerThread serverThread = new ServerThread(socket);
    //serverThread 已经被声明你是无法再次声明。
    serverThread = new ServerThread(socket);

    你如果说这个的话就和大家说的一样serverThread变量实际上在一次循环后就会被销毁,再来到
    ServerThread serverThread = new ServerThread(socket);
    的时候serverThread实际上已经不存在了所以可以被重新声明

    répondre
    0
  • 黄舟

    黄舟2017-04-17 17:28:53

    同作用域已存在的变量不能重复声明,但这种情况是可以的:
    Class A{
    Int a = 0;
    void methodB(){

      Int a = 1;

    }
    }

    répondre
    0
  • Annulerrépondre