Java和c#的语法对⽐(详细)
转载链接:
1.c#⼀个类只能继承⼀个类,继承语法:
class Dog : Anilmal{
}
2.c#中的sealed关键字相当于java中的final关键字,定义的类不能被继承,如:string类不能被继承
3.c#中protected表⽰继承类可以访问,外部⽆法访问
4.c#中的base关键字相当于java中的super关键字
5.c#中的构造函数
class A{
public A(){}
public A(string a):this(){}//表⽰调⽤上⾯的⽆参构造,this就表⽰调⽤本类的⽅法
public A(int a):this("123"){} //表⽰调⽤上⾯的string参数类型的构造
}
6.c#中对象的多态性,如果⽗类Animal中有⼀个⽅法public void shout(){...},⼦类Dog中也有⼀个⽅法,这时候你想使⽤Animal animal=new Dog(),采⽤animal调⽤Dog类中的shout⽅法,就需要改代码了,改成以下形式(各加⼀个关键字)
1 2 3 4 5Animal类中的shout⽅法改成以下代码:
public virtual void shout(){...}
Dog类中的shout⽅法改成以下代码:
public override void shout(){...}//即覆写掉⽗类的属性或⽅法//如果Dog还有⼦类,想继续覆写就不⽤再在Dog类中的⽅法加virtual关键字了,直接使⽤override就⾏了如:Dog类中还有⼀个⼦类Dog1,覆写Dog中的shout⽅法直接在Dog1中加下⼀代吗即可:public override void shout(){...}
7.c#中的抽象类:和java⼀样使⽤abstract关键字,如:
1 2 3public abstract class Animal{
public abstract void shout();//抽象⽅法也要使⽤abstract关键字,抽象类不能直接实例化,需要⼦类继承并且⼦类必须覆写抽象类的抽象⽅法(即在⽅法返回值前⾯加上override关键字,此时就不需要在抽象⽅法前⾯加上virtual关键字了)
}注意:抽象类中也可以写普通⽅法
8.c#中set,get⽅法的写法
1 2 3public 返回值类型属性名称{get;set;}如下代码:
public string name{get;set;}
9.c#中的接⼝采⽤interface关键字
1 2如下代码:interface IFly{
2 3 4interface IFly{
public void Fly();//这⾥的public可以省略,因为接⼝中的⽅法或属性只能是public权限}
如果A类继承B类,并且实现C接⼝,则代码如下:
1 2 3class A:B,C{ }
10.c#类是单继承,接⼝可以多继承⼀个类可以继承多个接⼝,抽象类可以继承接⼝,接⼝不能继承抽象类。
11.struct值类型,⽤来定义结构体,如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17class Program{
struct Location//结构体
{
public int X;
public int Y;
public Location(int x,int y){this.X=x;this.Y=y}//此处不允许定义⽆参构造 }
static void Test(Location loc){
loc.X=1;
loc.Y=1;
}
static void main(string[] args){
Location loc=new Location(0,0);
Test(loc);
}
}
<{...} catch(Exception e){...}finally{...}快捷键,先打出来try再连续按两次Tab建即可,如果异常此处处理不了也可以抛出来catch{throw;}
13.c#的泛型:
1 2 3 4 5//1<br>static T Sum<T>(List<T> nums) where T:struct//这⾥的where是对泛型的约束,struct表⽰数值型
{
T sum =default(T);//表⽰给sum赋初值(即数值型默认的值)
return sum;
}<br>//2<br>class Test{<br> public void X();<br>}<br>static void TestFunc<T>() where T:Test,new(){//如果这⾥不加new(),下⾯不能使⽤new T();如果这⾥<br>不加Test约束,下⾯不能调⽤Test类<br> T t=new T();<br>t.X();<br><br>}
14.c#中重载操作符(赋值符号不能重载):如下代码重载
1 2 3public static bool operator==(Location lhs,Locations rhs){ return false;
}
15.VS
· VS结构:⼀个解决⽅案底下可以添加多个项⽬,可以认为⼀个项⽬对应⼀个命名空间
· VS中创建类库,将⿏标光标放在"解决⽅案"上右键选择"新建",然后选择"类库",类库编译之后⽣成的就是dll⽂件。
· VS中引⽤类库,两种引⽤⽅法:
· 引⼊整个dll⽂件
在需要引⽤的项⽬的⽬录中有⼀个引⽤,将光标放在"引⽤"上⾯右键,选择添加引⽤,选择你要选择的即可(如果选择⾃定义的,就要选择"解决⽅案"下的"项⽬"再进⾏查)
· [DllImport(...)],仅⽤于⽅法
16.IDisposable接⼝结合using的使⽤
1 2 3 4 5 6 7//1.IDisposable是⼀个⾃动释放资源的接⼝,⾥⾯有⼀个Dispose⽅法
//在读写流或者需要使⽤close()关闭的地⽅使⽤using()结合此接⼝使⽤
static void Main(string args[]){
using(StreamWriter sq=new StreamWriter(new FileStream("",FileMode.Create,FileAccess.Write))){
sq.WriteLine("123");
}
}//此时在执⾏using的时候,在using语句执⾏完毕之前会⾃动执⾏IDisposable接⼝的Dispose⽅法从⽽⾃动释放资源
17.委托(引⼊委托也叫作匿名⽅法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24class Program
{
//1.声明委托类型
delegate bool Function(int num);
static Function BigThan10=delegate(int n){//此处的n与上⾯的num⼀⼀对应 return n>=10; };
//2.修改形参列表
static List<int> Traverse(List<int> nums,Function function){
var list=new List<int>();
foreach(var num int nums){
if(function(num)){
list.Add(num);
}
}
return list;
}
//3.传⼊委托
static void Main(string[] args){
Traverse(new List<int>(){1,2,3,4,5},BigThan10);//传⼊委托
Console.WriteLine();
Console.ReadLine();
}
}
18.委托写法的化简——Lambda表达式 1.语句Lambda
1 2 3 4//语法:(type var,...)=>{...}//加类型
(var,...)=>{...}//不加类型
var=>{...}//⼀个参数的时候
()=>{...}//没有参数的时候<br>//17中的第三部传⼊委托也可以也成<br>Traverse(new List<int>(){1,2,3,4,5},delegate(int n){return n>=10;});//显然这样写有点啰嗦,
1使⽤Lambda表达式可以简化成:(1) Traverse(new List<int>(){1,2,3,4,5},(int n)=>{return n>=10;});(2) Traverse(new List<int>() {1,2,3,4,5},(n)=>{return n>=10;});(3)如果只有⼀个参数括号也不⽤写了:Traverse(new List<int>(){1,2,3,4,5},n=>{return n>=10;});
2.表达式Lambda:没有{},但是只能有⼀条语句
1Traverse(new List<int>(){1,2,3,4,5},n=> n>=10);//将return也去掉19.系统⾃带的泛型委托
1 2 3 4(1)Action<> 例:List<T>.ForEach()(2)Func<> 例List<T>.Sum()
(3)Predicate<> 例 List<T>.FindAll() 例 List<T>.Find()
(1)的代码:
1 2var list=new List<int>(){1,2,3,4,5,6};
list.Foreach(i=>{Console.WriteLine(i)});//这⾥的i表⽰list集合中的⼀个个值
(2)的代码:
class Program
{
//1.声明委托类型
static Func<int, bool> BigThan10 = delegate(int n)
{
return n>=4;
};
//2.修改形参列表
static List<int> Traverse(List<int> nums, Func<int, bool> function){
var list=new List<int>();
foreach(var num in nums){
if(function(num)){
list.Add(num);
}
}
return list;
}
//3.传⼊委托
static void Main(string[] args)
{
var list=new List<int>(){1,2,3,4,5,6};
var n=Traverse(list, BigThan10);
n.ForEach(i=>Console.WriteLine(i));
Console.ReadLine();
}
}
(3)的代码
20.c#中的foreach是只读的,不能给其赋值。
21.c#中的Dictionary相当于java中的map,实例化直接使⽤Dictionary,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
语法对⽐
Java C#
访问修饰符public
修饰类、接⼝、变量、⽅法。
对所有类可见。
修饰类、接⼝、变量、⽅法。
对所有类可见。
internal⽆。
修饰类、接⼝、变量、⽅法。
类,接⼝的缺省访问修饰符。
同⼀个程序集的对象可见。protected⼦类可见。⼦类可见。
private类内部可见。
变量,⽅法的缺省访问修饰符
类内部可见。
default
类、接⼝、变量、⽅法的缺省修饰符。
同⼀包内可见。
⽆。
基本类型
基本类型,⽆⽅法可调⽤。
作为局部变量时,储存与栈。作为字段时,跟随于
实例。
值类型,继承object,具有ToString()等⽅法。
作为局部变量时,储存与栈。作为字段时,跟随于实例。 布尔值 boolean bool
整形 short,int,long short,int,long
浮点数 float,double float,double
可空基本类型
例如:Integer是引⽤类型,Integer是int的包装类。
例如: int?其实是Nullable<int>的语法糖,⽽Nullable<int>依然是值
类型。
布尔值 Boolean bool?
整形Short,Integer,Long short?,int?,long?
浮点数 Float,Double float?,double?
⾼精度数
值类型
BigDecimal decimal?
源⽂件
组织
导⼊ 使⽤包的概念,关键字import导⼊使⽤命名空间的概念,关键字using导⼊
类⽂件源⽂件名要和Public类名保持⼀致,
最多存在⼀个Public修饰的类,
⽂件名后缀是.java
没有java中的限制,
⽂件名后缀是.cs
枚举 枚举关键字enum,
引⽤类型,
和class差不多,可以有字段和⽅法,
可以添加私有构造函数
writeline输出数值变量关键字enum,
值类型,
默认继承int,可以继承其他值类型
常量常量 关键字final修饰变量,字段,定义时赋值 关键字const修饰变量,字段,定义时赋值
关键字readonly修饰,可以在构造函数中赋值
密封 密封 关键字final修饰⽅法,类,表⽰不可继承,不可重写 关键字sealed修饰⽅法,类,表⽰不可继承,不可重写
属性属性 只有字段概念,
⼀般情况下是要定义字段XX,⽅法getXX()和
setXX()
C#引⼊属性概念,简化了操作,
只需要定义XX{get;set;}
判断类
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论