Java语法糖和面向对象的关系

Java语法糖和面向对象的关系

Java语法糖(Syntactic Sugar),是一种添加在Java语言中的语法,这种语法对语言本身功能并无意义,只是为了能使程序员更方便的开发程序,同时增强程序代码的可读性,减少出错情况。Java是一种与平台无关的高级语言,但是其语法糖并不被虚拟机所支持,在编译成字节码阶段就自动转换成简单常用语法。

虽然语法糖一词我们在Java语言使用过程中很少听过,但我们在编程时经常遇到它,Java语法糖包括:泛型与类型擦除、自动装箱和自动拆箱、变长参数、增强for循环、内部类和枚举类等。下面列举它和面向对象的关系。

1.泛型和类型擦除

早期的JDK并不支持泛型,只能通过Object类是所有类的父类和强制类型转换来实现泛型的功能。强制类型转换的缺点就是把编译期间的问题延迟到运行时,JVM并不能为我们提供编译期间的检查。在JDK1.5中,Java引入了泛型机制。这种泛型机制是通过类型擦除来实现的,即java中的泛型只在提供类型检查的程序源代码中有效,在编译后的字节码中自动用强制类型转换进行代替。

在面向对象的Collection中处处体现泛型和多态的思想,两者还具有一定相似性。多态是面向对象的三大基本特征之一,其实现技术为动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。而泛型是参数化类型,当使用这个泛型类的时候再去确定这个类里面的成员具体是什么类型,根据传入的参数类型再去确定其行为。

2.自动装箱和拆箱

Java中的自动装箱和拆箱就是指基本数据类型与他们包装类型之间的相互转换。Java是面向对象的编程语言,但其中的基本数据类型不是对象,它们不需要new操作,也不能调用任何方法,提供简便的同时也有许多障碍。因此Java为这些基本类型提供了包装类,并且为了使用方便,提供了自动装箱和拆箱功能,自动装箱和拆箱的使用便是一个语法糖。将基本数据类型打包成为对象,便可以携带更多的数据和调用方法。

3.变长参数

变长参数就是方法可以接受长度不确定的参数列表。使用变长参数有两个条件,一是变长的那部分参数具有相同的类型,二是如果方法有多种参数,变长参数必须位于方法参数列表的最后。变长参数同样是Java中的语法糖,其内部类实现是Java数组,以Java数组作为方法的入参,通过传入参数的个数决定数组的长度。而究其本质,变长参数也是面向对象三大基本特征之一多态中的方法重载。方法重载是方法具有相同签名,但可以拥有不同的参数列表和返回值类型,变长参数符合了方法重载的要求。

4.增强for循环

增强for循环是JDK5.0新添加的特性,它又称for-each循环,它的加入只为了简化遍历循环集合,方便程序编写。但是如果需要访问集合或数组的下标,它就不能满足我们的要求了,因为它丢失了下标信息。for- each简化了代码,但它的实现原理还是原来的for循环,所以它也只是一个Java语法糖。

5.内部类和枚举类

内部类是一个类中又定义了一个完整的类结构,内部类可以直接访问外部类的成员属性,包括私有属性,而外部类访问内部类的成员属性时需要创建内部类的对象。内部类之所以能访问外部类中的成员,是因为内部类中都持有一个外部类的引用,这个引用是外部类名.this,this关键字也是面向对象基本特征封装中的特性之一。内部类可以定义在外部类的成员位置上,也可以定义在外部类中的局部位置上,当内部类被定义在局部,只能访问局部中被final修饰的局部变量。

JDK5.0之前的java版本缺失的一项特性是枚举,许多Java程序员都感觉需要这一特性,枚举是一种新的类型,允许用常量来表示特定的数据片段,而且全部都以类型安全的形式来表示。创建枚举需要使用关键字enum,形式最简单的枚举是一系列具有名称的变量,每个枚举常量都是所属枚举类型的对象。如果为枚举定义了构造函数,那么当创建每个枚举常量时都会调用该构造函数,对于枚举定义的实例变量,每个枚举常量都有它的副本。使用枚举类可以使程序更加健壮,避免创建对象的随意性。这也是面向对象编程中的封装思想,把数据和过程包围起来,通过已定义界面对数据进行访问。

除了以上的Java中语法糖,还有断言、JDK7的switch 支持字符串、自动关闭资源等, 经了解我们就会发现,语法糖方便了程序员的开发,提高了程序的开发效率,增强了程序的严谨性和降低了程序的出错率,而面向对象的Java语言其本质目的也是为了使计算机语言更简单,让人更容易理解,使开发程序更加轻松,所以两者相辅相成,语法糖是基于面向对象的特性,它们出现的目的都是为了使我们程序员能更方便的开发程序。

你可能感兴趣的:(Java之面向对象)