Ala*_*orm 46
这不是一个详尽的列表,而且我是一名PHP开发人员,他一段时间都参观了Java,因此我发现了Caveat Emptor.
Java中的每个变量都需要添加数据类型.这包括基本类型,如boolean,int,double和char,以及Object数据类型,如ArrayList,String和您自己的对象
int foo = 36;
char bar = 'b';
double baz = 3.14;
String speech = "We hold these truths ...";
MyWidget widget = new MyWidget(foo,bar,baz,speech);
Run Code Online (Sandbox Code Playgroud)
每个变量只能包含其类型的值.使用上述声明,以下内容无效
foo = baz
Run Code Online (Sandbox Code Playgroud)
对象(而不是基本类型)上的相等性检查对象标识.所以以下不直观地打印错误.字符串有一个相等的方法来处理这个问题.
//see comments for more information on what happens
//if you use this syntax to declare your strings
//String v1 = "foo";
//String v2 = "foo";
String v1 = new String("foo");
String v2 = new String("foo");
if(v1 == v2){
println("True");
}
else{
println("False");
}
Run Code Online (Sandbox Code Playgroud)
数组是您经典的C数组.只能保存一种特定类型的变量,需要使用固定长度创建
为了解决这个问题,有一系列的集合对象,其中一个名为ArrayList,它更像PHP数组(尽管保持一种类型的业务仍然是正确的).你没有得到类似语法的数组,所有操作都是通过方法完成的
//creates an array list of strings
ArrayList<String> myArr = new ArrayList<String>();
myArr.add("My First Item");
Run Code Online (Sandbox Code Playgroud)
ArrayLists仍然有数字键.还有另一个名为HashMap的集合,它会像对象一样为你提供一个字典(或关联数组,如果你在90年代上学).
ArrayLists和其他集合使用称为泛型(<String>)的东西实现.我不是Java程序员,所以我对Generics的理解是他们描述了Object将要运行的东西的类型.那里还有很多事情要做.
Java没有指针.但是,所有对象实际上都是引用,类似于PHP 5,与PHP 4不同.我不认为 Java具有(折旧的)PHP和引用和语法.
所有方法参数都通过Java中的值传递.但是,由于所有对象实际上都是引用,因此在传递对象时传递引用的值.这意味着如果您操纵传递给方法的对象,操作将会粘住.但是,如果您尝试这样的事情,您将无法获得预期的结果
public void swapThatWontWork(String v1, String v2)
{
String temp = var1;
var1 = var2;
var2 = temp;
}
Run Code Online (Sandbox Code Playgroud)
这是一个很好的时间,任何提到方法需要指定其返回类型,如果一个方法返回它不应该的东西会发生坏事.以下方法返回int
public int fooBarBax(int v1){
}
Run Code Online (Sandbox Code Playgroud)
如果一个方法要抛出异常,你必须声明它,或者编译器不会与它有任何关系.
public int fooBarBax(int v1) throws SomeException,AnotherException{
...
}
Run Code Online (Sandbox Code Playgroud)
如果您使用未在方法中编写的可能引发异常的对象,这可能会变得棘手.
Java中的主要代码入口点将是一个类的方法,而不是PHP的主要全局入口点
Java中的变量名不是以sigil($)开头的,尽管如果你想要它们,我认为它们可以
Java中的类名称区分大小写.
字符串在Java中是不可变的,因此连接可能是一项昂贵的操作.
Java类库提供了一种实现线程的机制.PHP没有这样的机制.
PHP方法(和函数)允许您使用可选参数.在java中,您需要为每个可能的参数列表定义单独的方法
public function inPHP($var1, $var2='foo'){}
public void function inJava($var1){
$var2 = "foo";
inJava($var1,$var2);
}
public void function inJava($var1,$var2){
}
Run Code Online (Sandbox Code Playgroud)
当对象调用自己的方法方法时,PHP需要使用显式$.Java(如上例所示)没有.
Java程序往往是从"程序运行,保持运行,处理请求"的方式构建的,而PHP应用程序是从"运行,处理请求,停止运行"的方式构建的.
Len*_*mel 14
我认为这两种语言(以及它们的运行时系统)太不同了,无法列出所有差异.一些非常重要的问题出现在我的头上:
在适当的时候你会注意到大多数差异,但最重要的是:
===和的运算符!==.Java的隐式类型转换主要限于原始类型的自动装箱(PHP没有原始类型).这通常会出现.考虑:
$val = 'a';
if (strpos('abcdefghij', $val)) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这是不正确的,并且会因为返回索引0转换为未执行块false.正确的版本是:
$val = 'a';
if (strpos('abcdefghij', $val) !== false) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
Java条件语句需要显式boolean;
$,否则无法区分;Maps(例如HashMap).关联数组按插入顺序排序,可以像普通数组一样使用(在值上).那里有一个Map实现,维护插入顺序在Java中,但这是例外而非常态;$arr['foo'] = 'bar'插入或更新关联数组中的元素.Java必须使用Map.put()和Map.get();create_function()); 5.3在语言层面介绍了闭包.Java必须为两者使用内部类,这有点更冗长.此外,内部类在限制它们如何从外部作用域访问变量(读取JavaPapers上的Java闭包)方面受到限制,使它们不像真正的闭包那样强大.global在PHP中明确使用关键字;register_globals())自动导致同名的全局变量.或者可以通过$_POST全局变量(以及$_SESSION会话变量)访问它们,而对这些东西的支持来自一个名为servlets API的JEE附加组件,通过像HttpServletRequest和的对象HttpSession;function关键字,而在Java中,您声明了返回类型和参数类型;相比:
function do_stuff($name = 'Foo') {
// ...
}
Run Code Online (Sandbox Code Playgroud)
至
void doStuff() {
doStuff("Foo");
}
void doStuff(String what) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
->运算符.Java使用.运算符;__construct();this是隐式的,仅用于显式范围,在某些情况下用于内部类.在PHP5中,$this是显式的;.使用实例上的运算符来调用(尽管不鼓励它在语法上有效)但通常使用类名来代替.这两个是等价的:
float f = 9.35f;
String s1 = String.valueOf(f);
String s2 = "My name is Earl".valueOf(f);
Run Code Online (Sandbox Code Playgroud)
但前者是首选.PHP使用::范围解析运算符进行静态分析;
.运算符追加字符串.Java使用+;...)来显式声明可变长度参数列表.所有PHP函数都是可变长度的;func_get_args(),func_get_arg()和/或func_num_args();