当前位置: 首页 > news >正文

java与C#的简单比较

刚刚看完java视频,做了个简单图:

 

 

新知识不多,大多是与以往知识的相互碰撞,一下做了java与C#的简单比较:

 

                       

Java

C#

 

主类名与文件名

必须一致

可以不一致

命名空间导入方式

import关键字

using关键字

常量

final关键字

Const关键字

基本数据类型

C#中有无符号数,Java没有。

C#中有值类型,且可自己定义值类型的结构体(struct)。
Java中的基本类型(或叫基元类型)即为值类型,但Java没有结构体,所以不能自定义值类型。
C#中的值类型(包括所有基本类型)间接继承自Object,有自己的方法可以调用;Java中的值类型(即基本类型)不继承自Object,只是简单的数据,没有方法可以调用。

C#中int等同于System.Int32,是值类型;bool等同于System.Boolean;等。
Java中int是基本类型,是值类型,而Integer是引用类型,Integer是int的包装器,int自身没有方法,Integer有一些方法;int与Integer之间可隐式转换(导致装箱和拆箱),但当Integer值为null的时候会在运行时抛出异常。boolean等类似。

Java中的int与Integer的对应在C#中类似int和Nullable<int>的对应,它们的后者都是前者的包装,且后者可以等于null。但Nullable<int>实际上仍然是值类型的(所以仍然很轻量级),所以从内存上讲C#中int和Object的对应更接近Java的对应一些。C#中Nullable<int>到int的转换必须显式进行,因为Nullable<int>中的值为null时会引发运行时异常。
其他基本类型与之类似。

初始化

调用基类构造函数:

SubClass():base(){}

调用基类构造函数:

SubClass(){

 super();

}

Switch语句

1)只能处理int类型

2)每个case块后写break语句,不然会有穿透问题

1)还可以处理字符变量

2要求每一个case块或者在块的末尾提供一个break语句,或者用goto转到switch内的其他case标签。

 

声明数组

灵活。

Int[] x={1,2,3};//正确

Int x[]={1,2,3};//正确

Int[] x={1,2,3};//正确

Int x[]={1,2,3};//错误

面向对象

完全面向对象

相同

继承

类的单继承;

可以实现多个接口;

相同

多态

支持某些形式的多态性机制

相同

重写

默认方法都可被重写,派生类和子类方法签名一样时被认为是重写。要声明不能被重写的方法需在方法前加final关键字。重写时可以在方法前添加标注(即C#中的定制特性)@Override,这样一旦此方法找不到被重写的方法时编译器会报错,以防止拼写错误。

被重写的方法必须添加virtual关键字声明为虚方法,派生类重写子类方法时添加override关键字。

访问修饰符

4

Public:成员可以从任何代码访问;

Protected:成员只能从派生类访问;

Default

 

内部类

内部类可以直接访问外部类的实例成员

C#的内部类不可以直接访问外部类的实例成员;C#的内部类等同于java的静态内部类

最终类

final关键字定义的类不能再被派生

Seale关键字定义的类不能再被派生

接口

1)关键字:interface

2)接口内允许有内部类、静态字段等;

1)关键字:interface

2)接口内不允许有内部类、静态字段等;

内存管理

由运行时环境管理,使用垃圾收集器

由运行时环境管理,使用垃圾收集器

指针

支持,你只在很少使用的非安全模式下才支持。通常以引用取代指针

完全不支持。代之以引用

泛型

Java中泛型实现使用的擦除机制,为类型参数传入类型并不导致新类型出现,即传入了类型参数后在运行时仍然完全不知道类型参数的具体类型,它的目的是为了兼容非泛型(所以可以在泛型和非泛型之间隐式转换,会有编译警告但不会有编译错误,这当然其实并不安全);这同时衍生了一系列问题:不能定义泛型类型参数的数组如T[],不能通过new T()的方式实例化泛型,等。
Java的泛型不支持值类型(使用的话会被自动包装成引用类型)。

C#的泛型在类型参数传入类型后会产生一个新类型(虽然CLR的优化机制会使引用类型共享同样的代码),可以在运行时得到类型参数的类型信息。可以定义泛型数组,可以添加约束使其可以new。C#的泛型可以使用值类型(不会被装箱)。

参数引用传递

只有值传递

使用关键字ref:迫使值参数通过引用传递给方法;

 

使用关键字out: 在参数未初始化的情况下,在一个函数中输出多个值;

 

使用关键字params:自动把参数转为数组;

 

 

 

 

 

总结:所有高级语言之间都是相通的,只是一些简单语法上的不同、专业术语不同、再加上某些部分运行机制不同,其实也没有什么。做好比较,减少学习知识量,轻松学习。

 

相关文章:

  • 关于malloc的一个未解决的疑问
  • ASP.NET Core 基本项目目录结构 - ASP.NET Core 基础教程 - 简单教程,简单编程
  • 配置Windows2008R2桌面体验
  • Proxmox-VE搭配Ceph存储组建高可用虚拟化平台
  • jeetsite 4.0 框架搭建入门
  • 微信5.0绑定银行卡教程
  • python第三周:集合、函数、编码、文件
  • .sh 的运行
  • jQuery(四):HTML代码操作
  • SVN使用教程之-分支/标记 合并 subeclipse
  • leetcode341
  • Java编译时出现的一个编译错误
  • citus实战系列之四多CN部署
  • mysqlbinlog恢复数据-update20140820
  • 转: 利用RabbitMQ、MySQL实现超大用户级别的消息在/离线收发
  • @angular/forms 源码解析之双向绑定
  • 2017 年终总结 —— 在路上
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript异步流程控制的前世今生
  • JS题目及答案整理
  • Linux各目录及每个目录的详细介绍
  • Phpstorm怎样批量删除空行?
  • React Transition Group -- Transition 组件
  • session共享问题解决方案
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 多线程事务回滚
  • 机器学习中为什么要做归一化normalization
  • 前端面试之闭包
  • 前端自动化解决方案
  • 时间复杂度与空间复杂度分析
  • 实战|智能家居行业移动应用性能分析
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序实战练习(仿五洲到家微信版)
  • 学习ES6 变量的解构赋值
  • 智能合约开发环境搭建及Hello World合约
  • 数据库巡检项
  • ​configparser --- 配置文件解析器​
  • ​插件化DPI在商用WIFI中的价值
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #Z2294. 打印树的直径
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)JAVA中的堆栈
  • (转载)深入super,看Python如何解决钻石继承难题
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ***原理与防范
  • .NET 8.0 发布到 IIS
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • [16/N]论得趣
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例