好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java 与 c# 一些不同之处

java 与 c# 一些不同之处

java 与 c# 一些不同之处

近几日,看了一下 Android 开发,看到 java 与 C# 有许多不同的用法。

都是面向对象的语言,但是禅宗分南北,还是有不少用法上的不同,这里总结一下。

一. 类名.this 与内部类

在 java 中,经常看到类似类名.this 的用法,this 就是当前对象实例,为什么前面会出现类名呢?对此 C# 程序员会很纳闷。

在 Java 中,很多地方使用到了内部类,甚至可以在在内部类中访问外部类中的成员,这个时候,在内部类中使用 this 的时候,就会出现 this 到底是谁的问题,到底是表示内部类的当前对象实例,还是外部类的当前对象实例问题。

在 Java 中,通过在 this 的前面加上外部类的类名,表示在内部类中使用外部类的当前对象实例。

我们看下面的一个例子。

 package   core.sisheng;

  //   外部类定义 
 public   class   OuterClass {
    
      //   内部类定义 
     private   class   InnerClass
    {
          //   内部类中没有定义 id 成员,这里访问外部类中的成员 
         public   int  getId(){     return  OuterClass. this  .id;    }
          public   void  setId( int  id) { OuterClass. this .id =  id;}
    
          //   内部类中定义了 name 成员,直接访问内部类中的成员, 默认 this 访问当前类中的成员 
         private   String name;
          public  String getName() {  return   this  .name;}
          //   可以在 this 的前面加上一个内部类的名称 
         public   void  setName(String name) { InnerClass. this .name =  name;}
        
          //   内部类中也可以访问外部类中同名的成员,需要加上外部类的名称 
         public  String getOuterName() {  return  OuterClass. this  .name;}
          public   void  setOuterName(String name) { OuterClass. this .name =  name;}
        
        @Override
          public   String toString()
        {
              return  "Id: " +  this .getId() + ", Inner Name: " +  this .getName() + ", Outer Name: " +  this  .getOuterName();
        }
    }
    
      //   外部类中定义的成员 id 和 name 
     private   int   id;
      private   String name;
    
      private   InnerClass innerInstance;
      public   OuterClass()
    {
          this .innerInstance =  new   InnerClass();
          this .innerInstance.setId(20 );
          this .innerInstance.setName("Tom" );
          this .innerInstance.setOuterName("Alice" );
    }
    
      public   String toString()
    {
          return   this  .innerInstance.toString();
    }
    
} 

在C#中,类区分为嵌套类和非嵌套类,前者是声明在其他数据类型内部的类。后者是直接定义在某一个命名空间的类。C# 中很少定义嵌套类。

非内嵌类只允许使用public和internal的访问控制,而内置类则允许使用所有的五种访问控制符,private, protected , internal protected,public和internal。内部类也可以访问外部类的所有方法,包括instance方法和private方法,但是需要显式 的传递一个外部类的实例。

C#中的内部类能够使用外部类定义的类型和静态方法,但是不能直接使用外部类的实例方法,因此,不存在上面的问题。

在C#中,外部类对于内部类的作用更像是一个命名空间,只要访问控制允许,就可以使用下面的方法创建内部类对象实例。

OuterClass.InnerClass  obj =  new  OuterClass.InnerClass();

这个实例与外部类的任何实例没有任何直接的关系。类似于Java中的静态内部类。

二、类名.class 与类型

在 java 中还经常看到类名.class 的用法,这个用法相当于  C# 中的 typeof( 类名 ),用来获取类型的类型对象实例引用。

java中,每个class都有一个相应的Class对象,当编写好一个类,编译完成后,在生成的.class文件中,就产生一个Class对象,用来表示这个类的类型信息。获得Class实例的三种方式:

通过调用对象实例的 getClass() 方法获取该对象的Class实例。 使用Class的静态方法forName(),用类的名字获取一个Class实例。Class.forName(xxx.xx.xx) 返回的是一个类, 作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。 类名.calss的方式获取Class实例,对基本数据类型的封装类,还可以采用.TYPE来获取对应的基本数据类型的Class实例。

C# 中获取类型对象实例的方式更加简单明确一些。

通过调用数据实例的 GetType() 方法获取,这个方法继承自Object,所以C#中任何对象都具有GetType()方法,x.GetType(),其中x为变量名。 typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称。 通过 System.Type 的静态方法 System.Type.GetType()。  三、匿名类

在 java 中,匿名类的使用也比较多,比如在 Android 中,实现按钮的监听,经常会看到类似这样的代码。

 this .listener0 =  new   OnClickListener() {
    @Override
      public   void   onClick(View arg0) {
        Intent intent  =  new  Intent( MainActivity. this , ActivityFrameLayout. class  );
        setTitle( "FrameLayout" );
        startActivity( intent );
    }
}; 

在这里,OnClickListenter 实际上是一个接口,接口能用来创建对象实例吗?当然不能。

所以,java 在这里自动创建一个实现接口的匿名类,我们创建出来的实际上就是这个匿名类的对象实例。

这样做的好处就是我们没有必须再定义一个只使用一次的类,然后再通过这个类创建对象实例,简化了程序的开发。

比如,我们有下面的一个接口。

 public   interface   myInterface {
      void   onClick();
} 

就可以通过接口创建一个实现接口的匿名类的对象实例,然后使用这个对象实例。

myInterface instance =  new   myInterface(){
    @Override
      public   void   onClick()
    {
        System.out.println( "Clicked!" );
    }
};

instance.onClick(); 

在 C# 中,我们根本就不会使用这种形式,通过委托,可以非常简单地实现同样的功能。

 注意,java 中是没有委托的。

如果我们输出一下这个实例的类型,你会看到这个匿名类的实际类型的。

 System.out.println( instance.getClass());

  //    class core.sisheng.Study1$1 

 

 

标签:  java Andiord

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于java 与 c# 一些不同之处的详细内容...

  阅读:43次