java和c 区别与c#的区别??

JAVA与C#相同与区别_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
JAVA与C#相同与区别
上传于||文档简介
&&J​A​V​A​与​C​#​相​同​与​区​别​。​
​
​(​注​:​来​自​网​上​整​理​收​集​,​谨​用​于​学​习​)
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
你可能喜欢3078人阅读
[C#与dot net](14)
1. 访问控制方面:C#有public、internal、protected、private,比java多了个internal,其实它跟java的包访问差不多,internal表示同一个编译集合(如exe、dll)下的类可以互访。
对于protected,java和C#有区别。在java中,protected和包访问级别差不多,即不是私有的。而在C#中,protected和private差不多,即它标志的成员是私有的。
有这样一种情况:类中的一个成员,需要它能被子类访问到,同时能被同一个集合中(无论是java的包还是C#中的编译集合)的其他类访问到,怎么办呢?在java中,只要用protected就行了。在C#中,可以同时指定internal protected(二者的顺序随意)。
在有这样一种情况:类中的一个成员,需要它能被子类访问到,但不能被同一个集合中(无论是java的包还是C#中的编译集合)的其他类访问到,怎么办呢?在C#中,可以指定protected(二者的顺序随意)。但java就无能为力了。
2. C#中有static constructor的概念,这跟java中的静态初始模块一样。
C# : static [类名]{}
java :static{}
3. Java中的main函数必须是public static void main(String[] args)的样子,否则虚拟机拒绝运行。C#中,Main函数可以是private的(甚至可以是protected),可以没有参数,可以返回int值。有点像C语言。
4. 发现csc.exe有一个功能很好,100后面加一个小写的L,它会警告:“l”后缀容易与数字“1”混淆;为清楚起见,请使用“L”。
5. C#提供了一种机制,使得某个变量可以被动态赋值一次,以后就不能再改了。那就是readonly关键字的功能。
6. java在继承、多态方面,比C#强多了。Java默认的多态,C#要求加上virtual(被继承的方法)和override(继承的方法),而且C#要求不能改变原来的访问修饰符,不像java那样,可以指定更加宽松的访问方式。如果有人利用C#来写程序,必须经常带上virtual和override,还必须照抄原来的访问控制符,不会很郁闷吗?难道有人用C#的面向对象特性时,会舍弃多态的特性?这会引起多大的混乱啊。
多态是面向对象的精髓,像java那样默认不是更好吗?
7. C#中new还可以用来指定子类的某个方法要隐藏父类的具有相同签名的方法。这是不是多余的?你不用也可以,不过csc.exe会警告你,如“lan.Other.Main(string[])”隐藏了继承的成员“lan.HelloWorld.Main(string[])”。如果是有意隐藏,请使用关键字 new。
像java那样默认多好啊。
但是话又说回来,C#这样做也是有原因的。如果类B继承了类A,B接下来有添加了一个方法叫做hi(),那是B特有的。然后类A(假设是别人来维护的,你不能看到源码)突然也增加了一个方法hi()。如果B自己那个hi()跟A那个hi()的返回值不一样,当你更新类库A后,可能导致程序运行错误或不能编译。C#就很好就地避免了这种问题。(虽然这种问题出现的概率挺小的…)
8. C#中,防止一个类被继承,要用关键字sealed。而定义一个常量时,要用const。
像java统一用final多好啊。
9. 在C#中,要比较两个引用变量是否指向同一个对象,不能用java中的==,而要用Object里的ReferenceEquals方法。C#中,不能用一个类的实例去调用该类的类方法,必须用类名。所以java中的o1==o2等价于C#中的Object.ReferenceEquals(o1,o2)。
10. C#中没有原始类型的包装类,但是也提供自动装拆箱的功能,和java有的一样。区别是,C#的装箱是自动的,拆箱就要强制转换了。
int i=100;
object obj=i;
具体怎么装和拆,我们不知道。只知道CLR将int转换成object了。
11. java的内部类有时候帮助很大。到了C#那,就只提供静态的内部类了。这意味着外部类只相当于是一个命名空间而已。C#中的内部类能访问外部类的私有成员,这可能会让它有点用。
12. C#中虽然有运算符重载,但是为了整个.net的一致性,应该不会鼓励使用。因为有的.net语言没有运算符重载,而.net的一个目标就是消除各种语言的差别。
13. C#多了一个struct值类型,它就跟原始类型一样。微软在必要的时候会帮你将struct封装成Object,就像封装int类型一样。以至于你可以认为struct也是由Object继承而来,虽然struct本身并不支持继承。(struct可以不用new来初始化,但它里面的内容必须初始化后才能调用其方法;struct没有析构方法;struct没有默认的构造方法)。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1745097次
积分:20089
积分:20089
排名:第234名
原创:347篇
转载:183篇
评论:207条
(4)(16)(4)(5)(5)(1)(6)(4)(14)(19)(25)(40)(44)(14)(33)(18)(4)(25)(17)(15)(37)(16)(4)(21)(20)(8)(2)(2)(19)(16)(15)(19)(2)(8)(5)(1)(4)(1)(5)(6)(5)(1)十六进制到字节数组中 C# 和 Java 给出不同的结果
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
首先,对不起长一职,我想包括我所有的想法,所以它是你们去发现什么是错了我的代码更容易。
我想从一个 C# 应用程序到 Java 应用程序传输一个十六进制字符串。但是,当我将相同的十六进制值转换为一个字节数组,对这两种语言,输出是不同。
例如,相同的十六进制值给出
[101, 247, 11, 173, 46, 74, 56, 137, 185, 38, 40, 191, 204, 104, 83, 154]
在 C# 中和
[101, -9, 11, -83, 46, 74, 56, -119, -71, 38, 40, -65, -52, 104, 83, -102]
在 Java 中
这里是我在 C# 中使用的方法:
public static string ByteArrayToHexString(byte[] byteArray)
return BitConverter.ToString(byteArray).Replace("-",""); //To convert the whole array
public static byte[] HexStringToByteArray(string hexString)
byte[] HexAsBytes = new byte[hexString.Length / 2];
for (int index = 0; index & HexAsBytes.L index++)
string byteValue = hexString.Substring(index * 2, 2);
HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
return HexAsB
和那些在 Java:
public static String ByteArrayToHexString(byte[] bytes) {
StringBuilder builder = new StringBuilder();
for (byte b: bytes) {
builder.append(String.format("%02x", b));
return builder.toString().toUpperCase();
public static byte[] HexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i & i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) && 4)
+ Character.digit(s.charAt(i+1), 16));
在 C# 中,在这里是一个示例:
String hexString = "65F70BAD2E4ABFCC68539A";
byte[] byteArray = HexBytes.HexStringToByteArray(hexString);
//Using the debugger, byteArray = [101, 247, 11, 173, 46, 74, 56, 137, 185, 38, 40, 191, 204, 104, 83, 154]
String hexString2 = HexBytes.ByteArrayToHexString(byteArray)
Console.Write("HEX: " + hexString2);
//Outputs 65F70BAD2E4ABFCC68539A
与 Java 中的示例:
String hexString = "65F70BAD2E4ABFCC68539A";
byte[] byteArray = HexBytes.HexStringToByteArray(hexString);
//Using the debugger, byteArray = [101, -9, 11, -83, 46, 74, 56, -119, -71, 38, 40, -65, -52, 104, 83, -102]
String hexString2 = HexBytes.ByteArrayToHexString(byteArray);
System.out.println("HEX: " + hexString2);
//Outputs 65F70BAD2E4ABFCC68539A
你可以看到,当我做相反的操作,最后一个十六进制值等于第一个,这意味着转换的方式分别在两种语言中可能的好。但我不明白为什么从十六进制转换为字节数组是不同的两种语言。十六进制以为只是另一个基地的一个数字。
谢谢你的帮助
我修复此问题的 C# 代码替换为下面的代码:
public static string ByteArrayToHexString(sbyte[] byteArray)
return BitConverter.ToString(convert(byteArray)).Replace("-", ""); //To convert the whole array
public static sbyte[] HexStringToByteArray(string hexString)
byte[] HexAsBytes = new byte[hexString.Length / 2];
for (int index = 0; index & HexAsBytes.L index++)
string byteValue = hexString.Substring(index * 2, 2);
HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
return convert(HexAsBytes);
private static sbyte[] convert(byte[] byteArray)
sbyte[] sbyteArray = new sbyte[byteArray.Length];
for (int i = 0; i & sbyteArray.L i++)
sbyteArray[i] = unchecked((sbyte) byteArray[i]);
return sbyteA
private static byte[] convert(sbyte[] sbyteArray)
byte[] byteArray = new byte[sbyteArray.Length];
for (int i = 0; i & byteArray.L i++)
byteArray[i] = (byte) sbyteArray[i];
return byteA
解决方法 1:
但是,当我将相同的十六进制值转换为一个字节数组,对这两种语言,输出是不同。
所有你看到的签署了在 Java 中,在 C# 中,无符号字节为单位)。所以如果你将 256 添加到任何负面价值在 Java 中,你会在 C# 中所显示的值。实际的位的值是相同的 — — 它只是问题的顶部位是否被视为一个符号位。
编辑: 如所指出的评论,如果你曾经用字节整数以外的调试器输出,您可以始终使用:
int someInt = someByte & 0
得到的无符号的值。浅谈C#和Java比较
浅谈C#和Java比较
  C#和Java比较
  C#和Java比较,号称90%的相同加上10%的不同。因此当时我学习C#,阅读两种代码完全没有什么阻碍。
  对C#了解得深入以后,来发表下对这两种语言各自特性的一些看法
  比较起Java和C#大相径庭的那10%,会发现C#五花八门的特性要多很多。比较知名的有:委托,属性,真正的泛型,索引器,类初始化器,分部类,操作符重载,struct,unsafe代码,IDisposable等,另外。net framework 3.5还加了一大串纯粹由编译器提供的特性。
  委托,这个可以算是C#之于Java的最大优势。虽然Java可以依靠接口,匿名内部类这些特性实现委托一样的功能,但却要麻烦许多,如果涉及到N个委托实例相加的情况,那么一个C#里面简单的"+"号,在Java里就只能用FilterChain,InterceptorStack这种概念了。
  属性,据说属性信息是带到运行时的,后查看反射的确有PropertyInfo类,之前说它是编译器语法糖是受了某篇分析IL代码的文章误导,不过这个是不是语法糖都没什么关系,它和Java普遍做法的get,set各有优劣。属性写起来简捷,但却比较难看出哪些属性是只读,哪些是只写不读。
  真正的泛型,这个又是一大C#的优势,同时伪泛型又是Java的一大败笔。但是Java年代比较长,为兼容性考虑不得不使用假的泛型实现。如果泛型不是在jdk1.5时推出,而是在jdk1.4,和collection framework一起推出,我认为它也会采用真正的泛型实现。
  索引器,有了这个很多容器类都可以直接用[]取元素,感觉还不错,比没有好,编译器的小把戏。
  类初始化器,典型的懒汉特性。每次用顶多能省下一两行代码,又是编译器的小把戏。
  分部类(partial class),纯粹为了vs.net的那一大堆图形化设计器老和人的代码冲突而搞出来得玩意,又是编译器的小把戏。
  操作符重载,属于用到得不多,要用时却显得特别有用的东西,很奇怪Java为什么不提供这个功能。
  struct,在堆栈上的东西,释放内存那是超级的快,只不过需要用到这个的场合,大概都在使用C++编程。
  unsafe代码,纯粹增加语言复杂性的东西。就好像一个人搬家,看这个不舍得扔,那个也不舍得扔,搞到最后把瓶瓶罐罐都搬走了。
  IDisposable,实现这个接口,配合using块,非常的强大,终于可以像C++那样掌握对象的销毁了。
  接着说说Java比C#多的特性:
  匿名内部类:真是极端方便的一个东西,还和Java的好多设计模式有关系,不过C#把Java匿名内部类的写法拿去用作类初始化器了,糟蹋了……
  动态代理: Java里面要实现AOP,易如反掌;C#要实现AOP,难如登天,不得不借助Assamble命名空间下的那些动态IL生成工具。这就是动态代理的作用。
  希望有一天C#可以拥有匿名内部类和动态代理,变得更完善。也希望Java也可以有委托等。以上介绍C#和Java比较
&&&主编推荐
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
港口与航道工程建设工程法规及相关知识建设工程经济考试大纲矿业工程市政公用工程通信与广电工程
操作系统汇编语言计算机系统结构人工智能数据库系统微机与接口
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
Powerpoint教程WPS教程
电子政务客户关系管理首席信息官办公自动化大数据
职称考试题目
就业指导签约违约职业测评
招生信息考研政治
网络安全安全设置工具使用手机安全
3DMax教程Flash教程CorelDraw教程Director教程
Dreamwaver教程HTML教程网站策划网站运营Frontpage教程
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
互联网电信IT业界IT生活
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
组织运营财务资本
视频播放文件压缩杀毒软件输入法微博
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&

我要回帖

更多关于 java和c 区别 的文章

 

随机推荐