java - 在循环里一直new对象为什么是可以的?
天蓬老师
天蓬老师 2017-04-17 17:26:53
0
6
881

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

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不停的创建..这样为什么可以呢?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(6)
PHPzhong

オブジェクトにはスコープがあります。たとえば、最初のループのserverThreadは、ループが終了すると破棄されます。つまり、while (true) {...の「{」と「}」の間のスコープに属します。 } .

いいねを押す +0
Ty80

C言語はブロックスコープです。{ }を書くと第一レベルのスコープが生成されます。したがって、serverThread は関数のローカル変数に似ています。各ループは関数の異なる呼び出しであるため、問題はありません。

いいねを押す +0
大家讲道理

各ループはスコープとして使用できます。2 つ目は、同じスコープ内に 2 つの同一の変数名があるということですが、これは絶対に不可能です。
2 番目の変数の名前を変更するだけです。
補足: 変数はループ内のローカル変数であると考えることができます。このループと次のループは同じスコープ内にないため、本質的には異なるスコープ内に同じ変数を作成することになります。変数の。

いいねを押す +0
大家讲道理

リーリー

いいねを押す +0
伊谢尔伦

実際には、これは単なる変数宣言エラーの繰り返しです

リーリー

これを言うと、皆さんが言ったことと同じです。実際には、
ServerThread serverThread = new ServerThread(socket);
に到達すると、serverThread 変数は破棄されます。実際には破棄されるため、再宣言することができます

いいねを押す +0
黄舟

同じスコープ内にすでに存在する変数を繰り返し宣言することはできませんが、これは可能です:
Class A{
Int a = 0;
void methodB(){

リーリー

}
}

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート