JAVA哪些特性是C#做不到的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA哪些特性是C#做不到的?相关的知识,希望对你有一定的参考价值。

除了跨平台和免费(Mono似乎对这2个问题解决不错)
还有什么?尤其是语言特性上。
感谢大家的回答,可能是大家误解了我的意思。我相信C#、JAVA能实现的东西,C++也能实现,但复杂度是不一样的,我的意思是例如C#能重载运算符,但JAVA不能,像这样的区别,哪些是JAVA有C#没有的?
---------
cyngenius这篇东西我读过,它已经过时了,新的JAVA和C#都已经改变了其中部分特性

现在的面向对象的语言大多数都源自C++,java去掉了C++中那些复杂,实用性低的语言特性,达到了一个不错的平衡。

c#是在java如日中天的时候产生了,因此它不可避免的引入了java中绝大多数优秀的元素。

因此但从语言特性上,两种语言不会出现一种能实现,而一种无法实现的。

即便大型的应用,也是都可以实现,只不过可能在特定的方面,一种要比另一种做的好。

就算是所谓的跨平台。假如微软能推出linux版本的CLR和.net framework。c#一样可以跨,因为它和java都是拥有底层托管机制的。

非要说语言差别,下面基本应该全了,不过这些在另一种中都有替代实现方法。这不是我写的,是很久前收藏的一片文章,你觉得好感谢下作者就可以了

1.属性:
java中定义和访问均要用get和set方法,可以不成对出现。
c#中是真正的属性,定义时get和set必须同时出现,房问时用.号即可。不用get,set

2.对象索引
就是对象数组
public Story this [int index]

3.C#中,不用任何范围修饰符时,默认的是protect,因而不能在类外被访问.

4.因为JAVA规定,在一个文件中只能有一个public类,而且这个类的名称必须与文件名一模一样,这是一个区别

5.在C#中,它是以Main方法来定位入口的.如果一个程序中没有一个名为Main的方法,就会出"找不到入口的错误".不要把Main写成main哟

6.C#预定义的简单数据类型比Java多。例如,C#有unit,即无符号整数

7.忘掉Java中的static final修饰符。在C#中,常量可以用const关键词声明
C#的设计者还增加了readonly关键词,readonly域只能通过初始化器或类的构造函数设置
8.公用类的入口点:c#是可以对Main进行重载(java中是main),允许有int返回值和空参数的Main

9.在Java中,switch语句只能处理整数。但C#中的switch语句不同,它还能够处理字符变量。请考虑下面用switch语句处理字符串变量的C#代码

10.C#没有>>>移位操作符

11.goto关键词:
Java不用goto关键词。在C#中,goto允许你转到指定的标签。不过,C#以特别谨慎的态度对待goto,比如它不允许goto转入到语句块的内部。在Java中,你可以用带标签的语句加上break或continue取代C#中的goto。

12.int[] x = 0, 1, 2, 3 ;
int x[] = 0, 1, 2, 3 ;
但在C#中,只有第一行代码合法,[]不能放到变量名字之后。

13.与Java不同的是,C#允许为名称空间或者名称空间中的类指定别名:
using TheConsole = System.Console;

14.在Java中,包的名字同时也是实际存在的实体,它决定了放置.java文件的目录结构。在C#中,物理的包和逻辑的名称之间是完全分离的
.NET中包的实体称为程序集(Assembly)。每一个程序集包含一个manifest结构。manifest列举程序集所包含的文件,控制哪些类型和资源被显露到程序集之外,并把对这些类型和资源的引用映射到包含这些类型与资源的文件。程序集是自包含的,一个程序集可以放置到单一的文件之内,也可以分割成多个文件。.NET的这种封装机制解决了DLL文件所面临的问题,即臭名昭著的DLL Hell问题。

15.在Java中,java.lang包是默认的包,C#中不存在默认的包

16.C#中的访问修饰符与Java中的基本对应,但多出了一个internal。简而言之,C#有5种类型的可访问性,如下所示:

public:成员可以从任何代码访问。
protected:成员只能从派生类访问。
internal:成员只能从同一程序集的内部访问。
protected internal:成员只能从同一程序集内的派生类访问。
private:成员只能在当前类的内部访问。

17.由于C#中不存在final关键词,如果想要某个类不再被派生,你可以使用sealed关键词

18.与Java不同,C#中的接口不能包含域(Field)。
另外还要注意,在C#中,接口内的所有方法默认都是公用方法。在Java中,方法声明可以带有public修饰符(即使这并非必要),但在C#中,显式为接口的方法指定public修饰符是非法的。例如,下面的C#接口将产生一个编译错误。

19.C#中的is操作符与Java中的instanceof操作符一样,两者都可以用来测试某个对象的实例是否属于特定的类型。在Java中没有与C#中的as操作符等价的操作符。as操作符与is操作符非常相似,但它更富有“进取心”:如果类型正确的话,as操作符会尝试把被测试的对象引用转换成目标类型;否则,它把变量引用设置成null。

20.C#仍旧保留了C++的内存手工管理方法,它适合在速度极端重要的场合使用,而在Java中这是不允许的

21.在C#中,所有的异常都从一个名为Exception的类派生

22.枚举器即enum类型(java无),把它作为一个变量值的类型使用,从而把变量可能的取值范围限制为枚举器中出现的值。

23.结构(Struct)与类很相似,而结构是一种值类型,它存储在栈中或者是嵌入式的,结构可以实现接口,可以象类一样拥有成员,但结构不支持继承

24.属性声明语法的第一部分与域声明很相似,第二部分包括一个set过程和/或一个get过程

25.传值方式:
在java中简单数据类型的值传参时,都以传值方式;
在c#中如果加ref则会以引用的方式传值(方法内部改变该参数,则外部变量一起跟着变);
加out与ref基本相同,但out不要求参数一定要初始化.

26.c#保留了指针。unsafe

27.代理:代理(delegate)可以看作C++或者其他语言中的函数指针
代理用来封装可调用方法。你可以在类里面编写方法并在该方法上创建代理,此后这个代理就可以被传递到第二个方法。这样,第二个方法就可以调用第一个方法。
代理是从公共基类System.Delegate派生的引用类型。定义和使用代理包括三个步骤:声明,创建实例,调用。代理用delegate声明语法声明。
参考技术A 基本上是差不多的
没有做不了的,只有不会做的
关键的是人 不是程序
参考技术B 怎么说呢~~.net的出现,使得跨平台并不是JAVA的优势了~~
C#也好,Java也好,都一样~无非是microsoft或者sun了……
况且C#是在JAVA之后出来的~好多东西和JAVA都大同小异~~

所以没有语言做不到的,只有程序员不会做的&……
参考技术C 楼上的误人子第

几乎都能做的 都差不多
C#比java更严谨
参考技术D 多线程

什么是特性(Attribute)?

  由面向对象思想,我们诞生了很多种面向对象编程语言,比如常用的Java,C#,这些语言中都共有类(Class)的概念,并用各自的方式去阐述、编写Class,或许方式不同,但它们都有一个共同点,即“类是对现实的映射与描述”。

  比如“人”类,若我们要在C#中定义一个“人”类,你首先会想到给这个类中定义哪些类成员?姓名?年龄?性别?,这些都可以,凡是能描绘出一个人的特征的项,我们都能放进去,C#通过自己的一步步发展,将这些可以描绘类特征的项称作类成员,其中属性为外貌(表面)特征,方法为行为特征,我们可以通过这些特征来聚合出一个具体的人来。

    说到这里再回顾标题,什么是特性?一个类的类成员既然已经能够描述一个该类型对象的信息,为什么还需要加入特性这个概念呢?

  特性其实是一种信息载体,它的作用是补充或者描述属性的信息。比如一个人叫张三,于是我们都知道,有一个“人”类的对象,这个对象的属性“姓名”的值为“张三",然后现在有一个需求,我需要知道这个对象的姓名的书写步骤是怎样的。若不考虑特性,我完全可以在“人”这个Class中定义一个名为“笔画步骤”的属性,然后把“横、竖、横、竖、横弯钩......”的这些笔画以字符串集合的形式存放在这个属性里。这样子看似任务就完成了,但请回过头来想想,我们这个属性放在这里,他于情理是否合适?既然是定义在“人”类中的属性,“笔画步骤”是否可以用来描述人的特征?很显然,“人”这个类是没有一项特征为“笔画步骤”的,用来描述“人”类特征的属性,不建议、甚至是不应该用来描述另一个同样用来描述“人”类特征的属性。这里可能有点绕,但是,品,你细品。

  属性(Property)是用来描述类(Class)的信息载体,而特性(Attribute)是用来描述属性的信息载体,二者都是载体,只是描述对象发生了改变。

    比较正确的解题方案就是引入特性。我们不通过在人类中定义属性存放笔画,而是另外定义一个类,这个类代表我们需要描述的对象,即人类中的“姓名”这个属性,“笔画步骤”是“姓名”的一个特征。在这个类的类体中定义一个集合,用于存放笔画,将这个类以继承Attribute基类的方式设定为特性,最后将这个特性引入人类,并标注在人类的“姓名”这个属性上。(这里我没有写代码,以后随缘补充。有关特性的代码以后会在另一篇特性的随笔中给出。)  

    至此,以上均为个人的学习体会,欢迎补充。

以上是关于JAVA哪些特性是C#做不到的?的主要内容,如果未能解决你的问题,请参考以下文章

java动物特性的面向对象描述 项目

Erlang 的隐藏特性

C# 10 完整特性介绍

C#C# 5.0 新特性——Async和Await使异步编程更简单

Java 14 有哪些新特性?

Java8新特性一张图带你领略Java8有哪些新特性