我在JavaScript方面很有经验,但对Java来说却是新手。在JavaScript中有" object"数据类型,其中给定变量基本上具有具有其自己唯一值的子变量,例如:
var car = {type:"Fiat", model:500, color:"white"};
它几乎就像一个数组,但并不完全(JavaScript也有数组)。我想知道Java中是否存在相同类型的东西?如果是这样,我将如何在Java中声明相同的内容?基于我的搜索,我无法找到对象数据类型,但是想到可能有类似的东西?
答案 0 :(得分:14)
虽然Java有一个名为object
的类型,但它并不是你想要的。 Java中几乎所有东西都是一个对象,有两种方法可以解决这个问题:
将具有正确属性的强类型对象定义为类。 Javascript有一个类似的概念,实现方式不同,但它应该是可识别的:
public class Car {
private String type;
private int model;
private String color;
public Car(final String type, final int model, final String color) {
this.type = type;
this.model = model;
this.color = color;
}
public String getType() { return this.type; }
public int getModel() { return this.model; }
public String getColor() { return this.color; }
}
final Car car = new Car("Fiat", 500, "white");
// To get the color, you must:
car.getColor();
添加方法以获取和设置适当的属性,启动,停止,驱动等方法。
如果您想要一个没有行为或限制的松散的属性集合,请使用Map
。同样,存在Javascript等价物({x: 1, y: 2}
构造没有使用new
关键字)。
final Map<String, Object> car = new HashMap<>();
car.put("type", "Fiat");
car.put("model", 500);
car.put("color", "white");
// To get the color, you:
car.get("color");
这种方法的缺点是编译器无法强制执行这些对象的类型(几乎同样如此),并且映射不能具有自定义行为(以任何合理的方式)。在您的示例中,model
是一个数字,但这将允许您分配任何内容,无论它是否有意义(可能有人将数据保存在服务器上并使用HttpConnection
,所有代码都期望一个数字爆炸)。
在Java中,如果您知道您拥有多辆汽车,并且所有汽车具有相同(或相似)属性,则建议使用第一种方法。它允许编译器对您知道将存在的属性执行和优化,并且继承允许您稍后添加其他属性。该类还允许您定义在该实例上运行的方法,这可以帮助在系统的各个部分之间创建抽象(您不需要知道如何汽车启动,您只需告诉汽车开始了。)
供参考,Javascript等价物是:
// #1
var Car = function(type, model, color) {
this.type = type;
this.model = model;
this.color = color;
}
var car = new Car("Fiat", 500, "white");
// #2
var car = {type: "Fiat", model: 500, color: "white"};
// For either option, to get the color you can simply:
console.log(car.color);
最明显的是,Java会跟踪每个变量的类型。不可见的是,Java将阻止您分配给未知属性,比如car.mileage
,其中Javascript将很乐意添加新属性。最后,Java具有可见性概念,并且默认情况下将内容设置为私有(对外部查看者不可见)。在Javascript中复制它看起来像:
var Car = function(type, model, color) {
var _type = type;
var _model = model;
var _color = color;
this.getType = function() { return _type; }
this.getModel = function() { return _model; }
this.getColor = function() { return _color; }
}
console.log(car.getColor());
在Javascript中,您可以利用闭包来隐藏数据。 Java默认为隐藏,并要求您在需要时公开数据。这是一个有趣的选择,在比较代码库时非常相关,并且可以帮助保持类彼此独立。当你开始用OO语言编写时,它也很容易(并且很诱人)违反,所以要记住一些事情(使用简单的结构会回来困扰你)。
答案 1 :(得分:2)
是的,它们被称为对象并由类定义。这基本上是你学习Java时学到的第一件事
//The definition of an object and it's members
public class Car {
String type, model, color;
}
然后,您可以将它们公开以访问并在类外部更改它们
public class Car {
public String type, model, color;
}
然后像这样访问它们
//Create an instance of a Car, point to it with variable c and set one of it's properties/members
Car c = new Car();
c.type = "Fiesta";
但允许在外部编辑类的变量在Java中被认为是不好的形式,通常你会添加访问每个变量的方法,称为访问者
public class Car {
private String type, model, color;
//Return the type of this object
public String getType(){
return type;
}
//Set the type of this object
public void setType(String type){
this.type = type;
}
//etc
}
然后像这样访问它们
Car c = new Car();
c.setType("Fiesta");
类是您为创建对象而编写的模板,它是类的运行时实例。
答案 2 :(得分:1)
为此目的,最好的对象是LinkedHashMap。您可以像地图一样使用它,但在迭代时它会保持按键顺序。