菜鸟一枚,如果问题问的不恰当请各位轻喷。
第二次编辑:抱歉各位!我似乎误导了大家!
在学习客户端与服务器端的通信时,当中这么一段代码:
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不停的创建..这样为什么可以呢?
객체에는 범위가 있습니다. 예를 들어 첫 번째 루프의 serverThread는 루프가 끝나면 소멸됩니다. 즉, while(true) {...의 "{"와 "}" 사이의 범위에 속합니다. } .
C 언어는
{ }
만 작성하면 1단계 범위가 생성됩니다. 그래서serverThread
은 함수의 지역변수와 비슷합니다. 각 루프는 함수에 대한 서로 다른 호출이므로 문제가 없습니다.각 루프를 범위로 사용할 수 있습니다. 두 번째는 동일한 범위에 두 개의 동일한 변수 이름이 있다는 점입니다. 이는 절대 불가능합니다.
두 번째 변수의 이름을 변경하면 됩니다.
보충: 변수는 루프 내부의 지역 변수입니다. 이렇게 생각할 수 있습니다. 이 루프와 다음 루프는 동일한 범위에 있지 않으므로 본질적으로 다른 범위에서 동일한 변수를 생성합니다. 변수의.
으아아아
사실 이건 그냥 반복되는 변수 선언 오류입니다
으아악이렇게 말하면 다들 말씀하신 것과 같습니다.
ServerThread serverThread = new ServerThread(socket);
으로 오면 serverThread 변수는 실제로 소멸됩니다. 더 이상 존재하지 않으므로 다시 선언할 수 있습니다
동일 범위에 이미 존재하는 변수는 반복적으로 선언할 수 없지만 가능합니다.
으아아아Class A{
Int a = 0;
void methodB(){
}
}