作者LaPass (LaPass)
看板java
标题Re: [问题] C#转学Java
时间Sat Oct 15 23:16:37 2011
Java当初的设计理念是简单、安全
也因此可以很快上手,但也因此少掉很多在C++中好用以及麻烦的东西
Java SE6技术手册,我一个礼拜就看完了
这是一本很好的上手书
实际上也只有半本(CH13前)的部分属於必需看过的部分
剩下的Stream、Thread、Reflection、Annotation,等要用到时再去查
如果打算走Android,Reflection那部分最好稍微看过
Android常常用Reflection去调用apk里的东西
但也建议你留一本Thinking in JAVA在身边
Thinking in JAVA讲的比较深,有时候遇到一些问题
去找Thinking in JAVA比较能获得清楚的解答
C#的概念是模仿Java,但写起来比较像C++
像指标、函数指标、多载运算子、goto等东西,C#有保留下来
但在Java中全部都被没收了
少了那些复杂的东西,所以能学的很快
C#的关键字比Java多很多
相较之下Java简单轻快,只要知道那些缺少的东西要怎麽去转换
就能写得很顺
在基础语法方面
像
goto XXX;
XXX:
这种东西在Java中被
break XXX;
continum XXX; 取代
例如:
XXX:
{
break XXX;
}
而且只能往後跳,不能往前跳
如果要往前,只能用while等回圈去控制程式流程
foreach 在Java中的型式是
for (iterable_type iterable_element : iterable)
修饰词 (private、public、protected)
在C#中只有三种,如果没加,就会变成private
在Java中如果不加修饰词,代表的是同一套件内的成员都能使用他
Java跟C#的类别配置不太一样
C#用namespace去区别class的「域」
而档案跟程式码没直接关系
但Java是用套件区分,而且一个.java档案只能放一个public class
且档案名称需与类别名称同名
不像C#爱放哪里就放哪里,嫌class太大还能用partial class拆成两三个档案
还有, C#可以为现成的class乱加方法进去,例如:
static class Util
{
public static int Square (this int i ){return i*i};
}
int x = 100;
x = x.Square(); //x == 10000
java没这种东西,如果想扩充,只能继承它
不过,C#中因为有struct才比较需要这样做
但Java中都是物件,就不需要
覆写(Override)
在C#中要宣告override才准继承的成员去覆写
但是Java中只要直接覆写即可
Method前面的 @Override 只是给编译器看的,不加也没事
多载运算子
C#可以为自定的类别宣告转型运算子、算术运算子
但在Java中.... 没办法,请把这个功能忘了
只能写个Method去转型、去相加、去相减
指标
在C#中的ref、out是在Method中用来取代指标的功能
在Java中也没有
不过,我看过个写法是,把变数放进阵列,把阵列传进Method
硬是把算完的东西用阵列带出来
Java容器物件都在java.util底下
跟C#差异不会很大,只是名称不一样
若要说比较大的差异......
像是C#中是用 List<int>,但是在Java里面只能用List<Integer>
而且会经过boxing、unboxing
在名称方面,在C#中允许
interface A<T1>{}
interface A<T1,T2>{}
这种同名泛型,但是在Java中不允许
以及,在C#中遇到必须同时继承两个介面时
例如:
interface A{void A();}
interface B{int A();}
在C#中可以用
void A.A(){}
int B.A(){return 0;}
的方式去区别两个函式是继承自哪个介面
Java没这种东西,理由是:基於Java的特性,根本不需要
当初也觉得撞名很严重,但在Java有自己的解决办法
这等一下讲
C#有delegate、event这种类似函数指标的东西
在Java中没有
C#中常常经过委派去设定按键、键盘事件
在Java中是用另一方式
这也等一下讲
要说Java中比较特别的东西
就是Inner class
C#虽然也有,但C#的Inner class就没有像Java中的那样好用
C#比较像是「把一个class放进一个跟上层class同名的namespace里面」
上层class跟Inner class没有直接关系
感觉很鸡肋,我写C#时几乎没用过
除非是用static class来纪录一些全域变数 (有分层比较不会搞混)
但Java中,Inner class却像是「上层class 的一部份」
他本身会隐含上层class的参照
这特性被用来处理很多事
举例来说:
class A
{
void A(){}
class B
{
void Method1()
{
A(); //在C#中不会过,但Java中可以
}
}
}
也因为如此,在java中常常这样用
class A
{
class B implements View.OnClickListener()
{
@Override
public void onClick(View v)
{
}
}
class C implements Button.OnClickListener()
{
@Override
public void onClick(View v)
{
}
}
}
这样一来,就能避免interface中的Method撞名的问题
而且onClick里面的程式码也可以自由使用class A里的栏位、Method
以及,之前在C#中常常用委派(delegate)设定一些点击、按键事件
那时是直接塞方法名称就可以,例如:
class C
{
public void onClickEevent()
{
//点下Button时要做的事
}
}
设定时:
Button.OnClick = onClickEevent; <=把Method放进delegate
但在Java中的做法是这样:
class C
{
class OnClickEvent implements Button.OnClickListener()
{
@Override
public void onClick(View v)
{
//点下Button时要做的事
}
}
}
设定时:
Button.setOnClickListener(new OnClickEvent());
其他Java的SDK我不知道是怎麽设计
但是在Android SDK里,设定某个条件触发某个状况,都是这样写
※ 引述《wa007123456 (大笨羊)》之铭言:
: 大家好!
: 我以前是用C#当作我的主要语言
: 最近看见Android的声势越来越大
: 想要也把Java学起来 去开发移动式装置
: 虽然Visual Studio C# Express
: 这个IDE真的"超级"好用
当初我也这样觉得
但是Eclipse只是调整起来麻烦
很多东西都要手动去调整
用熟後就会变得超好用,因为几乎什麽都可以调
现在我的Eclipse只要我打个字首
就会跟Visual Studio C# Express一样跳出候选字清单出来
那个从 视窗/喜好设定 那可以调整
还有,Eclipse开放给别人写外挂
所以只要加装一些东西,马上就能写C++ php等不同语言
这点比Visual Studio强大太多了
: 还有大量的msdn文件资料
http://nothing.tw/JDK_API_1_6/
中文java doc文件在这里
: 但是他只能开发Windows Phone
: 我现在Java的IDE是Eclipse
: 但是觉得他并不够人性化
: 速度也略慢
: 我知道Java跟C#很类似
: 不过还是有其差别存在
: 像是继承的语法就不同
: 我买了一本Java的书
: 可能是太基础吧?
: 我翻一翻就感觉念完了@@
: 但是实际去写後
: 又觉得力不从心
: 感觉就是怪怪的
: 我想请问C#转Java应该要注意的事项?
: 感谢有经验的大大分享
: 小弟在此感谢!
除非打算深入研究Java
否则,在使用上,Java真的简洁成这个样子
Java写起来一点也不花俏,不用去记一些奇奇怪怪的写法
用最单纯的写法就对了
如果觉得写起来很卡、力不从心
那就去找找网路
大概看一阵子范例,就知道Java style的写法是怎麽样
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.233.152.117
1F:→ LaPass:补一个 c#的 int x{get; set;} 在Java中要用Method去写 10/15 23:43
例如: int getx(){return x;}; void setx(int x){this.x = x;}
※ 编辑: LaPass 来自: 125.233.152.117 (10/15 23:49)
2F:→ apiod:VS也有开放写扩充工具......... 10/16 00:27
3F:推 PsMonkey:推这篇的字数,不过,还是那句话:请忘掉你写过 C# 10/16 09:31
4F:→ weiyucsie:看不懂inner class的例子...orz 10/16 13:36
※ 编辑: LaPass 来自: 125.233.155.247 (10/16 13:43)
5F:→ LaPass:打太快少打一层 = =||| 10/16 13:43
6F:推 sulaball:那在实验室被要求写一些JAVA作业,但是对於C和JAVA都不 10/16 14:07
7F:→ sulaball:熟悉的话,请问有甚麽好的推荐?买书重K吗?? 10/16 14:08
8F:→ lachtchlee:书到用时方恨少 10/16 14:13
9F:推 kavana999:这篇写得很棒啊,大学生们可能会拿去当作作业的解答了XD 10/16 14:14
10F:推 arrenwu:要速成的话去看 Java官网的Tutorial 吧 10/16 14:46
12F:推 wa007123456:谢谢你^^ 我在好多地方都有看见你@@ 你应该是程式达人 10/16 19:20
13F:→ LaPass:我不强,只是常常po文问问题而已.... 10/16 20:15
14F:推 TaiwanXDman:C#好像就是Java变来的? 10/17 01:16
15F:→ LaPass:微软原本想买下Java,结果没买成,就自己生一个C#出来。 10/17 08:39
16F:推 dream1124:你最後讲的C# delegate和setListener 是不一样的东西 10/23 18:48