CSC/ECE 517 Fall 2011/ch3 3h ss: Difference between revisions
No edit summary |
|||
Line 188: | Line 188: | ||
* The primitive types limit the range of values a variable can take. e.g. In Java, a variable of type int or an object of Integer can have only one of the 2^32 values i.e. from -(2^16) to (2^16)-1. | * The primitive types limit the range of values a variable can take. e.g. In Java, a variable of type int or an object of Integer can have only one of the 2^32 values i.e. from -(2^16) to (2^16)-1. | ||
* The primitive type values cannot be passed to a method which expects the objects. | * The primitive type values cannot be passed to a method which expects the objects. | ||
== Conclusion == | |||
Having primitive data types as primitive objects enhances the object oriented functionality of a language and takes it closer to being pure. The closer the language is to being a pure object oriented language, the more powerful it is. It also bridges the gap between novice programmers and experienced programmers by making powerful features basic to the language and makes coding simpler. | |||
== References == | == References == |
Revision as of 02:48, 7 October 2011
Introduction
In any programming language, the data type refers to the class of data which contains specific type or range of values. Data types are used along with variables used in the program. The data type tells us what kind of values the variable can store, what is the range of the values and how much space the values take in memory etc.
The primitive data types refer to the built-in data types which are supported by the programming language. Often 'data types' and 'primitive data types' are used interchangeably. But not all data types are primitive. Programming languages have some non-primitive data types or derived data types which are provided by the language by making use of its primitive data types.
The common built-in data types or primitive data types are integers, floating point numbers, characters, strings and boolean.
- Integers - Integers represent the whole numbers which can be positive or negative or zero, e.g. 9999, 0, -25, etc.
- Floating point numbers - Floating point numbers represent the numbers which are fractions or contain floating-decimal points, e.g. -3.002, 2.5, 22.0, etc.
- Characters - Characters represent any single letter, number, space, punctuation mark, or symbol that can be typed on a computer, e.g. 'a', '9', ' ', '!' , '\n', etc.
- Strings - Strings represent the sequences of characters or simply any text, e.g. "Hello!", "9 am to 6 pm", etc.
- Booleans - Booleans represent the true or false values. Sometimes, instead of true and false, 1 and 0 are used to represent the boolean values.
Many object-oriented programming languages provide support for primitive data types while some object-oriented programming languages provide support for primitive objects along with primitive types.
Definition
Primitive objects refer to the objects of built-in classes which provide more functionality than the primitive types. Some object-oriented programming languages provide support for only primitive objects (i.e., in such languages all primitive types are objects).
Different object-oriented programming languages implement these primitive data types and primitive objects in a different manner.
Primitive objects in different OO languages
Java
In Java, there are 8 primitive types: boolean, char, byte, short, int, long, float, and double
For each of these primitive types, Java provides wrapper classes to create primitive objects which wrap the primitive data values. A wrapper not only contains the primitive data value, but it also defines properties and methods that can be used to manipulate that data. In Java, the primitive values are not implicitly converted to primitive objects. Instead, methods are provided for doing explicit conversion. The primitive objects are stored on heap in memory while the variables containing primitive values are stored on stack.
Primitive Type | Wrapper Class | Size |
---|---|---|
boolean | Boolean | 1-bit |
char | Character | 16-bit |
byte | Byte | 8-bit |
short | Short | 16-bit |
int | Integer | 32-bit |
long | Long | 64-bit |
float | Float | 32-bit |
double | Double | 64-bit |
Example:
int i = 10; int ii = 20; Integer I = new Integer(i); Integer II = new Integer(ii); System.out.println(I+II); System.out.println(I.equals(II));
Output:
30 false
These wrapper classes are primitive or not can be found using isPrimitive() method.
System.out.println(INTEGER.TYPE.isPrimitive()); System.out.println(BOOLEAN.TYPE.isPrimitive());
Output:
true true
In Java, the comparison operations work in the same way on the primitive objects as well as any other class objects but different on the primitive types. The == operator when used on objects checks whether they refer to the same object but when used on variables of primitive types checks whether they contain the same value.
Example:
int i = 10; int ii = 10; Integer I = new Integer(i); Integer II = new Integer(ii); System.out.println(I==II); System.out.println(i==ii);
Output:
false true
C#
C# is a strongly typed language, where it is necessary to declare the data type of a variable and also be aware of the data type conversion. C# provides a significant number of primitive data types. See [1]
Because C# represents all primitive data types as objects, it is possible to call an object method on a primitive data type. For example:
static void Main() { int x = 7; object o = x; System.Console.WriteLine(o.ToString()); }
Some data types (e.g. Decimal and String) can appear like primitives at first sight, but are actually not. So it is important to exercise caution before making such assumptions. To test whether a particular type is a primitive or not you can use the property Type.IsPrimitive.
Consider the following example:
if (t.IsPrimitive) // where t is the type { // Is Primitive } else if (t == typeof(Decimal)) { // Is Decimal } else if (t == typeof(String)) { // Is String } else { // Other type }
JavaScript
There are 5 primitive data types in JavaScript: string, number, boolean, null and undefined.
For string, number and boolean values, there are corresponding classes just like in Java to create primitive objects which wrap the primitive values.
Primitive Type | Wrapper Class |
---|---|
string | String |
number | Number |
boolean | Boolean |
In JavaScript, the primitive value is implicitly converted to a primitive object whenever someone tries to access a property or invoke a method on the primitive value and the primitive object is used in place of the primitive value. Since the object contains properties and methods, the use of primitive value as an object succeeds. After the property is accessed or the method is processed, the primitive object is no longer needed and hence discarded. The same is true for the other primitive types and their corresponding primitive objects.
Example:
var upperCaseString = "APPLE"; var lowerCaseString = upperCaseString.toLowerCase(); // assigns string "apple" to lowerCaseString var s = "Hello" var len = s.length; // assigns value 5 to len
Ruby
Since Ruby is a pure object oriented language, everything in Ruby is an object. Hence, all primitive types such as integers, floating point numbers, strings, are objects of a built-in class. All integers are primitive objects of either class Fixnum or Bignum. A numeric literal with a decimal point and/or an exponent is a primitive object of Float. Single quoted literals and double quoted literals are primitive objects of String.
Example:
puts 10.class puts 7.45.class puts 'hi'.class puts "hello".class
Output:
Fixnum Float String String
This indicates that 10 is converted into an object of type Fixnum, 7.45 is converted into an object of type Float, 'hi' and "hello" are both converted into an object of type String.
Since all primitive types in Ruby are objects, we should be able to call methods of the Object class on them. Let us demonstrate the same for integer and float using the following example:
a=10 puts a.to_f b=20.5 puts b.to_i
Output:
10.0 20
Advantages of primitives
There are several advantages of treating primitives differently from class objects. Here are some:
- Accessing an object may require a lot of memory look-ups, depending on the implementation of the language. Accessing the values of primitive variables is faster that accessing data in objects since primitives require fewer memory fetches.
- It improves performance and verification. Primitive types such as integers, boolean, floats are the frequently used features of an object oriented programming language like. So, we want operations involving variables of these types—operations that are at the heart of our computing model—to run fast.
- It provides several methods and instance variables to the primitive types in some languages, which simplifies the code.
Disadvantages of primitives
- The primitive types limit the range of values a variable can take. e.g. In Java, a variable of type int or an object of Integer can have only one of the 2^32 values i.e. from -(2^16) to (2^16)-1.
- The primitive type values cannot be passed to a method which expects the objects.
Conclusion
Having primitive data types as primitive objects enhances the object oriented functionality of a language and takes it closer to being pure. The closer the language is to being a pure object oriented language, the more powerful it is. It also bridges the gap between novice programmers and experienced programmers by making powerful features basic to the language and makes coding simpler.
References
1. Java's Primitive Data Types
2. Primitives in Javascript
3. C# Primitive Datatypes
4. Data Types (C# vs. Java)
5. Pros and cons of primitives
6. Stack and Heap memory
7. Primitives Vs. Objects