在Java中,类似于JavaScript的对象数据类型?
在Java中,没有类似于JavaScript中的对象数据类型。这是一个问题,因为有时候我们希望在迭代时保持键的顺序。要解决这个问题,可以使用LinkedHashMap。
LinkedHashMap是Java中的一个类,可以实现类似于JavaScript中对象的功能。它是一个有序的映射表,可以按照插入的顺序来迭代。
下面是一个示例代码,展示了如何使用LinkedHashMap来创建一个类似于JavaScript对象的数据结构:
LinkedHashMapmyObject = new LinkedHashMap<>(); myObject.put("name", "John"); myObject.put("age", 25); myObject.put("city", "New York"); // 遍历对象,并按照插入的顺序输出键和值 for (Map.Entry entry : myObject.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); System.out.println(key + ": " + value); }
运行以上代码,将会输出:
name: John age: 25 city: New York
可以看到,使用LinkedHashMap可以实现类似于JavaScript对象的功能,并且可以保持键的顺序。这对于一些需要按照特定顺序进行迭代的场景非常有用。
总结起来,虽然Java中没有内置的JavaScript-like对象数据类型,但可以通过使用LinkedHashMap来实现类似的功能。LinkedHashMap是一个有序的映射表,可以按照插入的顺序来迭代。使用LinkedHashMap,我们可以创建类似于JavaScript对象的数据结构,并且保持键的顺序。
JavaScript中的对象是通过类(Class)进行定义的。当学习Java时,这基本就是你要学的第一件事。
//对象及其成员的定义 public class Car { String type, model, color; }
你可以将它们设置为public,以便在类的外部访问和修改。
public class Car { public String type, model, color; }
并且可以像下面这样访问它们。
//创建一个Car的实例,用变量c指向它,并设置它的一个属性/成员 Car c = new Car(); c.type = "Fiesta";
但是,在Java中将类的变量允许外部修改被认为是不好的编程习惯,通常你会添加用于访问每个变量的方法,称为访问器。
public class Car { private String type, model, color; //返回该对象的类型 public String getType() { return type; } //设置该对象的类型 public void setType(String type) { this.type = type; } //等等 }
然后可以这样访问它们。
Car c = new Car(); c.setType("Fiesta");
一个类是你编写的用于创建对象的模板,而对象则是类的运行时实例。
我明白了,我刚才的思考方式完全不对。现在这样看就有意义了。
Java中有一个称为object
的类型,但这并不是你想要的。在Java中,几乎所有的东西都是对象,并且有两种处理方式:
1. 定义一个具有正确属性的强类型对象,作为一个类。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"); // 要获取颜色,你必须: car.getColor();
根据需要添加获取和设置属性的方法,以及开始、停止、驾驶等方法。
2. 如果你想要一个没有行为或限制的宽松属性集合,可以使用Map
。同样,在JavaScript中也有一个类似的概念({x: 1, y: 2}
构造,不使用关键字new
)。
final Mapcar = new HashMap<>(); car.put("type", "Fiat"); car.put("model", 500); car.put("color", "white"); // 要获取颜色,你可以: car.get("color");
使用这种方法的缺点是编译器无法像前一种方法那样强制类型(几乎没有),而且在任何合理的方式下,Map不能具有自定义行为(也就是说,无法限制属性的类型)。在你的例子中,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"}; // 无论选择哪个选项,要获取颜色,只需使用: 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中,默认情况下是隐藏的,需要在需要时公开数据。这是一个有趣的选择,在比较代码库时非常相关,并且可以帮助保持类之间的独立性。但当你开始使用面向对象语言编写代码时,违反这一点非常容易(使用简单的结构将会给你带来麻烦)。