我是面向对象编码的新手,我有以下问题。
(请注意,this解决方案是我问题的一部分)
我需要一个许多对象可以引用的变量,但保留一些" private"每个对象的信息。更具体地说,我创建了一个名为procedure TForm1.ComboBox1Select(Sender: TObject);
begin
case ComboBox1.ItemIndex of
0: ComboBox1.Hint := '05498762';
1: ComboBox1.Hint := '';
.
.
.
end;
end;
的类,我希望该类的每个对象都具有类型为Worker
的唯一ID。所以,第一个对象有int
,第二个ID=1
等...请注意,我不想要一个随机整数,而我需要从0开始计数并增加...
在类
中声明和初始化变量ID=2
我尝试通过在构造函数体
中添加这行代码来实现增量static private int workId = 0;
我实例化一些对象,将它们添加到workId++;
并使用for循环我打印每个对象的变量。
ArrayList
和System.out.println("Worker ID: "+workerList.get(i).getWorkerId());
(类方法)由
getWorkerId()
问题是我的程序不会打印每个唯一的public int getWorkerId () { return this.workId; }
(因为它没有),而是静态变量的最后一个值(恰好是对象的数量)。< / p>
你能描述一下我的问题的解决方案吗?
答案 0 :(得分:7)
评论转过来了答案:
您已走上正轨。
目前,您创建的每个工作人员都会增加您的静态成员。这意味着它不会保存工作人员的ID(这可能不是这样,因为静态变量属于类而不是单个实例 ),而是保存到目前为止您创建的工作人员总数。
<强>修正强>
numWorkers
,以便反映它的作用id
(或workerId
,如果您愿意)workId++
更改为id = ++numWorkers
<强>为什么吗
现在,每个工人都有自己的id
。您可以通过查看当前创建的工作人员数(numWorkers
)来分配它,将该值递增1,然后将其分配给id
。这样,您的第一个工作人员ID将为1
,第二个将为2
,依此类推。 numWorkers
始终保留创建的工作人员数量,这与您分发的最后一个ID同时存在。
放在一起
由于这个问题得到了很多赞成(=兴趣),我将上述内容总结为蓝图:
public class Worker {
private static int numWorkers; // Number of Worker objects created
private int id; // Individual ID of a worker
public Worker() {
id = ++numWorkers; // Will be 1 for the first, 2 for the second, ...
}
public int getID() {
return id;
}
public static int getNumWorkers() {
return numWorkers;
}
}
请注意,在Java中,您不需要将primitive type int
初始化为0
,因为default value为{ {1}}。当然,无论如何都可以这样做 - 明确地说它永远不会伤害。
答案 1 :(得分:4)
你实际上非常接近成功。
您可能已经知道,静态成员属于类本身,而不属于每个实例。但正如您所说,每个工作人员都应拥有自己的唯一ID,因此 <meta charset="UTF-8">
<title>Product Pagea</title>
<link rel="stylesheet" type="text/css"
href="style.css" media="screen" />
<link href="https://fonts.googleapis.com/css?family=Lato:300,400,700,900" rel="stylesheet">
<link rel="stylesheet" href="image_hover_own.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<style type="text/css">
/* css try & sample code start */
p, h1, h2, h2, h3, h4, h5 {
font-family: 'Lato', sans-serif;
}
/* CSS TRY & SAMPLE CODE START */
.produkt-img {
padding-bottom: 133.33333%; /* <= height / width */
background-size: cover;
}
.produkt-1 {
background-image: url('Images/x_freund_faserland_vierer_manufaktur_berlin_moebel.jpg');
}
.produkt-2 {
background-image: url('Images/x_freund_monument_dreier_manufaktur_berlin_moebel.jpg');
}
.produkt-3 {
background-image: url('Images/wood_fill_up.jpg');
}
.produkt-4 {
background-image: url('Images/x_freund_naturbursche_vierer_manufaktur_berlin_moebel.jpg');
}
.produkt-box-overlay-text {
width: 100%;
text-align: center;
position: absolute;
top: 80%;
left: 50%;
transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
}
.produkt-overlay:before{
position: absolute;
content:" ";
top:0;
left:0;
width:100%;
height:100%;
display: none;
z-index:0;
}
.produkt-overlay:hover:before{
display: block;
}
.overlay-farbe:before {
/* grauer overlay background-color: rgba(50, 50, 50, 0.05)*/
background-color: rgba(199, 87, 36, 0.1);
}
.col-sm-3, produkt-width {
padding: 0px;
margin: 0.5%;
width: 23.75%;
}
.col-sm-3 extra-margin {
margin-left:1%;
}
/* CSS TRY & SAMPLE CODE END */
</style>
</head>
<body>
<!-- HTML TRY & SAMPLE CODE START -->
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-xs-6 produkt-width produkt-overlay overlay-farbe">
<div class="produkt-img produkt-1"></div>
</div>
<div class="col-sm-3 col-xs-6 produkt-width produkt-overlay overlay-farbe">
<div class="produkt-img produkt-2"></div>
</div>
<div class="col-sm-3 col-xs-6 produkt-width produkt-overlay overlay-farbe">
<div class="produkt-img produkt-3"></div>
</div>
<div class="col-sm-3 col-xs-6 produkt-width produkt-overlay overlay-farbe">
<div class="produkt-img produkt-4"></div>
</div>
</div>
</div>
不应该是静态的。
但是,我们仍然需要一个静态变量来跟踪应该给我们创建的下一个worker的id。让我们声明一个:
workId
然后,在您的构造函数中,您将static private int nextWorkId = 0;
分配给nextWorkId
,然后递增workId
:
nextWorkId
您也可以这样写:
workId = nextWorkId;
nextWorkId++;