Arquivo de março, 2014

Pure Function

Usa os objetos como argumentos, mas não os modifica. o valor de retorno é ou um primitivo ou um novo objeto criado dentro do método.

Um método é considerado uma função pura se o resultado depender apenas dos argumentos, e não ter efeitos colaterais, como modificar um argumento ou imprimir algo. O único resultado de chamar uma função pura é o seu valor de retorno.

Na transformação funcional pura, um conjunto de funções, chamadas funções puras, definem a forma de como transformar um conjunto de dados estruturados a partir de sua forma original para outra forma. A palavra “pura” indica que as funções são combináveis​​, que exige que elas sejam:

Auto-suficiente, de modo que elas podem ser livremente ordenada e rearranjada sem emaranhamento ou interdependências com o resto do programa. Transformações puras não têm conhecimento ou efeito sobre o meio ambiente. Ou seja, as funções utilizadas para a transformação não tem efeitos colaterais.

Sem mudança de estado, de modo que a execução da mesma função ou conjunto específico de funções na mesma entrada sempre resultará na mesma saída. Transformações puras não têm memória do seu uso anterior. Funções puras ajudar a gerenciar a complexidade dos grandes projetos.

Modifiers

Usa objetos como argumentos e modifica alguns elementos ou todos eles. Muitas vezes, retorna uma void. Um método modificador muda a forma como os objetos funcionam.

Fill-in

Um dos argumentos é um objeto vazio que é preenchido pelo método. Tecnicamente, este método também é um tipo de Modifier.

Melhores Praticas

É recomendado que você escreva funções puras sempre que for razoável, e recorra aos Modifiers e Fill-ins apenas se houver uma grande vantagem.

Métodos Modifiers e Fill-in  são eficientes porque eles não têm que criar novos objetos. Mas se torna mais difícil de isolar partes de um programa, e em grandes projetos podem causar erros que são difíceis de encontrar.

Em síntese estes conceitos passam a substituir a nomenclatura das funções e procedimentos das linguagens de programação procedural, por serem métodos integrantes de objetos e não mais procedimentos ou funções auto suficientes, porem ainda são estruturalmente iguais.

Exemplo:

Neste exemplo escrevemos três métodos diferentes: Pure function, Modifier e um fill-in, e manipulamos objetos utilizando estes métodos.

Java

Classe #1 – Principal

public class Metodos
 {

  // Método - Pure Function
  static boolean maxRet(Retangulo ret, int altura, int largura)
  {
     if ((ret.altura <= altura) && (ret.largura <= largura))
     {
         return true;
     }
   else
     {
        return false;
     }
  }

  // Método - Modifiers
  static void posicao(Retangulo ret, int x, int y)
  {
     ret.x = ret.x + x;
     ret.y = ret.y + y;
  }

  // Método - Fill-in
  static void modRet(Retangulo r1, Retangulo r2, Retangulo r3)
  {
     r1.x       =  r2.x      + r3.x;
     r1.y       =  r2.y      + r3.y;
     r1.altura  = r2.altura  + r3.altura;
     r1.largura = r2.largura + r3.largura;
  }

 public static void main(String[] args)
 {

   Retangulo ret1 = new Retangulo(50,50,200,300);
   Retangulo ret2 = new Retangulo(15,15,120,150);
   Retangulo ret3 = new Retangulo();
   ret1.imprimeRet();

   System.out.println("Retangulo está dentro do limite maximo:" + maxRet(ret1, 500, 600));
   System.out.println();
   System.out.println("Modifica posição do retangulo:");
   posicao(ret1, 20, 20);
   ret1.imprimeRet();

   System.out.println();
   System.out.println("Modifica tamanho do retangulo:");
   modRet(ret3, ret1, ret2);
   ret3.imprimeRet();
  }
}

Classe #2 – Retangulo

public class Retangulo
{
public int x;
public int y;
public int altura;
public int largura;

public Retangulo ()
{

}

public Retangulo (int x, int y, int altura, int largura)
{
  this.x       = x;
  this.y       = y;
  this.altura  = altura;
  this.largura = largura;
}

 public void imprimeRet()
 {
  System.out.println("X =" +  x +  " Y= " + y + " Altura="+ altura + " Largura=" + largura );
 }

}

C++

Classe #1 – Principal

include "stdafx.h"
#include <iostream>
#include <string>
#include "Retangulo.h"

static bool maxRet(Retangulo& ret, int altura, int largura)
{
  if ((ret.altura <= altura) && (ret.largura <= largura))
  {
     return true;
  }
  else
  {
     return false;
  }
}

 // Método - Modifiers
 static void posicao(Retangulo& ret, int x, int y)
 {
    ret.x = ret.x + x;  ret.y = ret.y + y;
 }

 // Método - Fill-in

 static void modRet(Retangulo& r1, Retangulo& r2, Retangulo& r3)
 {
    r1.x = r2.x + r3.x;
    r1.y = r2.y + r3.y;
    r1.altura = r2.altura + r3.altura;
    r1.largura = r2.largura + r3.largura;
 }

 int _tmain(int argc, _TCHAR* argv[])
 {
    Retangulo ret1 (50, 50, 200, 300);
    Retangulo ret2 (15, 15, 120, 150);
    Retangulo ret3 (0,0,0,0);
    ret1.imprimeRet();

    cout << "Retangulo está dentro do limite maximo:" << maxRet(ret1, 500, 600) << endl;

    cout << endl;
    cout << "Modifica posição do retangulo:" << endl;  posicao(ret1, 20, 20);
    ret1.imprimeRet();

    cout << endl;
    cout << "Modifica tamanho do retangulo:" << endl;  modRet(ret3, ret1, ret2);
    ret3.imprimeRet();

   system("pause");
   return 0;
 }

Classe #2 – Retangulo

#include "stdafx.h"
#include <iostream>

using namespace std;

class Retangulo
{
 public:

  int x;
  int y;
  int altura;
  int largura;

  Retangulo()
  {  }

  Retangulo(int x, int y, int altura, int largura)
  {
     this->x = x;
     this->y = y;
     this->altura = altura;
     this->largura = largura;
  }

  void imprimeRet()
  {
     cout << "X =" << x << " Y= " << y << " Altura=" << altura << " Largura=" << largura << endl;
  }

};

C#

Classe #1 – Principal

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
 {
     class Program
     {
         // Método - Pure Function

         static Boolean maxRet(Retangulo ret, int altura, int largura)
         {
             if ((ret.altura <= altura) && (ret.largura <= largura))
             {
                 return true;
             }
             else
             {
                 return false;
             }
         }

         // Método - Modifiers
         static void posicao(Retangulo ret, int x, int y)
         {
             ret.x = ret.x + x;
             ret.y = ret.y + y;
         }

         // Método - Fill-in

         static void modRet(Retangulo r1, Retangulo r2, Retangulo r3)
         {
             r1.x = r2.x + r3.x;
             r1.y = r2.y + r3.y;
             r1.altura = r2.altura + r3.altura;
             r1.largura = r2.largura + r3.largura;
         }

         static void Main(string[] args)
         {
             Retangulo ret1 = new Retangulo(50,50,200,300);
             Retangulo ret2 = new Retangulo(15,15,120,150);
             Retangulo ret3 = new Retangulo();

             ret1.imprimeRet();
             Console.WriteLine("Retangulo está dentro do limite maximo:" + maxRet(ret1, 500, 600));
             Console.WriteLine();

            Console.WriteLine("Modifica posição do retangulo:");
            posicao(ret1, 20, 20);
            ret1.imprimeRet();

           Console.WriteLine();
           Console.WriteLine("Modifica tamanho do retangulo:");
           modRet(ret3, ret1, ret2);
           ret3.imprimeRet();

           Console.ReadKey();
       }
     }
 }

Classe #2 – Retangulo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
 {
     class Retangulo
     {
             public int x;
             public int y;
             public int altura;
             public int largura;

             public Retangulo()
             {
             }

             public Retangulo(int x, int y, int altura, int largura)
             {
                 this.x = x;
                 this.y = y;
                 this.altura = altura;
                 this.largura = largura;
             }

             public void imprimeRet()
             {
                 Console.WriteLine("X =" +  x +  " Y= " + y + " Altura="+ altura + " Largura=" + largura );
             }
     }
 }

Programação orientada a objetos apela em vários níveis. Para os gestores, que promete um desenvolvimento e manutenção mais rápido e mais barato. Para analistas e designers, o processo de modelagem torna-se mais simples e produz um design claro e gerenciável.

Para os programadores, a elegância e clareza do modelo de objeto e do poder de ferramentas e bibliotecas orientadas a objetos faz programação de uma tarefa muito mais agradável, e programadores experimentam um aumento na produtividade. Todo mundo ganha, ao que parece.

Se há um lado negativo, é à custa da curva de aprendizado. Pensar em objetos é uma dramática partida de pensar processualmente, e o processo de criação de objetos é muito mais desafiador do projeto processual, especialmente se você está tentando criar objetos reutilizáveis​​.

A abordagem orientada a objetos dá um passo mais longe, fornecendo ferramentas para o programador representar elementos no espaço do problema. Esta representação é geral o suficiente para que o programador não é fique restrito a qualquer tipo particular de problema.

Passando e Retornando Objetos

Em programação orientada a objetos é possível criar métodos passando um objeto e retornando um objeto.

Objetos são mutáveis

Você pode alterar o conteúdo de um objeto, fazendo uma atribuição a uma de suas variáveis de instância.

Você pode escrever métodos que retornam objetos. Observe que você pode usar a palavra chave x = class() para criar um novo objeto, e logo em seguida usar o RETURN (resultado) como valor de retorno.

Modificando objetos, passando-os como argumentos para métodos podem ser úteis, mas também pode tornar a depuração mais difícil, porque nem sempre são claras as invocações que o método faz ou não para modificar seus argumentos. Mais tarde, vamos discutir alguns prós e contras deste estilo de programação.

Inheritance (herança)

Programação orientada a objetos permite que classes possam herdar estados e comportamentos comuns usados de outras classes. Neste exemplo, bicicleta torna-se agora a superclasse de MountainBike. Na linguagem de programação, cada classe é permitido ter uma superclasse direta, e cada superclasse tem o potencial para um número ilimitado de subclasses.

Alias de Objetos

Quando dois objetos referem-se ao mesmo objeto. Em outras palavras, este objeto tem dois nomes, Objeto1 e Objeto2. Quando uma pessoa usa dois nomes, é chamado de aliasing. A mesma coisa com os objetos. Quando duas variáveis são alias, todas as mudanças que afetam uma variável também afetara a outra.

None

Quando você cria uma variável de objeto, lembre-se que você está criando uma referência a um objeto. Até você fazer variável apontar para um objeto, o valor da variável é nulo. None é um valor especial e uma palavra-chave que significa: nenhum objeto.

Garbage collection

Se ninguém se refere a um objeto, então ninguém pode ler ou gravar qualquer dos seus valores, ou chamar um método nele. Em efeito, ele deixa de existir. Poderíamos manter o objeto na memória, mas seria apenas um espaço de resíduos, assim como o seu programa é executado periodicamente, o sistema procura por objetos encalhados e tenta recupera-los, em um processo chamado de coleta de lixo. Posteriormente, o espaço de memória ocupado por o objeto estará disponível para ser utilizado como parte de um novo objeto. Você não tem que fazer nada para fazer a coleta de lixo acontecer, e em geral você não vai estar ciente disso. Mas você deve saber que é periodicamente executado em segundo plano.

Objetos e Primitivos

Existem dois tipos diferentes, tipos primitivos e tipos de objetos. primitivos, como int e boolean começam com letras minúsculas; tipos de objetos começam com letras maiúsculas. Esta distinção é útil porque nos lembra algumas das diferenças entre eles:

Quando você declara uma variável primitiva, você tem espaço de armazenamento para um valor primitivo. Quando você declara uma variável de objeto, você tem um espaço para uma referência a um objeto.

Se você não inicializar um tipo primitivo, é dado um valor padrão a ele que depende de cada tipo primitivo.

Variáveis primitivas são bem isoladas, no sentido de que não há nada você possa fazer em um método que vai afetar uma variável em outro método.

Há uma outra diferença entre primitivos e tipos de objetos. Você não pode adicionar novos primitivos, mas você pode criar novos tipos de objetos.

Exemplo:

Neste exemplo criamos dois objetos de classes distintas e usamos algumas técnicas de manipulação de objetos, como: métodos de referencias ao objeto, retorno de objetos, aliasing de objetos.

#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Desenvolvimento Aberto
# objetos.py
class Pontos:
     x = 0
     y = 0
     def __init__(self,x = None, y = None):
         if (x is not None) and (y is not None):
             self.x = x
             self.y = y

class Retangulo (Pontos):
     altura = 0
     largura = 0
     # Workaround para efeito de Overload
     # Constructor ()
     def __init__ (self, x= None, y= None, altura= None, largura= None):
         if (x is not None) and (y is not None) and (altura is not None) and (largura is not None):
             self.x = x
             self.y = y
             self.altura = altura
             self.largura = largura

     def Objeto(self):
         print "X=", self.x, "Y =", self.y, "Altura=", self.altura, "Largura=", self.largura

def achaCentro(ret = Retangulo()):
     rx = ret.x + ret.largura / 2
     ry = ret.y + ret.altura  / 2
     return Pontos(rx,ry)

# Instancia Objetos
pontos = Pontos(10,15)
ret1 = Retangulo(pontos.x, pontos.y, 150, 200)
print "Objeto1:"
ret1.Objeto()

# Objetos são Mutaveis.
ret1.altura = 300
ret1.largura = 400
print "Objeto1:"
ret1.Objeto()

# Aliasing
# Utiliza Workaround com efeito Overload
ret2 = Retangulo()
ret2 = ret1
print ""
print "Aliasing:"
print "Objeto2:"
ret2.Objeto()

ret1.altura = 100
ret1.largura = 200

print ""
print "Alterndo Objeto1 e afetando Objeto2"
print "Objeto2:"
ret2.Objeto()

coordenadas = Pontos()
coordenadas = achaCentro(ret1)
print ""
print "Centro do Retangulo"
print "Coordenadas X:", coordenadas.x
print "Coordenadas Y:", coordenadas.y

raw_input()

Programação orientada a objetos apela em vários níveis. Para os gestores, que promete um desenvolvimento e manutenção mais rápido e mais barato. Para analistas e designers, o processo de modelagem torna-se mais simples e produz um design claro e gerenciável.

Para os programadores, a elegância e clareza do modelo de objeto e do poder de ferramentas e bibliotecas orientadas a objetos faz programação de uma tarefa muito mais agradável, e programadores experimentam um aumento na produtividade. Todo mundo ganha, ao que parece.

Se há um lado negativo, é à custa da curva de aprendizado. Pensar em objetos é uma dramática partida de pensar processualmente, e o processo de criação de objetos é muito mais desafiador do projeto processual, especialmente se você está tentando criar objetos reutilizáveis​​.

A abordagem orientada a objetos dá um passo mais longe, fornecendo ferramentas para o programador representar elementos no espaço do problema. Esta representação é geral o suficiente para que o programador não é fique restrito a qualquer tipo particular de problema.

Objetos são mutáveis

Você pode alterar o conteúdo de um objeto, fazendo uma atribuição a uma de suas variáveis de instância.

Você pode escrever métodos que retornam objetos. Observe que você pode usar a palavra chave CREATE OBJECT para criar um novo objeto, e logo em seguida usar o RETURNING (resultado) como valor de retorno.

Modificando objetos, passando-os como argumentos para métodos podem ser úteis, mas também pode tornar a depuração mais difícil, porque nem sempre são claras as invocações que o método faz ou não para modificar seus argumentos. Mais tarde, vamos discutir alguns prós e contras deste estilo de programação.

Passando e Retornando Objetos

Em programação orientada a objetos é possível criar métodos passando um objeto e retornando um objeto.

Alias de Objetos

Quando dois objetos referem-se ao mesmo objeto. Em outras palavras, este objeto tem dois nomes, Objeto1 e Objeto2. Quando uma pessoa usa dois nomes, é chamado de aliasing. A mesma coisa com os objetos. Quando duas variáveis são alias, todas as mudanças que afetam uma variável também afetara a outra.

Null

Quando você cria uma variável de objeto, lembre-se que você está criando uma referência a um objeto. Até você fazer variável apontar para um objeto, o valor da variável é nulo. null é um valor especial e uma palavra-chave que significa: nenhum objeto.

Garbage collection

Se ninguém se refere a um objeto, então ninguém pode ler ou gravar qualquer dos seus valores, ou chamar um método nele. Em efeito, ele deixa de existir. Poderíamos manter o objeto na memória, mas seria apenas um espaço de resíduos, assim como o seu programa é executado periodicamente, o sistema procura por objetos encalhados e tenta recupera-los, em um processo chamado de coleta de lixo. Posteriormente, o espaço de memória ocupado por o objeto estará disponível para ser utilizado como parte de um novo objeto. Você não tem que fazer nada para fazer a coleta de lixo acontecer, e em geral você não vai estar ciente disso. Mas você deve saber que é periodicamente executado em segundo plano.

Objetos e Primitivos

Existem dois tipos diferentes, tipos primitivos e tipos de objetos. primitivos, como int e boolean começam com letras minúsculas; tipos de objetos começam com letras maiúsculas. Esta distinção é útil porque nos lembra algumas das diferenças entre eles:

Quando você declara uma variável primitiva, você tem espaço de armazenamento para um valor primitivo. Quando você declara uma variável de objeto, você tem um espaço para uma referência a um objeto.

Se você não inicializar um tipo primitivo, é dado um valor padrão a ele que depende de cada tipo primitivo.

Variáveis primitivas são bem isoladas, no sentido de que não há nada você possa fazer em um método que vai afetar uma variável em outro método.

Há uma outra diferença entre primitivos e tipos de objetos. Você não pode adicionar novos primitivos, mas você pode criar novos tipos de objetos.

Exemplo:

Neste exemplo criamos dois objetos de classes distintas e usamos algumas técnicas de manipulação de objetos, como: métodos de referencias ao objeto, retorno de objetos, aliasing de objetos.

Dica:

Você pode rodar o código fonte abaixo, ou separar as classes no Class Builder, deixando o código fonte menor e muito mais limpo.

Abap

*&---------------------------------------------------------------------*
*& Report  ZOBJETO
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Objetos
*&---------------------------------------------------------------------*

REPORT  ZOBJETO.

* Cria classe Pontos

class PONTOS DEFINITION.

PUBLIC SECTION.

data : x TYPE i,
       y TYPE i.

METHODS :

        " Workaround para criar Overload
        " Constructor ()

        CONSTRUCTOR IMPORTING x TYPE i OPTIONAL
                              y TYPE i OPTIONAL.

ENDCLASS.

class PONTOS IMPLEMENTATION.

    METHOD CONSTRUCTOR.
       me->x = x.
       me->y = y.
    ENDMETHOD.

ENDCLASS.

* Cria Classe Retangulo.

class Retangulo DEFINITION INHERITING FROM PONTOS.

PUBLIC SECTION.

data: altura  TYPE i,
      largura TYPE i.

METHODS: " Workaround para criar Overload
         " Constructor ()

         CONSTRUCTOR IMPORTING x       TYPE i OPTIONAL
                               y       TYPE i OPTIONAL
                               altura  TYPE i OPTIONAL
                               largura TYPE i OPTIONAL,

         OBJETO.

ENDCLASS.

class Retangulo IMPLEMENTATION.

     METHOD CONSTRUCTOR.

        CALL METHOD SUPER->CONSTRUCTOR.
       me->X = x.
       me->Y = y.
       me->ALTURA = altura.
       me->LARGURA = largura.
     ENDMETHOD.

     METHOD OBJETO.

       WRITE: / 'X=', me->X, ' Y=', me->Y,  ' Altura=', me->ALTURA, ' Largura=', me->LARGURA.
     ENDMETHOD.

endclass.

* Cria classe coordenadas

class coordenadas DEFINITION INHERITING FROM PONTOS.

PUBLIC SECTION.

METHODS achaCentro IMPORTING ret TYPE REF TO RETANGULO
                   RETURNING VALUE(pt) TYPE REF TO PONTOS.

ENDCLASS.

class COORDENADAS IMPLEMENTATION.

      METHOD ACHACENTRO.
        me->X = RET->X + RET->LARGURA / 2.
        me->Y = RET->Y + RET->ALTURA  / 2.
        CREATE OBJECT PT
           EXPORTING
              X = me->X
              Y = me->Y.
        ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

* Instancia objeto

DATA pnt TYPE REF TO PONTOS.
CREATE OBJECT pnt
   EXPORTING
      X = 10
      Y = 15.

DATA ret1 TYPE REF TO RETANGULO.
CREATE OBJECT ret1
      EXPORTING
          X       = pnt->X
          Y       = pnt->Y
          ALTURA  = 150
          LARGURA = 200.

* Objetos são Mutaveis

MOVE 300 TO RET1->ALTURA.
MOVE 400 TO RET1->LARGURA.

RET1->OBJETO( ).

* Aliasing
* Utiliza método com efeito Overload feito no Workaround acima
DATA ret2 TYPE REF TO RETANGULO.
CREATE OBJECT RET2.

RET2 = RET1.

WRITE : / .
WRITE : / 'Aliasing:'.
WRITE : /  'Objeto2:'.

RET2->OBJETO( ).

* Altera objeto ret1
MOVE 100 TO RET1->ALTURA.
MOVE 200 TO RET1->LARGURA.

WRITE : / .
WRITE : / 'Alterando Objeto1 e afetendo Objeto2'.
WRITE : / 'Objeto2:'.

RET2->OBJETO( ).

* cria objeto de coordenadas
* passando e retornando objetos
* achando o centro do retangulo

DATA Coord TYPE REF TO COORDENADAS.
CREATE OBJECT COORD.

COORD->ACHACENTRO( RET1 ).

WRITE : / .
WRITE : / 'Centro do Retangulo:'.
WRITE : / 'Coordenadas X:', COORD->X.
WRITE : / 'Coordenadas Y:', COORD->Y.

Programação orientada a objetos apela em vários níveis. Para os gestores, que promete um desenvolvimento e manutenção mais rápido e mais barato. Para analistas e designers, o processo de modelagem torna-se mais simples e produz um design claro e gerenciável.

Para os programadores, a elegância e clareza do modelo de objeto e do poder de ferramentas e bibliotecas orientadas a objetos faz programação de uma tarefa muito mais agradável, e programadores experimentam um aumento na produtividade. Todo mundo ganha, ao que parece.

Se há um lado negativo, é à custa da curva de aprendizado. Pensar em objetos é uma dramática partida de pensar processualmente, e o processo de criação de objetos é muito mais desafiador do projeto processual, especialmente se você está tentando criar objetos reutilizáveis​​.

A abordagem orientada a objetos dá um passo mais longe, fornecendo ferramentas para o programador representar elementos no espaço do problema. Esta representação é geral o suficiente para que o programador não é fique restrito a qualquer tipo particular de problema.

Objetos são mutáveis

Você pode alterar o conteúdo de um objeto, fazendo uma atribuição a uma de suas variáveis de instância.

Você pode escrever métodos que retornam objetos. Observe que você pode usar a palavra chave NEW para criar um novo objeto, e logo em seguida usar o RESULT (resultado) como valor de retorno.

Modificando objetos, passando-os como argumentos para métodos podem ser úteis, mas também pode tornar a depuração mais difícil, porque nem sempre são claras as invocações que o método faz ou não para modificar seus argumentos. Mais tarde, vamos discutir alguns prós e contras deste estilo de programação.

Passando e Retornando Objetos

Em programação orientada a objetos é possível criar métodos passando um objeto e retornando um objeto.

Alias de Objetos

Quando dois objetos referem-se ao mesmo objeto. Em outras palavras, este objeto tem dois nomes, Objeto1 e Objeto2. Quando uma pessoa usa dois nomes, é chamado de aliasing. A mesma coisa com os objetos. Quando duas variáveis são alias, todas as mudanças que afetam uma variável também afetara a outra.

Null

Quando você cria uma variável de objeto, lembre-se que você está criando uma referência a um objeto. Até você fazer variável apontar para um objeto, o valor da variável é nulo. null é um valor especial e uma palavra-chave que significa: nenhum objeto.

Garbage collector

Se ninguém se refere a um objeto, então ninguém pode ler ou gravar qualquer dos seus valores, ou chamar um método nele. Em efeito, ele deixa de existir. Poderíamos manter o objeto na memória, mas seria apenas um espaço de resíduos, assim como o seu programa é executado periodicamente, o sistema procura por objetos encalhados e tenta recupera-los, em um processo chamado de coleta de lixo. Posteriormente, o espaço de memória ocupado por o objeto estará disponível para ser utilizado como parte de um novo objeto. Você não tem que fazer nada para fazer a coleta de lixo acontecer, e em geral você não vai estar ciente disso. Mas você deve saber que é periodicamente executado em segundo plano.

Objetos e Primitivos

Existem dois tipos diferentes, tipos primitivos e tipos de objetos. primitivos, como int e boolean começam com letras minúsculas; tipos de objetos começam com letras maiúsculas. Esta distinção é útil porque nos lembra algumas das diferenças entre eles:

Quando você declara uma variável primitiva, você tem espaço de armazenamento para um valor primitivo. Quando você declara uma variável de objeto, você tem um espaço para uma referência a um objeto.

Se você não inicializar um tipo primitivo, é dado um valor padrão a ele que depende de cada tipo primitivo.

Variáveis primitivas são bem isoladas, no sentido de que não há nada você possa fazer em um método que vai afetar uma variável em outro método.

Há uma outra diferença entre primitivos e tipos de objetos. Você não pode adicionar novos primitivos, mas você pode criar novos tipos de objetos.

Exemplo:

Neste exemplo criamos dois objetos de classes distintas e usamos algumas técnicas de manipulação de objetos, como: métodos de referencias ao objeto, retorno de objetos, aliasing de objetos.

Java

Classe #1 – Principal

public class Objetos
 {
  public static Pontos achaCentro (Retangulo ret)
  {
   int rx = ret.x + ret.largura/2;
   int ry = ret.y + ret.altura/2;
   return new Pontos(rx,ry);
  }
 public static void main(String[] args)
 {

      // Instancia objeto
      Pontos pontos = new Pontos (10,15);
      Retangulo ret1 = new Retangulo (pontos.x, pontos.y, 150, 200);
      System.out.println("Objeto1:" + ret1.objeto());

      // Objetos são Mutaveis
      ret1.altura = 300;
      ret1.largura = 400;
      System.out.println("Objeto1:" + ret1.objeto());

      // Aliasing
      Retangulo ret2 = new Retangulo();
      ret2 = ret1;
      System.out.println();
      System.out.println("Aliasing:");
      System.out.println("Objeto2:" + ret2.objeto());
      ret1.altura = 100;
      ret1.largura = 200;
      System.out.println();
      System.out.println("Alterando Objeto1 e afetendo Objeto2");
      System.out.println("Objeto2:" + ret2.objeto());

      // passando e retornando objetos
      //  achando o centro do retangulo
      Pontos coordenadas = new Pontos();
      coordenadas =  achaCentro(ret1);
      System.out.println();
      System.out.println("Centro do Retangulo:");
      System.out.println("coordenada X=" + coordenadas.x);
      System.out.println("coordenada Y=" + coordenadas.y);
  }
}

Classe #2 – Pontos

public class Pontos {

public int x = 0;
public int y = 0;

Pontos ()
{
}

Pontos (int x, int y)
{
this.x = x;
this.y = y;
}
}

Classe #3 – Retangulo

public class Retangulo extends Pontos
{
      public int altura = 0;
      public int largura = 0;
   Retangulo ()
  {
  }
   Retangulo(int x, int y, int altura, int largura)
  {
   this.x = x;
   this.y = y;
   this.altura = altura;
   this.largura = largura;
  }

    public String objeto ()
  {
   String resultado = "x=" + x + " y=" + y + " altura=" + altura + " largura="+ largura;
   return resultado;
  }
}

C++

Arquivo – Principal

#include "stdafx.h"
#include <iostream>
#include <string>
#include "Retangulos.h"
using namespace std;

static Pontos achaCentro(Retangulo& ret)
 {
  int rx = ret.x + ret.largura / 2;
  int ry = ret.y + ret.altura / 2;
  return  Pontos(rx, ry); }

 int _tmain(int argc, _TCHAR* argv[])
 {
  // Instancia objeto

  Pontos pontos(10, 15);

  Retangulo ret1 (pontos.x, pontos.y, 150, 200);

  cout << "Objeto1:" + ret1.objeto() << endl;

  // Objetos são Mutáveis

  ret1.altura = 300;
  ret1.largura = 400;

  cout << "Objeto1:" + ret1.objeto() << endl;

  // Aliasing

  Retangulo ret2;

  ret2 = ret1;

  cout << endl;  cout << "Aliasing:" << endl;
  cout << "Objeto2:" << ret2.objeto() << endl;

  ret1.altura = 100;
  ret1.largura = 200;

  cout << endl;  cout << "Alterando Objeto1 e afetendo Objeto2" << endl;
  cout << "Objeto2:" + ret2.objeto() << endl;

  // passando e retornando objetos
  //  achando o centro do retângulo

  Pontos coordenadas ;
  coordenadas = achaCentro(ret1);

  cout << endl;  cout << "Centro do Retangulo:" << endl;
  cout << "coordenada X=" << coordenadas.x << endl;
  cout << "coordenada Y=" << coordenadas.y << endl;

  system("pause");

  return 0;
 }

Arquivo – pontos.h

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

class Pontos
 {
 public:
  int x = 0;
  int y = 0;

  Pontos()
  {  }

  Pontos(int x, int y)
  {
   this->x = x;   this->y = y;
  }
 };

Arquivo – retângulo.h

#include "stdafx.h"
#include <iostream>
#include <string>
#include "Pontos.h"
using namespace std;

class Retangulo : public  Pontos
 {
 public:
  int altura = 0;
  int largura = 0;

  Retangulo()
  {  }

  Retangulo(int rx, int ry, int altura, int largura)
  {
   x = rx;   y = ry;
   this->altura = altura;
   this->largura = largura;
  }

  string objeto()
  {
     string resultado = "x=" + to_string(x) + " y=" + to_string(y)  + " altura="
                     + to_string(altura) + " largura=" + to_string(largura);   return resultado;
  }

};

C#

Classe #1 – Program

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
 {
     class Program
     {
         public static Pontos achaCentro(Retangulo ret)
         {
             int rx = ret.x + ret.largura / 2;
             int ry = ret.y + ret.altura / 2;
             return new Pontos(rx, ry);
         }
         static void Main(string[] args)
         {
             // Instancia objeto
             Pontos pontos = new Pontos (10,15);
             Retangulo ret1 = new Retangulo (pontos.x, pontos.y, 150, 200);
             Console.WriteLine("Objeto1:" + ret1.objeto());

            // Objetos são Mutaveis
            ret1.altura = 300;
            ret1.largura = 400;
            Console.WriteLine();
            Console.WriteLine("Mutando Objetos:");
            Console.WriteLine("Objeto1:" + ret1.objeto());

           // Aliasing
           Retangulo ret2 = new Retangulo();
           ret2 = ret1;

           Console.WriteLine();
           Console.WriteLine("Aliasing:");
           Console.WriteLine("Objeto2:" + ret2.objeto());
           ret1.altura = 100;
           ret1.largura = 200;

           Console.WriteLine("Alterando Objeto1 e afetendo Objeto2");
           Console.WriteLine("Objeto2:" + ret2.objeto());

           // passando e retornando objetos
           //  achando o centro do retangulo
           Pontos coordenadas = new Pontos();
           coordenadas =  achaCentro(ret1);

          Console.WriteLine();
          Console.WriteLine("Centro do Retangulo:");
          Console.WriteLine("coordenada X=" + coordenadas.x);
          Console.WriteLine("coordenada Y=" + coordenadas.y);
          Console.ReadKey();
         }
     }
 }

Classe #2 – Pontos

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesenvolvimentoAberto

{
      public class Pontos
     {
         public int x = 0;
         public int y = 0;

         public Pontos()
         {
         }

         public Pontos(int x, int y)
         {
             this.x = x;
             this.y = y;
         }
     }
 }

Classe #3 – Retangulo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesenvolvimentoAberto
 {
     public class Retangulo : Pontos
     {
         public int altura = 0;
         public int largura = 0;

         public Retangulo()
         {
         }

         public Retangulo(int x, int y, int altura, int largura)
         {
             this.x = x;
             this.y = y;
             this.altura = altura;
             this.largura = largura;
         }

         public String objeto()
         {
             String resultado = "x=" + x + " y=" + y + " altura=" + altura + " largura=" + largura;
             return resultado;
         }
    }
 }