Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Aula 04 - Exercício 3: Array não é objeto?

Verifiquei que no Exercício 3, da aula 4, a resposta é mencionada da seguinte forma:

O código compila, mas como não chamamos nenhum construtor, o único objeto criado que se assemelha a B, porém não é B, é um array do tipo B, com 100 espaços. Nenhum objeto é criado. Note que para criar devemos, por padrão, invocar o construtor.

Neste caso, em negrito, está somente mencionando que nenhum objeto do tipo B é criado, certo? Haja vista que, de acordo com a JLS, na seção 4.3.1 Arrays também são objetos, assim como instâncias de classe, portanto se a questão perguntasse quantos objetos são elegíveis para serem coletados, poderíamos colocar 1 - um array do tipo B.

Estou correto? Abraços!

7 respostas

Olá Felipe,

Nesse caso, pelo menos durante a execução do código, a variável bs mantém uma referência para o array do tipo B. Desse modo, mesmo que o garbage collector seja executado, o array não é elegível para coleta pois ele continua sendo referenciado por bs.

Ah sim, como você mesmo comentou, na resposta ficaria melhor escrever que nenhum objeto do tipo B é criado.

Não entendi. No caso, B[] bs = new B[100]; não cria um objeto do tipo array, de 100 espaços, elegível para ser coletado após se tornar inacessível? Senão, em que momento o objeto array é criado?

solução!

É isso mesmo, só tem que tomar muito cuidado com esse "após se tornar inacessível". Durante a execução do código do método main do exercício, não podemos afirmar que o array é elegível para coleta pois em nenhum momento ele se torna inacessível. Por exemplo, veja o exemplo abaixo:

class B { }

class A {
    public static voiid main(String args[]) {
        B[] arrayFora = new B[100];
        // A
        if (true) {
            B[] arrayDentro = new B[100];
            // B
        }
        // C
    }
}

Na linha A, o arrayFora não é elegível para coleta pois ainda está sendo referenciado.

Na linha B, o arrayFora continua não elegível para coleta e o arrayDentro não é elegível pois acabamos de criar uma referência para ele.

Na linha C, o arrayFora continua não elegível para coleta. Mas agora, o arrayDentro se tornou elegível para coleta pois a sua referência deixou de existir quando saímos do contexto do if.

Nesse exemplo, tivemos 2 objetos criados e apenas 1 deles se tornou elegível para coleta durante a execução do método.

Perfeitamente explicado. Então é de suma importância que a questão indique exatamente em que momento quais variáveis podem ser elegíveis ou não para coleta?

Isso mesmo Felipe, geralmente as questões desse tipo na prova aparecem de forma parecida com essa do exemplo que mostrei.

Mas caso o exemplo fosse uma questão da prova, eu procuraria uma alternativa como "O código não compila", certo? O tipo de retorno do método main voiid gera um erro de compilação - hehehehe.

Brincadeiras a parte, estou fazendo alguns simulados e percebi que existem muitas pegadinhas como essa hahaha.

Boa hahaha! Já tá esperto pra prova :P

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software