c#与java对比

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方法,就需要改代码了,改成以下形式(各加一个关键字)

Animal类中的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关键字,如:

public abstract class  Animal{
	public abstract void shout();//抽象方法也要使用abstract关键字,抽象类不能直接实例化,需要子类继承并且子类必须覆写抽象类的抽象方法(即在方法返回值前面加上override关键字,此时就不需要在抽象方法前面加上virtual关键字了)
}注意:抽象类中也可以写普通方法

8.c#中set,get方法的写法

public 返回值类型 属性名称{get;set;}
如下代码:
public string name{get;set;}

9.c#中的接口采用interface关键字

如下代码:
interface IFly{
   public void Fly();//这里的public可以省略,因为接口中的方法或属性只能是public权限
}

  如果A类继承B类,并且实现C接口,则代码如下:

class A:B,C{

}

10.c#类是单继承,接口可以多继承一个类可以继承多个接口,抽象类可以继承接口,接口不能继承抽象类。

11.struct值类型,用来定义结构体,如下代码:

class 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);
	}
}

12.try{...} catch(Exception e){...}finally{...}快捷键,先打出来try再连续按两次Tab建即可,如果异常此处处理不了也可以抛出来catch{throw;}

13.c#的泛型:

//1static T Sum<T>(List<T> nums) where T:struct//这里的where是对泛型的约束,struct表示数值型
{
	T sum =default(T);//表示给sum赋初值(即数值型默认的值)
	return sum;
}//2class Test{  public void X();}static void TestFunc<T>() where T:Test,new(){//如果这里不加new(),下面不能使用new T();如果这里不加Test约束,下面不能调用Test类  T t=new T();t.X();

}

14.c#中重载操作符(赋值符号不能重载):如下代码重载

public static bool operator ==(Location lhs,Locations rhs){
	return false;
}

15.VS

  •  VS结构:一个解决方案底下可以添加多个项目,可以认为一个项目对应一个命名空间

  •  VS中创建类库,将鼠标光标放在"解决方案"上右键选择"新建",然后选择"类库",类库编译之后生成的就是dll文件。

  •  VS中引用类库,两种引用方法:

    • 引入整个dll文件

      在需要引用的项目的目录中有一个引用,将光标放在"引用"上面右键,选择添加引用,选择你要选择的即可(如果选择自定义的,就要选择"解决方案"下的"项目"再进行查找)

    • [DllImport(...)],仅用于方法

16.IDisposable接口结合using的使用

//1.IDisposable是一个自动释放资源的接口,里面有一个Dispose方法
//在读写流或者需要使用close()关闭的地方使用using()结合此接口使用
static void Main(string args[]){
	using(StreamWriter sq=new StreamWriter(new FileStream("777.txt",FileMode.Create,FileAccess.Write))){
		sq.WriteLine("123");
	}
}//此时在执行using的时候,在using语句执行完毕之前会自动执行IDisposable接口的Dispose方法从而自动释放资源

17.委托(引入委托也叫作匿名方法)

class 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

//语法:(type var,...)=>{...}//加类型
	(var,...)=>{...}//不加类型
	var=>{...}//一个参数的时候
	()=>{...}//没有参数的时候//17中的第三部传入委托也可以也成Traverse(new List<int>(){1,2,3,4,5},delegate(int n){return n>=10;});//显然这样写有点啰嗦,
使用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:没有{},但是只能有一条语句

Traverse(new List<int>(){1,2,3,4,5},n=> n>=10);//将return也去掉

19.系统自带的泛型委托

(1)Action<> 例:List<T>.ForEach()
(2)Func<> 例List<T>.Sum()
(3)Predicate<> 例 List<T>.FindAll()
       例 List<T>.Find()

 (1)的代码:

var 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,

原文地址:https://www.cnblogs.com/wxl123/p/11445916.html

时间: 2024-10-27 01:34:56

c#与java对比的相关文章

C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义(转载)

C#与Java对比学习:类型判断.类与接口继承.代码规范与编码习惯.常量定义 类型判断符号: C#:object a;  if(a is int) { }  用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 instanceof 符号判断 类与接口的继承: C#:public class MDataRow : List<MDataCell>, IDataRecord, ICustomTypeDescriptor Java:publi

Java对比两个数据库中的表和字段,写个冷门的东西

Java对比两个数据库中的表和字段,写个冷门的东西 转载的 来源网络 目前所在的项目组距离下个版本上线已经很近了,就面临了一个问题:开发人员在开发库上根据需要增加数据表.数据字段.或者变更了字段类型或者字段长度等等. 由于时间比较紧迫,导致在开发过程中不可能一一把DDL数据库脚本记录下来,在比较大的项目中,比如我所在项目开发的系统大概包含了800张左右的表,字段上10000个的情况下,人工处理明显不可行,所以我们就得通过程序来判断比对,哪些是我们需要新增加的表,哪些是我们需要新增加的字段,哪些是

java对比IO和NIO的文件读写性能测试

原文:java对比IO和NIO的文件读写性能测试 源代码下载地址:http://www.zuidaima.com/share/1550463508466688.htm 1. NIO采用更接近操作系统执行IO的方式:通道和缓存器:顾名思义,数据源的数据由缓存器通过通道进行传输. 2. 在JDK5之后,原始IO系统底层用NIO进行了优化,这可以通过sun公布的源码中找到,但是,NIO系统性还是比IO强. 3. 在稍微研究了IO源码以及部分sun源码,我觉得IO系统的性能瓶颈主要是由于原始的IO架构因

大话设计模式-装饰者模式C#与Java对比存在的问题

最近看了大话设计模式书中的装饰者模式,然后用C#照着写了一遍,发现运行出来的结果和书上不一样,然后又用Java写了一遍 和书上一样,同样的代码,不同的编译器与运行环境,Java和.NET 下面贴上代码 首先是Java实现 Beverage(饮料抽象类) CondimentDecorator(调料抽象类,继承Beverage) Latte(拿铁饮料,继承Beverage) Mocha(摩卡调料,继承CondimentDecorator) public abstract class Beverage

Java 对比Hashtable、Hashmap、Treemap有什么不同?(正在整理学习中)

Hashtable.Hashmap.Treemap都是最常见的一些Map实现,是以键值对的形式存储和操作数据的容器类型. Hashtable是Java类库提供的一个哈希实现,本身是同步的,不支持null键和null值,由于同步导致性能开销,所以已经很少被推荐使用. HashMap是应用更加广泛的哈希表实现,行为上大致与HashTable一致,主要区别在于HashMap不是同步的,支持null键和null值等.通常情况下HashMap进行get和put操作可以达到常数时间的性能,所以它是绝大部分利

Java 8 默认方法和多继承深入解析

以前经常谈论的Java对比c++的一个优势是Java中没有多继承的问题. 因为Java中子类只能继承(extends)单个父类, 尽管可以实现(implements)多个接口,但是接口中只有抽象方法,方法体是空的,没有具体的方法实现,不会有方法冲突的问题. 这些都是久远的说法了,自从今年Java 8发布后, 接口中也可以定义方法了(default method). 之所以打破以前的设计在接口中增加具体的方法, 是为了既有的成千上万的Java类库的类增加新的功能, 且不必对这些类重新进行设计. 比

java学习路径1--转自byr

Kopernikus 以过来人的身份谈谈我的感受.    首先如果只是ssh框架的话,是没有理由能拿到bat及这层次之上的offer的.因为这样的人太多了,而且框架的使用也比较简单,除非:对该框架非常了解,具备根据公司情况开发适用于公司框架的能力,即要求你对java反射机制.设计模式.多线程要有较深理解,最好熟悉jvm相关机制.(其实对着有较深理解的情况下也不会对“ssh”这个关键字这么在意了)    其次,我觉得java体系可以分成四个部分,从高到低:框架开发,网络协议,java语言,jvm.

java中类继承,到底继承了什么?

继承的最大好处就是为了实现代码的复用.那么,子类到底从父类得到的什么呢? 实例成员 父类的private成员不会被子类继承,子类不能访问.但是子类对象的确包含父类的私有成员. 父类的 包访问成员 继承为子类的包访问成员.就好像他们直接定义在子类中一样. 父类的 protected 成员继承为子类的protected 成员.就好像他们直接定义在子类中一样. 父类的 public 成员继承为子类的public 成员,就好像他们直接定义在子类中一样. 实例方法 继承到的实例方法在子类中可以直接被使用,

C++ 与Java差异总结

工作需要,要学习Qt,之前学过Java,我想C++和Java对比着来学习应该可以很快上手. C++的核心概念:编译单元,头文件,目标文件,库 Qt:信号和槽机制,foreach Qt中没有用到的c++概念:模板类,模板函数的定义    共用体类型,异常   这三个就放在以后再学 差异: 1. C++不会在运行时检验数组是否越界,没有垃圾回收机制 2.C++没有为所有的类提供一个可以从中继承出来的一般类object. 3.Qt则为所有的类型提供了一个简单的基类 4.Java中的"接口"的