Transcript Public

Coverage
• Introduction
• Various design issues for OOPs
• C++ and its support for OOP
• Java and its support for OOP
• C# and its support for OOP
• Ruby and its support for OOP
• Python and its support for OOP
• Differences between Java and C++
• Event Handling in Java
• Programming in Object Oriented Languages
OOP
1
Introduction
• Motivation for Object Oriented Languages:
− Encapsulate and reuse programs and data structures
− Inheritance paved way for reusability
− Reuse should provide extension (add new methods or entities),
restriction (derivation restricted to a specific group) and partially
redefined (certain components can be changed)
− Also support polymorphism (with generic data structures) and
abstraction
− Imperative languages does not posses the option of controlling the
use of global variables.
• Object Oriented Programming types:
− OOP is an added feature to the language:
• C++ is called as relative OOP as you can write non-object
oriented programs as well
• Ada supports procedural and data-oriented programming
− Language supports OOP but appearance and basic structure is
similar to that of imperative languages
• Java is based on C++
OOP
2
Introduction
• Object Oriented Programming types:
− Pure OOP languages:
• Supports the following:
− Encapsulation and Information hiding
− Inheritance
− Polymorphism and Dynamic Binding
− All pre-defined types in the language are objects
− All user-defined types are also objects
− Any operation required is handled by sending messages to
objects
− Example: Smalltalk, Eiffel, Ruby
• Different paradigms evolved as procedural (in 1950s to 1970s), dataoriented (in early 1980s) and Object Oriented Programming (in late
1980s)
OOP
3
Introduction
• Abstraction
− Process of making complex stuff simple by providing appropriate
classes to represent those complex entities
− Classes provide abstraction of a thing (object) which contains the
characteristics (attributes) and the behaviour (methods)
− Data Abstraction: encapsulation mechanism to limit both the scope
and the visibility of the data values and functions defined for the
values
− Process Abstraction:
• The way to say what has to be done and not how to do it
• Many sort methods are available in many languages which hide
the implementation of the sorting algorithm
• Abstract Data Types
− Process of creating new objects and hiding its representation from
the program units that use them
− Actual implementation is not made known to the user but users can
use the implementation
− Ex. int in Java – representation is hidden and operations are builtin
OOP
4
Classes and Objects
−
−
−
−
−
−
−
−
−
−
−
Class: Most common abstract data type
Class instances are called as objects
A class that inherits is called a derived class or a subclass
The class from which another class inherits is called as a parent
class or superclass
A class which is within a class is called as inner class
Subprograms that define operations on objects are called as
methods
Calls to methods are called as messages, which are made up of a
method name and destination object
Type checking (for methods) is done at compile-time in staticallytyped languages like Java and checking is done at run-time in
dynamically checked languages like Smalltalk
All the methods of an object are jointly called as message protocol
or message interface.
A class can be made up of two types of variables: class variable
which is one per class and instance variable which is one per
object
Java: class and array are the only two structured types
OOP
5
C++ type checking example
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
#include <iostream>
using namespace std;
class baseclass
{ public: baseclass() { x = 0; cout << "Base class constructor" << endl;}
private: int x; // private variable
};
class subclass: public baseclass // inheritance
{ public: subclass() { s = 0; cout << "Subclass constructor" << endl;}
private: int s;
};
int main()
{ baseclass e; // calls the base class constructor
subclass s; // calls both base class and sub class constructors
e = (baseclass) s; // is allowed
// e = s; // is allowed and same as previous statement
// s = (subclass) e; // Compilation error - not allowed
}
OOP
6
Encapsulation
• Technique of packaging things together so as to form a well-defined
programming unit
• By packaging things, encapsulation isolates the operational details of a
procedure from its usage
• For example, integer type hides the internal structure of integer and
also does not permit the user from manipulating the bits
• Encapsulation Constructs: Divide large programs into small programs
called as Modules. Subprograms that are logically related are grouped
but separately compiled called as compilation units
• Naming Encapsulation: Divide large programs into many global names
based on logical groupings. Ex. C++ Namespaces and Java Packages
• Encapsulation in C: Interface is placed in a header file.
• Encapsulation in C++: Similar to C. Friend functions can access
private members of the friend class.
• Encapsulation in C#: C# Assembly provides the concept of combining
many files into one single executable file or a dynamic link library.
• Encapsulation in Ruby: Ruby has modules which are used to
encapsulate methods and constants.
OOP
7
Introduction
• Information Hiding:
− Provide the interface to reveal only those that ought to be revealed
− Different from Encapsulation:
• In Encapsulation: packaging makes the information hidden
• In Information Hiding: Only interface is provided and thus hiding
information.
• Constructor
− Memory allocation and initialization is done by constructor
− They do not create instances
− Implicitly called
− Same name as class, with or without parameters
− Constructor without parameters is called as default constructor
− C++: Parameterless constructor is given by default if no constructor
is specified.
• Destructor
− Used to clean or reclaim heap storage
− Implicitly called when the object lifetime ends
− Has the same name as class but with a tilde preceded
− Must be parameterless
OOP
8
Inheritance
• Access controls on encapsulated entities can hide entities
• Code reuse is provided by inheritance
•
•
•
•
•
•
•
•
•
•
•
•
public class test {
public int a;
// instance variables of the class.
public test( ) { … }
// constructor of the class.
// methods specified in the class.
public <type> functionname ( parameters ) { … }
}
int main ( )
{
test y;
// This part is the client of the class as it uses the class.
// y is an object or instance of the class.
}
OOP
9
Inheritance
10
• Single and Multiple Inheritance
− If a subclass inherits from only one parent class, then it uses single
inheritance
− If a subclass inherits from more than one parent class, then it uses
multiple inheritance
− Multiple inheritance might have name collisions
− Classes B and C are derived from the common parent A. Also, class
D has both B and C as parents. This kind of setup is called as
diamond or shared inheritance.
− If a method is defined both in B and C, then which one does class D
derives?
A
C
B
D
A
A
B
C
D
OOP
Polymorphism
11
• When a class hierarchy includes classes that override methods and such
overridden methods are called through a polymorphic variable (or
assignment polymorphism), the binding to the correct method must
be handled dynamically.
• Example: ParentClass sampleobject = new ChildClass();
• Pure Polymorphism:
− A single function can be applied to varied type of arguments
• Inclusion Polymorphism or Overriding:
− Child class has the function with the same signature as that of the
parent class
• Subtype Polymorphism:
− Operations of one type can be applied to another
− Sometimes, Pure polymorphism is also called as Subtype
polymorphism.
− Alternatively, Inclusion polymorphism is also called as Subtype
polymorphism
OOP
Polymorphism
Pure Polymorphism
12
Inclusion Polymorphism
import java.util.*;
class ParentClass
{ void fn(){
class baseclass{
public void multOverride(int i, int j){
int n = i*j; System.out.println(n); } }
System.out.println("ParentClass.fn"); } }
class Overriding extends baseclass {
class ChildClass extends ParentClass
// same signature as base class but
{ void fn(){
different implementation
System.out.println("ChildClass.fn"); } }
public void multOverride(int i, int j){
public class PurePolymorphism
int n = i*j*2; // multiple i and j by
{ public static void function(ParentClass x) 2.
{ System.out.println("function");
System.out.println(n); } }
x.fn(); }
public class OverloadingOverriding{
public static void main(String[] args)
public static void main(String[] args){
{ ParentClass test = new ChildClass();
Overriding override = new
function(test); test.fn(); } }
Overriding();
override.multOverride(1,2); } }
OOP
Polymorphism
• Adhoc Polymorphism or overloading
− Different functions are denoted with same name but with different
signatures
• Parametric Polymorphism
− Type of the parameters is unspecified in the declaration
− Ex. Ada Generic, C++ Template
−
−
−
−
−
−
−
−
−
−
−
#include <iostream>
using namespace std;
template <typename T>
T max(T x, T y) { return x > y ? x : y; }
int main()
{
int i = 1 ,j = 2; cout << max(i,j) << endl; // Prints 2
float a = 2.0, b = 3.0; cout << max(a,b) << endl; // Prints 3
string s = "abc", t = "def"; cout << max(s,t) << endl; // Prints def
return 0;
}
OOP
13
Polymorphism
Subtype Polymorphism
import java.util.*;
abstract class ParentClass
{ abstract void fn(); }
class ChildClass1 extends ParentClass
{ void fn(){
System.out.println("ChildClass1.fn"); }
}
class ChildClass2 extends ParentClass
{ void fn(){
System.out.println("ChildClass2.fn"); }
}
public class SubtypePolymorphism
{ public static void main(String[] args)
{ ParentClass test1 = new ChildClass1();
test1.fn();
ParentClass test2 = new ChildClass2();
test2.fn(); } }
14
Adhoc Polymorphism
class Overloading {
// Methods with same name but with
different signatures
public void addOverload(int i, int j){
int n = i+j; System.out.println(n); }
public void addOverload(int i, int j,
int k){
int n = i+j+k; System.out.println(n);
}}
public class OverloadingOverriding{
public static void main(String[] args){
Overloading overload = new
Overloading();
overload.addOverload(1,2);
overload.addOverload(1,2,3); } }
OOP
Introduction
• Type checking and Polymorphism
− Type checking between formal and actual parameters is
vital
− Dynamic error checking is costly and delays error
detection
• Abstract Method and Class
− An abstract method is one that does not include the
implementation of the method but has the protocol
(definition)
− An abstract class is one that includes at least one
abstract method. It cannot be instantiated
− Abstract methods are sometimes called deferred and a
class that has a deferred method is called a deferred
class. It is called so because the implementation is
deferred until a subclass defines it
OOP
15
Introduction
• Various Class types:
− Data Manager Classes: The data managed is either
called as data or state. Data Manager Classes maintain
data or state information.
− Data Sinks or Data Sources Classes: Generates data
like a random number generator but does not hold the
data for any period of time.
− View or Observer Classes: Displays the information on
an output device such as a terminal screen.
− Facilitator or Helper Classes: Used to do complex
tasks but has very minimal or no state information
themselves.
OOP
16
Exceptions
17
• An Exception is any unexpected or infrequent event which is raised and
thrown, during runtime.
• An execution handler is a procedure or code sequence that is designed
to be executed when a particular exception is raised. An exception
handler is said to handle or catch an exception.
• Exception handler might cause the program to be continued (called as
resumption model) or terminated (called as termination model).
• Resumption model: the process of returning back through function
calls to the caller during the search for a handler is called call
unwinding or stack unwinding
• Generally, languages support termination model
• C language: No exception handling
OOP
Exceptions
• Synchronous exception is caused by errors that the programs can
definitely catch
• Asynchronous exception is something that could happen any time and
might be due to failure of hardware devices or memory allocation or
communication problems
• Issues related to Exceptions:
− Presence or absence of predefined exceptions
− Scope of user-defined exceptions
− Passing of control to the handler: Termination or resumption model
OOP
18
Object and Class representations
• In Software engineering, class diagram and object diagram are used to
represent the information about classes and objects
• Class diagram is used to provide information about the class; object
diagram is used to indicate information about objects
• This representation is done in Unified Modeling Language (UML)
• Class/Objects representation:
− Represented as box with three rows
− class name, attributes (member variables) and the operations
(member functions) associated with the class
• Visibility of the class
− Public is represented as +, Protected as #, Private as -,Package as ~
OOP
19
Object and Class representations
• Association in class diagram
− Association indicates “owns a” relationship.
− Company offers trainings. Company and Training are classes.
− One company (1) can conduct many (1..*) trainings
Company
Training
1
1..*
• Aggregation and Composition
− Aggregation indicates “has a” relationship
• If container (Toyoto) is destroyed, the contents (Car) are not
destroyed
− Composition indicates “owns a” relationship
• if the container (Circle) is destroyed, the contents (Point) are
also destroyed
OOP
20
Object and Class representations
• Generalization
− Indicates “is a” relationship
− subclass implementing Base class
BaseClass
SubClass1
SubClass2
− Inheriting an implementation
Interface
SubClass1
SubClass2
OOP
21
Object and Class representations
• Dependency
− Indicates a weak relationship between two or more classes
− In this example, any change in Package 2 will affect Package 1.
Package1
Package2
• Object data representation
− Class instance record (CIR) is used along with virtual method table
(or virtual function table or dispatch table or vtable) to represent a
class in the memory
− CIR contains the necessary member variables and a pointer to the
vtable (called as vpointer or virtual table pointer) that contains the
member functions that ought to be dynamically bound
OOP
22
Object and Class representations (C++)
23
• class A
• { public: void fn1() { }
•
virtual void fn2() {}
•
int avar; };
• class B : public A
• { public: void fn2() {}
vtable of class A
Pointer to vtable of
class A
A::fn2
int avar
• int bvar; };
• int main()
int bvar
• { B *b1 = new B(); }
• vtable contains only the member variables and pointers to
other vtables. The non-virtual functions are not stored in
the vtable
OOP
Object and Class representations (Java)
24
• class A
• { public int avar;
•
public void fn1() { }
•
public void fn2() { }
• };
• class B extends A
• { public void fn2() {}
•
public int bvar; };
CIR of class B
vtable of class B
Pointer to vtable of
class B
A’s fn1
int avar
B’s fn2
int bvar
• public Sample
• { public static void main(String[] args)
•
{ B b1 = new B(); } }
• In Java, all methods are dynamically bounded and thus all methods
exist in the vtable
OOP
Design Issues in OOP
25
• Pure object-oriented language: Everything should be considered as an
object (including primitive data types like integer)
• Everything as object slows the operation on simple objects.
− Use imperative typing system and add objects to it
− Include imperative style typing system for primitive data types with
everything else as objects
• Subclasses as subtypes
− “is-a” relationship holds between a parent class object and an
object of the subclass
− Sometimes, subclass might add new methods or methods with
different signature
− If there exists a "is-a" relationship between the parent and the
subclass, then the subclass is called as subtype
Base Class
Shape
Is-A Link
OOP
Sub Class
Circle
Design Issues in OOP
• Allocation and de-allocation of objects
− Can be done on heap or run-time stack
− Object allocation on stack
• Limitation on the expandability of the element
• With p1 as variable for parent class and c1 as variable for
subclass, if space is allocated for p1 and we assign p1 = c1,
problem persists if c1 has more elements than p1
− Object allocation on heap
• How about de-allocation: Implicit or explicit?
• If only the interface of the parent class is visible to the subclass, it is
called as interface inheritance
• If the subclass inherits the exact behaviour of the parent by default, it
is called as implementation inheritance.
• Dynamic (Late Binding) and Static binding:
− Dynamic binding should be handled at run time
− Using dynamic binding always makes the process slower and thus
inefficient
OOP
26
Copying of Assignment Values
•
•
In assignment: Right hand side expression is evaluated and the result
is copied to the left hand side
Two ways to do assignment:
− Copy semantics (also called as value semantics) means the value
of the particular element is copied and not the pointer.
− Reference semantics (also called as pointer-copy semantics)
means that the pointer is copied and not the values
•
Java like Smalltalk uses reference semantics for arrays and objects.
But for primitive data types, Java uses copy semantics.
•
C and C++ languages support reference semantics for arrays. C++
supports both copy and reference semantics for objects
−
−
−
−
#include <stdio.h>
int main() { int array1[3] = {1,2,3}; int array2[3] = {2,3,4};
array1 = array2; // compilation error.
return 0; }
OOP
27
Copying of Assignment Values
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
#include <iostream>
Output:
using namespace std;
// reference semantics
class A { public: int i;
Address of RS1:0x10a2dc8
Address of RS2:0x10a2dc8
A() { i=0; } A(int j) { i=j; }
Value at RS1:10
};
Value at RS2:10
// Both RS1 and RS2 remains the same
int main() {
address.
A *rs1 = new A(10); A *rs2;
// copy semantics
// reference semantics
Address of CS1:0x22cc98
Address of CS2:0x22cc94
rs2=rs1;
Value in CS1:10
// print RS1, RS2 addresses and values
Value in CS2:10
delete rs2; A cs1(10); A cs2;
//copy semantics
cs2 = cs1;
// print RS1, RS2 addresses and values
return 0; }
OOP
28
Copy semantics in Java (using clone())
•
class Example { public static void main(String[] args)
•
{ int[] x = {1,2,3}; int[] y = x; x[0] = 40;
•
System.out.println("y[0] = " + y[0]); // Prints 40
•
System.out.println("x[1] = " + x[1]); // Prints 2
•
System.out.println("y[1] = " + y[1]); // Prints 2
•
int[] y1 = (int[])x. clone();
•
System.out.println("y1[0] = " + y1[0]); // Prints 40
•
System.out.println("x[0] = " + x[0]); // Prints 40
•
y1[1] = 10; // this change impacts only y1 and not x or y
•
System.out.println("y[1]= " + y[1]); // Prints 2
•
System.out.println("x[1]= " + x[1]); // Prints 2
•
System.out.println("y1[1] = " + y1[1]); // Prints 10
•
}}
OOP
29
C++ and its support for OOP
•
Main function returns an integer but we indicate the return type as
void to indicate no return value
•
Destructor procedure (represented by the same class name preceded
by a tilde) is called automatically just before the object disappears
•
C++ uses mixed type system because it includes the type system of C
and adds classes to it
•
C++ supports both object oriented and imperative type of coding and
thus uses static binding by default
•
To use dynamic binding, keyword virtual has to be used
•
Objects are created on stack as well as on heap
•
new operator:
−
−
Used to dynamically allocate an object
Used to take the input parameters and passes them into the
object constructor, and returns a pointer to the memory location
of the created object
OOP
30
C++ and its support for OOP
•
Creating objects on the stack:
−
•
classname classname(arguments);
Creating objects on the heap:
−
−
classname* objectname = new classname(arguments);
delete objectname; // delete the object
•
If an object of a subclass that has extra attributes is copied onto an
object of the super class, then only those attributes defined in super
class are copied. This process of not copying everything is called as
slicing.
•
Accessing Members of a class:
−
−
Statically allocated object: dot operator “.”
Dynamically allocated object: arrow operator “->”
OOP
31
C++ and its support for OOP
•
Inheritance
−
−
Access Controls: private or public or protected
• Private members are visible only to the class and the friends.
• Public members are visible in subclasses and clients.
• Protected members are visible in the class and in the
subclasses but not in the clients
Subclasssing uses access controls like private or public
• Private derivation means inherited public and protected
members are private in the subclasses.
• Public derivation means public and protected members are
also public and protected in subclasses
• Default is private for classes and public for struct
OOP
32
C++ and its support for OOP
•
Subtyping
−
−
•
Called as interface inheritance
If X inherits from Y, then C++ type checker will allow X objects to
be assigned to Y class pointers
Multiple Inheritance
−
−
Name conflicts are resolved using scope resolution operator
Name clash is possible if classes A and B have the same name and
Class C inherits from these two classes
− Implicit resolution: The language resolves the existing
name conflict with an arbitrary rule.
− Explicit resolution: The programmer must explicitly
specify how to resolve the name conflict in his code.
− Disallow name clashes: Name clashes are not allowed in
programs
OOP
33
C++ and its support for OOP
•
34
Dynamic Binding
−
−
−
Using keyword virtual, dynamic binding is implied. This is because
compiler cannot always determine which version of the function
is being called
To declare a function virtual, precede its prototype with the
keyword virtual. Any class with an abstract method is called as an
abstract class, but those which have only pure virtual methods
and no data are called as pure abstract class.
A pure virtual function is one without any definition. A class that
has at least one pure virtual function is an abstract class
• class abc {
• public:
− virtual double xyz () = 0; // pure virtual
− …
• };
OOP
C++ and its support for OOP
•
Friend classes and functions
−
−
−
•
•
•
•
•
•
•
•
•
•
Friend mechanism allows the programmer to bypass class
restrictions
class A1 { friend class A2; };
Class A1 declares class A2 as its friend. By doing this, member
functions of class A2 are permitted to directly read or modify the
private data entities of class A1
#include <iostream>
using namespace std;
class mainclass { int private_data; friend class friendclass;
public: // does not matter if it is private also
mainclass() { private_data = 10; } };
class friendclass { public: int addition(int a) {
mainclass mainclassobj; // access private variable of the mainclass
return mainclassobj.private_data + a;
} };
int main() { friendclass friendclassobj;
cout << "Result: "<< friendclassobj.addition(5)<< endl; }
OOP
35
C++ and its support for OOP
•
Encapsulation
−
−
−
−
−
−
−
−
−
−
−
−
−
−
Using C++ Namespaces
#include <iostream>
using namespace std;
namespace one { int a = 10;}
namespace two { double a = 10.1234;}
int main () { using namespace one;
cout << a << endl; // access a in one
cout << two::a << endl; // access a in two
using one::a; cout << a << endl; // access a in one
// scope for using a namespace with brackets
{ using namespace one; cout << a << endl; }
{ using namespace two; cout << a << endl; }
return 0;
}
OOP
36
C++ and its support for OOP
•
Templates
−
−
−
−
−
−
−
−
−
−
−
−
−
Used to provide overloaded functions
#include <iostream> // iostream.h is depreciated
using namespace std; // needed for cout to work
template <typename T>
T min1(T x, T y) // min is an inbuilt name and thus use min1
{ return x < y ? x : y; }
int main()
{
// Here the min1 function is being called with different data
types
int i = 1 ,j = 2; cout << min1(i,j) << endl;
float a = 2.0, b = 3.0; cout << min1(a,b) << endl;
string s = "abc", t = "def"; cout << min1(s,t) << endl;
return 0; }
OOP
37
C++ and its support for OOP
•
Exceptions
−
−
Does not have predefined exception types
Standard library modules provide exceptions and exception
mechanisms.
−
−
−
−
−
−
−
−
−
−
−
−
−
#include <iostream>
#include <vector>
#include <exception>
#include <stdexcept> // out_of_range exception
using namespace std;
int main( ) { char array[] = {'a', 'b', 'c', 'd'};
// no error is caught and just a random value is printed.
try { cout << array[10000];
} catch(std::out_of_range& e) {cerr << e.what( ) << '\n';}
vector<char> v; v.push_back('a'); v.push_back('b'); v.push_back('c');
// Runtime error: vector :: _M_range_check occurs
try { cout << v.at(10000) << '\n';
} catch(std::out_of_range& e) { cerr << e.what( ) << '\n';} }
OOP
38
Java and its support for OOP
39
•
All data are objects except the primitive types
•
All primitive types have wrapper classes that store one data value
(wrapper Integer for the primitive type int). Wrapper classes are used
to wrap primitive values and make them as objects
•
As all methods in wrapper class are static, we could use them without
creating an instance
•
import java.util.*;
•
public class Wrapper{ public static void main(String argv[]){
•
Vector v = new Vector();
•
// add needs the parameter to be an object
•
// wrapper class converts the integer into an object
•
v.add(new Integer(100)); v.add(new Integer(200));
•
for(int i = 0; i < v.size(); i++){
•
System.out.println(ival);
Integer ival =(Integer) v.get(i);
} }
OOP
Java and its support for OOP
•
All objects are allocated as heap-dynamic and referenced through
reference variables
•
Garbage collector runs as a thread (low priority process)
•
Explicit calling of garbage collector in Java could be done using
System.gc()
•
Invoking or automatic running of garbage collector calls a special
method called finalize in Java, which acts like a destructor
•
Keyword super: Used to invoke the overridden method
•
class A { void fn(){ System.out.println("a.fn"); } }
•
class B extends A { void fn(){ System.out.println("b.fn"); super.fn();} }
•
public class Binding {
•
public static void main(String[] args) { B a = new B();
•
•
a.fn(); // prints b.fn and a.fn }
}
OOP
40
Java and its support for OOP
•
Access Modifiers
−
•
Substring Method
−
−
•
Static [shared by all instances of the class], Public, Protected
and Private
Its of the form string_name.substring(begin,end)
Returns all the characters from the location "begin" till the
location just before the "end" argument, i.e., it does not include
the "end" argument
Static Field
−
−
−
−
−
−
−
A field declared as static is one per whole class
static { … } // This is called as static initialization block
public class StaticTest
{ static int foo = 123; static { foo = 99; System.out.println(foo);}
public static void main(String argv[]){
System.out.println(foo); } }
This program prints 99 twice.
OOP
41
Java and its support for OOP
•
Inheritance
−
−
−
−
−
−
−
−
−
−
−
Uses extends keyword
Only single inheritance is allowed
Multiple inheritance can be done only with interfaces (abstract
methods)
All of the methods in an interface must be abstract; only constant
(final variables) may be concretely declared in an interface
Interface will not have a constructor
When an interface is extended, then all methods present in the
interface should be implemented
class A { final void fn(){ System.out.println("a.fn"); } }
class B extends A { // Compilation error – B cannot override fn() in A
void fn(){ System.out.println("b.fn"); } }
final class C { } // Compilation error – cannot inherit from final C
class D extends C { }
OOP
42
Java and its support for OOP
•
The final modifier
−
•
The abstract modifier
−
−
−
•
Class indicated as final cannot be extended and thus cannot be a
parent class
An abstract class is declared with the keyword abstract and may
or may not contain abstract methods
If a class contains an abstract method, then the class must be
declared as abstract class
The difference between interfaces and abstract classes is that
abstract class can contain fields that are not static and final and
also can contain implementation methods
Dynamic Binding
−
−
All messages are dynamically bound to methods, unless the
method is final (means it cannot be overridden; therefore,
dynamic binding serves no purpose)
If a method is specified as private or static, then it will disallow
overriding and thus will be statically bound
OOP
43
Java and its support for OOP
OOP
44
Java and its support for OOP
•
Overloading
−
−
−
•
Can have different signatures for a single method
Handled at compile time by matching the arguments
if the method that is invoked is an instance method, then
checking can be done only at runtime, using dynamic method
lookup
Encapsulation
−
−
−
−
−
Provided using classes and packages
Package can contain more than one class definition
Package scope makes the entities visible throughout the package
it is defined. But, not visible to subclass in other packages
Every class in a package is a friend to the package scope entities
elsewhere in the package. So, it is like friends in C++
package packagename;
import packagename.classname;
−
import directoryname.subdirectoryname.packagename.classname;
−
OOP
45
Java and its support for OOP
•
•
•
•
46
In java.lang.String.substring(), java.lang stands for the packagename
and String stands for the classname and substring() stands for the
methodname
Major difference between Java and C++ is that in Java all method
dispatching is done at run time, usually referred to as virtual
methods.
− Vector v; … System.out.print(v.toString());
Run-time type of v is unknown; it could be a Vector, a Stack, or some
other subclass of Vector. So the actual toString method invoked
depends on run-time type of v
Exceptions: try .. catch .. finally
−
−
−
−
−
−
class Exceptions { public static void main(String[] args)
{ System.out.println("Array Bound Test");
// Assign array of 10 elements.
int [] array = new int[10] ; try { array[20] = 1; }
catch (ArrayIndexOutOfBoundsException e)
{ System.out.println("Out of Array Bounds error."); } } }
OOP
C# and its support for OOP
•
•
•
•
•
•
•
•
C# is based on C++ and Java
Access modifiers: internal, protected internal
− Types or methods indicated as internal are accessible to any files
within the same assembly.
− The modifier protected internal, includes the features of both
protected and internal.
Class instances are heap dynamic
Default constructor is implicitly added, if there is no explicit
constructor
Structs are lightweight classes which has no inheritance support
To access data members, accessor methods (getter and setter) are
used
Files can be grouped using C# Assembly
Inheritance in C# is similar to that of Java, except that the syntax is
similar to that of C++
− public class Weather : forecast { … }
OOP
47
C# and its support for OOP
•
public class AcademicYear {
•
public int Days { // Days is a property
•
get { return days; }
•
set { days = value; }
•
}
•
private int days;
•
}
•
AcademicYear ay = new AcademicYear();
•
int holidays, holidaysnow; ay.Days = holidays; holidaysnow = ay.Days;
•
Dynamic binding requires virtual and override keywords
−
−
public class forecast { public virtual readvalue () { … } }
public class Weather : forecast { public override readvalue () { … }
}
OOP
48
C# and its support for OOP
•
•
Access Modifiers
− By default, class methods and fields are considered private
− Namespaces in C# are always public
− Classes and interfaces defined are either public or internal
− Classes are by default considered to be internal
− There is no access modifier for enumerations, they are by default
public.
Exceptions
− Similar to Java and C++
− Using of catch is optional and thus finally can be used alone
− User-defined exceptions can also be specified
− An exception can be thrown so as to be caught from another class
OOP
49
C# and its support for OOP
•
public static void Main()
•
{ int x = 0; int division = 0;
•
try
•
{ division = 100/x; }
•
// can be used to catch all exceptions
•
catch { Console.WriteLine("Exception"); }
•
finally
•
{
•
Console.WriteLine("Finally Block");
•
}
•
}
// Prints the finally block
OOP
50
C# and C++
•
C++ and C# supports polymorphism and inheritance
•
C# uses namespaces instead of C++ headers
•
Java: All methods are considered to be virtual by default
•
C#: Methods need to be specified as abstract, which is equivalent to
pure virtual in C++
•
C# has destructor but is converted to Finalize() method which chains
up to the base class
•
Destructor cannot be explicitly called in C#
−
−
−
−
−
protected override void Finalize()
{
try { .. }
finally { base.Finalize(); }
}
OOP
51
C# and C++
•
•
•
•
•
•
•
If some unmanaged resources need to be freed, then the IDisposable
interface needs to be implemented and the method named Dispose()
should be used to free the resources
Boxing and unboxing is the process of treating value types like
integers as reference types (objects)
Boxing is implicit in C# but unboxing must be done explicitly.
− int i = 12345
− object o = i; //Boxing
− int j = (int) o; // unboxing (must be handled explicitly)
− Console.WriteLine("j: {0}", j);
Boolean variable in C# do not equate to integer variables
Structs do support methods, fields, operators but without inheritance
or destructors
Classes in C++ ends with a semi-colon but not so in C#
C# does not support multiple inheritance but supports multiple
interfaces like in Java
OOP
52
Ruby and its support for OOP
•
Every data type is considered as an object
•
Access modifiers: public, protected, private
− Public methods can be accessed from everywhere
− Private methods can be accessed only when they are called
without an explicit receiver
− Protected methods can be accessed by the same class or its
descendant class instances
•
Variable Types
− Instance variables are preceded with @ sign
− Instance variables are accessed using getter and setter methods
or metaprogramming
• class Student
•
attr_reader :name, :id
•
def initialize(name, id)
•
@name, @id = name, id
•
end
• end
OOP
53
Ruby and its support for OOP
•
Only one constructor (with or without parameters) is allowed per
class
•
Local Variables can start with small alphabets or underscore
−
Unlike global or instance variables, local variables are not given a
nil value before initialization
•
Global variables are preceded with $ sign
•
Class variables are preceded with @@ sign
•
Constants start with upper case characters and are accessible outside
the class
•
self refers to the currently executing object
•
nil refers to the meaningless value that is assigned to uninitialized
variables
OOP
54
Ruby and its support for OOP
•
Method Access
−
−
Uses :: or include
Methods defined inside a class are private by default
OOP
55
Ruby and its support for OOP
•
Singleton Methods
−
−
Methods can behave differently for different instances of a single
class
Called as pre-object methods
OOP
56
Ruby and its support for OOP
•
Inheritance
−
−
Does not support multiple inheritance
Modules can be imported using mixins. Mixin is a class that could
be inherited by other classes but cannot work alone
OOP
57
Ruby and its support for OOP
•
Exception Handling
−
−
−
•
Handled using raise, rescue and ensure
ensure is used to handle the necessary cleanups that ought to be
done once the task is done
Exceptions are said to be raised when they occur within the
execution of a program
Metaprogramming: Programs can be written and modified at runtime
without being recompiled. Programmers can modify or add methods
to standard libraries during runtime
OOP
58
Python and its support for OOP
•
No specific variable type in Python
•
Variables need not be declared
•
Global variables are allowed but discouraged
•
Inheritance
− Brackets are used to indicate inheritance
− Support Multiple Inheritance
•
Access Modifiers
− A method or an attribute can be made private by preceding it
with two underscores
OOP
59
Python and its support for OOP
OOP
60
Python and its support for OOP
OOP
61
Java and C++
•
C++ has destructor but there is no destructor in Java
− Java has finalize() method which is called by garbage collector.
− finalize() cannot be explicitly invoked but can be invoked via
calling garbage collector using System.gc().
•
Java has no preprocessor commands as in C++. Java is platform
independent and so its not needed
− Preprocessor example to check whether a variable is defined or
not, in C++
− #define Demo
− int main()
− { #ifdef Demo std::cout << "Demo Version";
−
else std::cout << "Non-Demo Version";
− #endif }
•
Java does not have #include but uses import.
•
Global variables are not present in Java. Constant is created using
final reserve word
OOP
62
Java and C++
•
•
Operators like &, *, or sizeof are not present in Java because the
pointer type is not included in Java
Multiple inheritance is not supported in Java
− Multiple inheritance is possible to an extent in Java using
interfaces
Java does not support user-defined operator overloading
•
•
•
•
•
•
•
•
•
•
#include <iostream>
using namespace std;
class Test { int x; public: Test() { x = 0; } Test(int i) { x = i;}
Test operator+(Test op2); void show(); };
// Overload addition.
Test Test::operator+(Test op2)
{ Test temp; temp.x = x + op2.x; return temp; }
void Test::show() { cout << x; }
int main() { Test a(1), b(2), c; c = a + b;
cout << "a + b = "; c.show(); cout << "\n"; return 0; }
•
OOP
63
Java and C++
•
•
Java: Object manipulation is done by reference
C++: Object manipulation is done by value (by default) but object
manipulation using reference can also be done
OOP
64
Java and C++
•
Java: Byte data type, which could contain values from -128 to 127, is
supported.
− byte b = 100; // works ok
− byte b = 200; // Compile error – loss of precision
OOP
65
Java and C++
•
•
•
•
•
•
•
Java: Object creation is done only using new operator
C++: Object creation can be done with or without new operator
Java: final modifier is used to prevent it from being modified
Java: abstract class cannot have objects, as new cannot be applied
Package scope in java is an alternate to friend in C++
Method overloading is allowed in Java
Java: Methods are dynamically bounded to definition by default
•
#include <iostream>
•
•
•
•
•
using std::cout;
class Test { public: int x;
// Constructor
Test(int xValue) { cout << "Test constructor called\n"; x = xValue; }
};
•
•
int main() { Test Testing(10);
cout << "Value Entered: " << Testing.x << "\n "; return 0; }
OOP
66
Event Handling in Java
•
•
•
•
Handling user input: Pressing a key or clicking the mouse or …
The actions generated by the events are communicated to the
programs using Abstract Windowing Toolkit (AWT)
Event handling is done using:
− Event Object: Event is represented using Objects in Java
− Event Source: object that generates the event. ActionEvent
object contains the information
− Event Handler: Method that processes the event. Event Object is
passed as parameter to this method
Event Classes
− EventObject class, which is the top of the event class hierarchy,
is present in the java.util package
− getSource() method present in the EventObject class returns that
object that caused the event
− The nature of the event like whether a mouse was pressed or
released or moved can be identified using getId() method
− AWT also handles semantic and low-level events
OOP
67
Event Handling in Java
•
•
Semantic Events:
− Higher-level events useful to manage activities of user interface
components
− ActionEvent object is generated whenever a component is
activated.
− AdjustmentEvent object is generated when adjustment elements
like scrollbar is used.
− TextEvent object is generated when the text is modified.
− ItemEvent object is generated when an item from a given list or
checkbox or choice is selected
Low-level events:
− Input or GUI activities that occur on the screen
− ContainerEvent object is generated whenever a component is
added or removed from the container.
− ComponentEvent object is generated when the component is
resized or moved or etc.
− FocusEvent object is generated when the component is made
focus for input.
− KeyEvent object is generated when any key in the keyboard is
pressed or released.
OOP
68
Event Handling in Java
•
•
69
Low-level events:
− WindowEvent object is generated during a window activity like
maximizing or minimizing or closing of a window.
− MouseEvent object is generated when the mouse is used.
− PaintEvent object is generated when the component is painted.
Event Listeners
− The occurrence of an event will cause an object to be generated
− This object is handled using the event listener
− Listeners can be removed from a component using
removeActionListener() method
− Semantic event listeners include ActionListener,
AdjustmentListener, ItemListener, TextListener, etc.
− Low-level event listeners include ComponentListener,
ContainerListener, FocusListener, KeyListener, MouseListener,
MouseMotionListener, WindowsListener, etc
OOP
Event Handling in Java
OOP
70
Event Handling in Java
•
•
•
Program starts with main method
EventTest object created at main method invokes the constructor of
EventTest class
In order to handle events, a listener object is created and then
registered with the button
OOP
71
Event Handling in Java
•
•
•
•
•
Upon user interaction with the button click, the ActionEvent object
is created and the actionPerformed method in the ActionListener
interface is executed. This changes the button's text
Generally, Java applications start from main method
Applets don't have a main method and are used to run over a browser
or using appletviewer
Applets start their execution from an init method
Generally, Applets are used for client side programming over the
Internet
OOP
72
Event Handling in Java
•
Applet example
OOP
73
Programming in Object Oriented Languages
•
•
•
C#: Sharp Develop software
C++: g++ compiler
Java: Java SDK
OOP
74