thegoodfellas/blogset-br huggingface dataset:
Programacao Orientada a Objetos - Instancia de ClassesNesse post eu vou falar sobre o que e uma instancia de classe e sobre qual e a diferenca entre uma variavel primitiva e uma de referencia. Para isso vamos precisar do seguinte codigo:class Carro{ //metodos e propriedades e construtores public static void main(String[] args){ Carro c; c = new Carro('Palio'); c.setAno(2002); } }O que acabamos de fazer foi declarar uma variavel de referencia do tipo "Carro" e apilidamos ela de "c". Dizemos que ela e uma variavel de referencia pois ela apenas esta se referenciando a um objeto na memoria RAM. "Entendi, entao ela funciona igual a um ponteiro do C++?"NAO! No java nos nao temos ponteiros, nos apenas temos variaveis que se referenciam a uma regiao da memoria RAM. A diferenca entre ponteiros e referencia e simples, o ponteiro e que fica, de certa forma, responsavel por excluir o objeto da memoria RAM apos ele ter sido usado, ja as variaveis de referencia nao, elas servem apenas para acessar uma regiao da memoria e nao possuem responsabilidade nenhuma em limpa - la."Mas entao a minha memoria vai comecar a lotar se eu nao limpa - la"Sim e nao! Isso aconteceria se o java nao tivesse o maravilhoso Coletor de Lixo (ou Garbage Collector). E ele que sempre aponta para os objetos que voce instancia e ele quem decide quando limpar a memoria RAM."Mas como ele sabe a hora certa de limpar a memoria?"Essa pergunta nao e tao facil de explicar, pois ele faz a limpeza sempre seguindo algumas normas para que o seu codigo nao de erros. Vou tentar explicar de forma simples. Vamos tomar como exemplo o codigo abaixo:class Carro{ //metodos e propriedades e construtores public static void main(String[] args){ Carro c; c = new Carro('Palio'); c.setAno(2002); Carro c2 = c; c = null; c2 = null; } }Para entender como sao essas regras de decisao para descartar o objeto, teremos que depurar o codigo mentalmente. Quando criamos o carro Palio (c = new Carro('Palio'); ), a JVM entende que estamos criando um objeto e o aloca em uma posicao especifica da memoria RAM e o adiciona um indice que diz quantas variaveis o apontam, nesse momento 1. Mais abaixo dizemos que a variavel de referencia "c2", referencia-se a "c", que por sua vez referencia-se a uma objeto na memoria RAM que "e um Palio", entao "c2" esta apontando para o mesmo Palio que "c". Nesse ponto a JVM diz que o indice do objeto e 2. Mais abaixo estamos dizendo que "c" agora e nulo e quando a JVM executar o GC(Garbage Collector) ele ira ver apenas uma variavel de referencia aponta para Palio, logo ele ira decrementar o seu indice, passando - o para 1. Seguindo em frente o nosso codigo diz que "c2" e nulo e quando a JVM executar o GC ela ira executar o mesmo procedimento, passando o indice do objeto Palio de 1 para 0 nesse ponto a JVM percebe que ninguem esta utilizando esse objeto e que nao tem como ninguem referencia - lo, sendo
assim o remove da memoria deixando os bytes que ele ocupava livre.Existem outros fatores que implicam na decisao da remocao do objeto na memoria RAM por parte da JVM, um deles e se outra thread tem acesso a uma referencia do objeto. Mas isso e um assunto muito longo e detalhado, o que voce precisa saber e que ele funciona +/- da forma dita acima (ira te ajudar muitooooo no dia-a-dia). Caso queira mais informacoes detalhadas GOOGLE =).Vamos agora falar das variaveis primitivas. E bem simples, quando declaramos uma variavel primitiva e como se criacemos uma caixa dizendo o quanto ela suporta e logo apos colocamos algo dentro dela. O codigo expressa isso://classe//mainint valor = 1; float valor2 = 2.55;valor2 = valor; System.out.println(valor);System.out.println(valor2); //fim da classeDeclaramos que a "caixa" valor e do tipo int, logo ela suporta coisas que um int suporta e "colocamos dentro dela" o valor 1. Fizemos a mesma coisa com o valor2. Abaixo dizessemos que valor2 aponta para valor, certo? Errado as variaveis do tipo primitivo nao apontam, ou elas apenas possuem valores. Estamos falando que valor2 agora possui dentro de si o mesmo que valor, ou seja ambas as variaveis estao valendo 1.Bom e isso pessoal ate o proximo post onde iremos falar de metodos construtores! prettyPrint();
Instalando MySql no ambiente WindowsSGBD MySql - Instalacao O SGBD (Sistema Gerenciador de Banco de Dados) MySql e um dos mais usados no mundo e o que iremos usar aqui em nosso exemplos.Para fazer o download basta clicar aqui e selecionar a opcao de acordo com seu sistema operacional.Tambem sera necessario fazer o download do MySql GUI Tools, que e a interface grafica do MySql. Selecione o tipo de sistema operacional e clique em download. Na proxima tela va direto na opcao "No thanks, just take me to the downloads!". Em "Brazil [Linorg - USP - Sao Paulo]" clique em "HTTP".Feitos os downloads vamos comecar a instalacao do MySql. Execute o "mysql-essential-5.X.XX-winXX.msi". Ira abrir uma janela do setup, clique em NEXT. A proxima tela pedira o tipo de instalacao, no nosso caso vamos escolher a Typical, mas caso voce queira mudar alguma coisa (o diretorio de instalacao por exemplo), selecione a opcao Custom. Clique em NEXT.Por fim clique em INSTALL.Apos a instalacao sera dado inicio ao setup do MySql Server Instance Configuration Wizard, clique em NEXT.Selecione a opcao "Detailed Configuration" e clique em NEXT.Na proxima tela selecione a opcao "Developer Machine" e clique em NEXT.Selecione a opcao "Multifunctional Database" e clique em NEXT - NEXT - NEXT.Nessa tela antes iremos selecionar a opcao "Add firewall exception for this port" que no caso e a porte 3306. Feito isso clique em NEXT - NEXT - NEXT.Agora vamos configurar o uruario ROOT que gerencia todos os database e conexoes com o banco. Coloque uma senha e a confirme. Clique em NEXT - EXECUTE.Se tudo der certo ira aparecer a seguinte tela:Clique em FINISH.Ainda nao acabamos, vamos agora executar o MySql GUI Tools (mysql-gui-tools-5.x-xx-winxx.msi). Clique em NEXT e aceite os termos de contrato. Na proxima tela voce pode mudar o path padrao do MySql GUI Tolls (caso queira mudar lembre - se de coloca - lo no mesmo diretorio do MySql para ncao haver problemas).Pronto, se voce fez tudo direitinho, no menu do INICIAR - PROGRAMAS ira aparecer a opcao MYSQL, como na imagem abaixo:Execute o MySql Query Browser e divirta - se!!!OBS.: Para acessar o banco de dados local, ou seja o que esta na sua maquina, na opcao Server Host digite "localhost". A porta mantenha a 3306 e entre com o ROOT (afinal ainda nao cadastramos novos usuarios). Como aqui eu vou dar maior foco no desenvolvimento, nao terei tempo de falar sobre a historia do .NET, portanto acho legal voces lerem um pouco da historia aqui.Abra o Visual Studio ou o Visual C# e va em FILE - NEW - PROJECT:Selecione a opcao CONSOLE APPLICATION e de ao projeto o nome "olaMundo":Vamos agora ao codigo do nosso programa:using System;namespace olaMundo{ class Program { static void Main(string[] argumentos) { Console.WriteLine("Ola mundo!!!"); for (int i = 0; i < argumentos.Length; i++) { Console.WriteLine(argumentos[i]); } } }}Agora vamos entender o que acabamos de escrever. O namespace nada mais e que o dominio dessa classe, ou seja, quando colocamos o nomespace estamos demilitando essa classe a somente esse projeto, no caso "olaMundo". Mais abaixo criamos a
classe Program, e ela quem ira executar a funcao principal do nosso programa, que e o metodo Main. O metodo Main recebe como parametro um vetor de string chamado de argumentos.Repare que antes de mais nada nos fazemos a chama de um biblioteca chamada System, e ela que nos da acesso a classe Console que possui o metodo estatico WriteLine. Esse metodo recebe como parametro uma string que sera exibida no console. Mais abaixo nos usamos uma estrutura de repeticao FOR que ira mostrar o que foi passado como argumento para o nosso programa.Agora compile o seu projeto. Perceba que quando clicamos no botao de compilar do Visual Studio sera exibida uma tela do DOS muito rapida, para podermos ver o nosso programa executando vamos fazer diferente. Apos termos compilado o projeto, sem erros claro, iremos ate a pasta do projeto, no meu caso fica em "C:\Documents and Settings\Guilherme\Meus documentos\Visual Studio 2008\Projects\olaMundo\olaMundo". Perceba que nos temos uma pasta chamada "bin" e la onde se encontram os nossos arquivos binarios, ou seja executaveis. Vamos entao ate "bin/Debug":Agora iremos em INICIAR - EXECUTAR e digitar "cmd". Na tela do DOS va ate o caminho que esta na sua janela, o caminho onde encontra - se o nosso executavel "olaMundo.exe". Chegando la digite no console "olaMundo Meu Primeiro Programa C#", sera exibida a seguinte mensagem:O que acabamos de fazer foi simplesmente chamar o programa olaMundo.exe e apos isso passamos como parametro o texto que ele devera exibir apos o "Ola mundo!!!".Bom pessoal e isso, ate a proxima. prettyPrint();
Nao da para comecarmos a explicar o que e POO (Programacao Orientada a Objetos) sem explicarmos a programacao estruturada.Programacao estruturada nada mais e que um fluxo de codigo onde voce detarmina, atraves de comandos, o comportamento do seu programa. Aparentemente parece que nao ha problema nisso, mas depois de um certo tempo codificando de forma estruturada, voce percebe que seu codigo, em alguns momentos, possui redundancia e mistura o tratamento dos dados com o comportamento do seu programa. De fato a maquina so entende as informacoes de forma estruturada, mas nada disso nos impede de melhorar nosso codigo, de forma que isso facilite o entendimento para nos, seres humanos.A programacao estruturada nao e uma forma errada de se programar, porem tras muito mais trabalho para o programador. As linguagens mais poderosas sao estruturadas, C (uma linguagem de baixo nivel) e Assembly (linguagem de maquina), pois elas estao mais "proximas" da linguagem de maquina.A programacao orientada a objetos veio pra mudar isso, ela simula o mundo real dentro do computador. A partir dai voce comeca a separar a sua camada de visualizacao, logica (regra de negocio), tratamento de dados e comeca a criar suas entidades, onde elas irao representar algo do mundo real.Essa separacao faz com que seu codigo seja mais legivel e com que a manutencao seja mais facil de ser realizada.No proximo post irei dar continuidade explicando o que sao Classes, metodos, propriedades e encapsulamento. Ate mais... Para podermos desenvolver na linguagem C# precisamos ter na nossa maquina alguma versao do Windows (do XP em diante), o framework .NET (da versao 3.5 em diante) e claro uma IDE para podermos desenvolver (no caso a mais usada e aconselhada para desenvolver na plataforma .NET e o VisualStudio).A IDE voce pode usar o Visual Studio ou oVisual C#, baixe as versoes express que sao gratuitas.Voce pode encontrar o framework aqui.Para instala-lo nao tem nenhum misterio, basta seguir as informacoes do wizard de instalacao (ou ficar ciclando em next..., aushuahsuahs).Feito isso voce tera uma das melhores IDEs de desenvolvimente ate entao criada. Para explicar como funcionam os modificadores de acesso vou precisar doseguinte codigo: //exemplo em C# public class Pessoa { private string nome; private string rg; private string cpf; private string endereco; private int idade; private string dataNascimento; public string Nome { set { nome = value; } get { return nome; } } public string Rg { set { rg = value; } get { return rg; } } public string Cpf { set { cpf = value; } get { return cpf; } } public string Endereco { set { endereco = value; } get { return endereco; } } public int Idade { set { idade = value; } get { return idade; } } public string DataDeNascimento { set { dataDeNascimento = value; } get { return dataDeNascimento; } } } //exemplo em C# public class Aluno : Pessoa{ private string ra; public string Ra { set { ra = value; } get { return ra; } } } Com ele em maos, vamos poder dar continuidade. Abaixo vou
explicar os principais modificadores: *public: ele da acesso total ao metodo, propriedade ou ate mesmo classe. Quando sua classe se tornar um objeto, o objeto passara a ter acesso a esses metodos ou propriedades. Exemplo: //classe Main public static void main(string[] args){ Aluno aluno = new Aluno(); aluno.Nome = "Jose"; // o objeto aluno tem acesso aos metodos e propriedades public. } *private: somente a classe tem acesso aos metodos ou propriedades com esse modificador. Um bom exemplo e a propria classe Pessoa, onde o acessor de prorpiedade "Nome" tem acesso a propriedade "nome". Os acessor de prorpiedade "Nome" e "public", mas pertencem a classe Pessoa, logo tem acesso as propriedades "private". *protected: ele faz com que as classes que possuam algum tipo de heranca possa acessar seus metodos ou propriedades. Exemplo, se colocassemos que a propriedade "nome" da classe Pessoa fosse "protected", por estar herdando de Pessoa, a classe Aluno poderia acessar a propriedade nome.Exemplo: //classe Pessoa protected string nome; //resto da classe //classe Aluno //no caso criei esse metodo para exemplo. public void setSobrenome(String sobrenome){ this.nome += sobrenome; } //resto da classe Aluno *static: o static e um modificador de acesso que pode ser usado em conjunto com os demais citados acima (exemplo: "public static", "private static", "protected static"). Ele faz com que o metodo ou propriedade possa ser chamado sem instanciar a classe. Dizemos que os metodos ou propriedades "static" pertencem a classe e nao a instancia do objeto. Exemplo: public class Pessoa { public static string nome; private int idade; public int Idade { set { idade = value; } get { return idade; } } public static void main(String[] args){ Pessoa pessoa1 = new Pessoa(); pessoa1.Idade = 10; pessoa1.nome = "Pedrinho"; Pessoa pessoa2 = new Pessoa(); pessoa2.Idade = 20; pessoa2.nome = "Jose"; //nao precisei instanciar a classe Pessoa para ter acesso a propriedade nome Pessoa.nome = "Ana"; Console.Writeln("Nome e idade da pessoa1 " + pessoa1.nome + "\t" + pessoa1.Idade); Console.Writeln("Nome e idade da pessoa2 " + pessoa2.nome + "\t" + pessoa2.Idade); } } Qual sera a saida? Sera: Nome e idade da pessoa1 Ana 10; Nome e idade da pessoa2 Ana 20; Mas porque? Vamos la, nos criamos 2 objetos em memoria que sao do tipo Pessoa, sao eles "pessoa1" e "pessoa2", eles possuem posicoes em memroia diferentes (exemplo pessoa1, posicao 0x00234j e pessoa2 0x00236b). Colocamos que a pessoa1 tem idade 10 e se chama "Pedrinho" logo apos colocamos que a pessoa2 se chama "Jose" e tem 20 anos. Ok as idades apareceram de maneira correta mas os nomes nao, isso porque o modificador "static" estava na propriedade nome, logo os objetos pessoa1 e pessoa2 compartilhavam a mesma posicao de memoria. Se fossemos usar o Debug, iriamos perceber que ele atribui a propriedade nome com "Pedrinho", quando chega na pessoa2 ele substitui por "Jose" e depois substitui por "Ana". Exemplo de como ficaria a memoria em relacao ao exemplo acima:*const: Ele pode ser usado em conjunto com os demais citados acima, excepto o static (exemplo: "public const, "private const", "protected const"). Ele e usado pra expressar algum
valor constante ou tornar metodo ou classe como inalteravel.Exemplo:const int i = 100;O valor de "i" sempre sera 100. Usando o "const" nao poderemos mais mudar esse valor, afinal ele e uma constante.No proximo post vou revisar quando uma Classe se torna um objeto, sobre o metodo construtor e abstracao.Abraco!!! prettyPrint();
Programacao Orientada a Objetos - Metodo construtorO metodo construtor e aquele que chamos quando instanciamos um objeto, em muitos casos e o responsavel por inicializar o estado do objeto.Ele e parecido com um metodo, so que ele nao possui nenhum tipo de retorno (nem mesmo a declaracao void) e tem que ter o mesmo nome da classe. Ele pode ser declarado com qualquer modificador de acesso, ate mesmo o private. Se ele tiver um construtor private significa dezer que apenas o codigo de dentro da classe ira ter acesso a ele, exemplo:class Foo{ private Foo(){} private Foo foo; public static getInstance(){ if(foo == null) foo = new Foo(); return foo; } }class Bar{ public Bar(){ this("Oi"); } private Bar(String msg){ System.out.println(msg); }}Se voce nao colocar um metodo construtor na sua classe o compilador ira colocar para voce.Outro fator importante e que voce pode ter um metodo com o nome de um construtor, exemplo:class Foo{ public Foo(){} void Foo(){} }//mainnew Foo().Foo();//fim main Nesse exemplo ele ira executar o construtor do objeto e logo em seguinda o metodo void Foo.Sempre que voce estabelecer uma relacao de herenca voce tem que chamar no construtor o construtor da super classe, caso voce nao gere o compilador mais uma vez faz isso para voce, exceto no caso do construtor da super exigir a passagem de algum parametro, exemplo:class Foo(){ Foo(String msg){} }class Bar extends Foo(){ Bar(){ super("Oi"); } }Outro fater importante e saber quando usar o "this" e o "super". O "this" e usado quando um construtor que chamar outro construtor da classe, exemplo:class Bar{ public Bar(){ this("Oi"); } private Bar(String msg){ System.out.println(msg); }}Ja o super e utilizado quando uma subclasse chama o construtor da super, exemplo:class Foo(){ Foo(String msg){} }class Bar extends Foo(){ Bar(){ super("Oi"); } }Por hoje e isso pessoal, ate o proximo post. prettyPrint(); O conceito de Heranca e o fator que deixa a programacao orientada a objetos unica.O conceito e igual ao do mundo real, onde um ser vivo herda caracteriticas de seu descendente e possui as proprias. No mundo da programacao o conceito e o mesmo, a herenca lhe permite abstrair caracteristicas comuns e centraliza - las em uma "superclasse", para que "subclasses" possam usa - las."Mas o que sao superclasses e subclasses ?"Simples, a "superclasse" nada mais e que uma classe que centraliza metodos e propriedades comuns a mais de uma classe, e a "subclasse" e a classe que herda de uma "superclasse" e assim possui caracteristicas proprias mais a da "superclasse". Um bom exemplo esta na sua casa, onde sua mae ou pai sao uma "superclasse" e voce e uma "subclasse", ou seja voce herdou caracteristicas de seus pais e possui as proprias.Vamos a um exemplo de UML:Obs.: No programa de UML que fiz esse diagrama ele nao mostra, sei la porque, as propriedades. Mas nesse exemplo so temos os Gets e Sets das propriedades.Nesse exemplo ficou claro que Aluno herda de Pessoa, isso porque todo aluno, antes de mais nada, e uma pessoa. Esse e um exemplo bem simplorio de abstracao. Pense, se voce tivesse as classes Cliente, Funcionario
e Gerente, objviamente todos eles tem nome, idade, telefone, endereco, cpf, rg, data de nascimento e etc. Voce iria replicar isso tudo nas tres classes? Nao, a programacao orientada a objetos permite que voce nao gere redundancia e assim deixe seu codigo mais otimizavel. Voce entao ira criar uma classe Pessoa e as demais classes irao herdar seus atributos e metodos.Vamos a um exemplo em codigo://Exemplo em C#using System;public class Pessoa{ private String nome; public String Nome { get { return nome; } set { nome = value; } } private String rg; public String Rg { get { return rg; } set { rg = value; } } private String cpf; public String Cpf { get { return cpf; } set { cpf = value; } } private String endereco; public String Endereco { get { return endereco; } set { endereco = value; } } private int idade; public int Idade { get { return idade; } set { idade = value; } } private String dataNascimento; public String DataNascimento { get { return dataNascimento; } set { dataNascimento = value; } }}//Exemplo em C#using System;public class Aluno : Pessoa{ private string ra; public string Ra { get { return ra; } set { ra = value; } }}Bom, ja que eu disse que quando herdamos de alguma classe, herdamos seus metodos e propriedades (no C# quando se quer fazer algum tipo de herenca usa - se o ":" para representa - la) podemos fazer isso://classe Mainpublic static void main(String[] args){ Aluno aluno = new Aluno(); aluno.nome = "Jose"; //sera que funciona?}Nao, pois a propriedade "nome" esta com o modificador de acesso "private". Isso significa dizer que aquele atributo so pode ser acessado pela classe Pessoa. "Aaaaaa, mas entao e so eu colocar o public ao inves de private, certo?" Sim, mas isso e errado, afinal voce fez o encapsulamento (Gets e Sets) atoa? Voce estara ferindo o conceito de encapsulamento, usamos a palavra reservada "private" justamente para que isso nao aconteca. O usuario da classe Pessoa, ou qualquer outra que a herde, nao podera ter acesso as suas propriedades. Para que o codigo acima funcione, nos devemos usar o acessor de propriedade Nome.Exemplo://classe Mainpublic static void main(String[] args){ Aluno aluno = new Aluno(); aluno.Nome = "Jose"; //ira funcionar.}No C# nos nao usamos os metodos para acessar as propriedades, ate poderiamos criar metodos que retornassem o estado da propriedade, mas ao inves disso nos usamos os acessores de prorpiedade. Ele nada mais e do que um metodo que faz o GET e SET normal que conhecemos. Um exemplo da sua estrutura nos podemos ver na classe "Aluno": //Classe Aluno private string ra; public string Ra { get { return ra; } set { ra = value; } }Quando queremos colocar um valor para "ra" basta apenas fazermos isso:a.Ra = "R65326253g"; //quando fazermos isso o acessor da propriedade entende que estamos fazendo um setE se precisarmos fazer um acesso a propriedade "ra" basta apenas fazer da seguitne forma:a.Ra; //quando fazermos isso o acessor da propriedade entende que estamos fazendo um getNo