zoukankan      html  css  js  c++  java
  • 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#的泛型:

    //1
    static T Sum<T>(List<T> nums) where T:struct//这里的where是对泛型的约束,struct表示数值型 { T sum =default(T);//表示给sum赋初值(即数值型默认的值) return sum; }
    //2
    class 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,

  • 相关阅读:
    JavaEE三层架构
    请求重定向
    响应的中文乱码问题
    Apache的ServerAlias的作用
    bootstrap 常用class
    linux 退出当前命令的编辑
    硬链接和软链接
    ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry ’1′ for key ‘PRIMARY’
    ie浏览器许多图片放在一起会有间隙
    Could not initialize class utils.JdbcUtils
  • 原文地址:https://www.cnblogs.com/wxl123/p/11445916.html
Copyright © 2011-2022 走看看