Olá Pessoal, tudo bom?
O artigo de hoje está relacionado a uma classe que é a classe base de qualquer classe da Linguagem Java, a classe Object. Essa classe é muito importante dentro da linguagem e muitas vezes pode confundir desenvolvedores mais novos. Esse post dará inicio a uma série de posts relacionados aos métodos internos que existem dentro da classe Object. Dessa forma exploraremos a utilidade desses métodos, isso ocorrerá em artigos futuros. Hoje o artigo irá descrever sobre a classe Object e como realizar a declaração de uma filha desta classe. Confira na continuação:
Classe Object
A classe Object, de acordo com a especificação Java ((4.3.2 – Class Object – Java Specification: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.3.2)) é a classe “Pai” de todas as classes que foram, estão sendo ou serão criadas dentro da linguagem Java. Até mesmo os arrays estáticos são filhas da classe Object.
Entretanto o tipo Interface não é filha desta classe, assim qualquer interface criada não possui relacionamento com a classe Object.
…consider that while an interface does not have
Object
as a supertype…. ((9.6.4.4 – @Override – Java Specification: http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.4.4))
A classe está localizada dentro do package java.lang, o qual é automaticamente importado pelo Java quando se está criando uma classe.
Código da Classe Object
O código da classe Object, na versão 1.8 da JDK se encontra abaixo. Os comentários e javadocs foram removidos, a fim de facilitar a visualização do código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
package java.lang; public class Object { private static native void registerNatives(); static { registerNatives(); } public final native Class<?> getClass(); public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } protected native Object clone() throws CloneNotSupportedException; public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } public final native void notify(); public final native void notifyAll(); public final native void wait(long timeout) throws InterruptedException; public final void wait(long timeout, int nanos) throws InterruptedException { if (timeout < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos > 0) { timeout++; } wait(timeout); } public final void wait() throws InterruptedException { wait(0); } protected void finalize() throws Throwable { } } |
Um olhar mais profundo sobre o código acima, permite ver que existem métodos declarados como final native. O que significa isso? A JDK é implementada em diversos Sistemas Operacionais, assim existem certos métodos que precisam acessar operações básicas do SO, que são chamadas de Syscalls. Os métodos com as palavras chave final native, devem ser escritos com as particularidades existentes em cada SO. Assim devido a essa particularidade não possuem código em seu corpo.
Outro detalhe importante é que os métodos que não possuem a palavra chave final em sua declaração podem ser sobrescritos na classes filhas de Object, como por exemplo o método wait().
Criação de Instâncias
Como pode ser visto no código acima, a classe Object não é uma classe abstrata, ou seja, pode ser instanciada. Como também pode ser observado, a classe Object não realiza declaração de construtores, assim o construtor default, sem parâmetros, é criado implicitamente pelo Java. Assim o código abaixo roda corretamente, imprimindo no console o nome da classe e o seu hashCode.
1 2 3 4 5 6 7 8 9 |
package br.com.mauda.exemplos.object; public class TesteInstanciacaoObject { public static void main(String[] args){ Object object = new Object(); System.out.println(object.toString()); } } |
Herança com a classe Object
Qualquer classe que não declare ser filha de alguma classe será filha de Object.
Assim o código da classe Seminario está correto:
1 2 3 4 5 6 7 |
package br.com.mauda.seminariosCientificos.entity; public class Seminario extends Object { //Atributos de Seminario //Metodos de Seminario } |
Mas o código acima pode ser simplificado sem o “extends Object”, já que a linguagem Java faz isso implicitamente se a classe em questão não estender outra classe diferente de Object:
1 2 3 4 5 6 7 |
package br.com.mauda.seminariosCientificos.entity; public class Seminario { //Atributos de Seminario //Metodos de Seminario } |
Métodos
Existem diversos métodos criados dentro da classe Object. E como todas as classes direta ou indiretamente são filhas de Object, logo todas as classes possuem os métodos que existem na classe. Assim nos próximos artigos desta série iremos descrever os seguintes métodos, não necessariamente nesta ordem:
protected Object clone()
boolean equals(Object obj)
protected void finalize()
Class<?> getClass()
int hashCode()
void notify()
void notifyAll()
String toString()
void wait()
void wait(long timeout)
void wait(long timeout, int nanos)
finally{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply