我正在尝试学习Java的基础知识,我对JavaScript更熟悉。
以下陈述是否准确(我只需要高级别的理解):
Javascript构造函数或工厂函数是Java中类或接口的等效(我在这里松散地使用这个词)。
编辑:
这就是我在Java书中读到的内容:
Java程序主要是与其他人交谈的集合对象 对象通过调用彼此的方法。每个对象都是一个 某些类型,该类型由类或 接口。大多数Java程序使用许多不同类型的集合。
来自Javascript,上面听起来非常像JS构造函数类似于Java中的类,其中将定义对象属性和方法。
我知道Java和JavaScript是两种不同的语言。
由于
答案 0 :(得分:6)
我会说你很亲密。 JavaScript中的构造函数(和原型)是我们在JS中与Java类最接近的;但他们肯定不是“等同的”。
您可以动态地添加或删除JavaScript构造函数原型的属性和方法;您无法在运行时从Java类中添加或删除内容。
示例:
function Foo() {}
Foo.prototype.hello = function() { alert('hello'); };
var f = new Foo();
f.hello(); // alerts 'hello'
delete Foo.prototype.hello;
f.hello(); // throws an error
只需将构造函数的原型分配给任意对象,就可以在JavaScript中的 runtime 中实现“继承”。在Java中,您在编译时声明继承,并且无法在运行时更改它。
示例:
function EnglishSpeaker() {}
EnglishSpeaker.prototype.greet = function() { return 'hello'; };
function SpanishSpeaker() {}
SpanishSpeaker.prototype.greet = function() { return 'hola'; };
function Me() {}
Me.prototype = EnglishSpeaker.prototype;
var me = new Me();
me instanceof EnglishSpeaker; // true
me.greet(); // 'hello'
Me.prototype = SpanishSpeaker.prototype;
me = new Me();
me instanceof EnglishSpeaker; // false
me instanceof SpanishSpeaker; // true
me.greet(); // 'hola'
在JavaScript中,原型只是一个对象。所以“类”(构造函数)可以从任何普通对象“继承”;因此,“类型”和“价值”之间存在着更为宽松的区别。
示例:
function Thing() {}
var randomObject = { foo: 1, bar: 2 };
Thing.prototype = randomObject;
var thing = new Thing();
thing.foo; // 1
在Java中,您可以定义某个类必须实现的接口。 JavaScript并没有提供任何这样的机制。
这些只是我头脑中的一些差异。重点是:它们是相似的,你建立联系是正确的。但他们绝对不一样。
答案 1 :(得分:4)
JavaScript的:
function Cat(name) {
this.name = name;
this.talk = function() {
alert( this.name + " says meeow!" );
};
}
var cat1 = new Cat("Felix");
Java中的:
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
this.talk();
}
public void talk() {
System.out.println( this.name + " says meeow!" );
}
}
Cat cat1 = new Cat("Felix");
答案 2 :(得分:0)
来自:Does JavaScript have the interface type (such as Java's 'interface')?
JavaScript继承基于对象,而不是类。直到你意识到这一点并不重要: JavaScript是一种极其动态类型的语言 - 您可以使用适当的方法创建一个对象,这将使其符合接口,然后取消定义使其符合的所有内容。破坏类型系统很容易 - 甚至意外!首先尝试制作类型系统是不值得的。
答案 3 :(得分:0)
如果您来自JavaScript并学习Java,那么我认为其他任何人都没有提到过一个巨大的差异。
在JavaScript中,函数是一个对象。对象可以包含其值可以是函数对象的属性,也可以包含其他对象或原始值。当你调用obj.method(arguments)
时,语义是寻找对象(或原型)的method
属性,如果它是一个函数对象,则调用它。
在Java和其他具有OOP功能的编译语言中,函数不是对象。如果创建特定类型的新对象,则对象中的“类型”信息引用该类型的多态函数列表。这就是多态在这些语言中的工作原理。如果你调用obj.method(arguments)
,method
是一个可以为派生类型重写的方法,那么程序会查找obj
的类型,然后在函数列表中查找该类型确定要调用的函数。对我来说,这意味着对象的类型是这些语言中的关键信息,而OOP围绕着它;而在JavaScript中,对象的“类型”非常不重要,因为函数本身是在对象中按名称查找的。可以使用JavaScript来使其看起来像模仿其他语言处理OOP的方式,但它不是必需的,并且它不是语言的内置部分。
我认为从一个人到另一个人时,你必须牢记这一点。如果你太努力地将Java功能与你已经熟悉的JavaScript功能联系起来,那将会让人感到困惑。
答案 4 :(得分:0)
如果您是Java新手,我建议您访问amazon.com并寻找一本关于java的初学书,该书有很好的评论并阅读它的封面。我认为这将最有效地利用你的时间,而不是阅读有关Java的varoius文章并将其拣选。我还建议你不要试图将你的Javascript知识移植到Java,至少你会更难学习Java。请注意,您可以阅读许多有关Java(Web)开发的书籍:Java,基于Java(JSF,Tomcat等)构建的产品以及支持技术(HTML,CSS,XML等)。