Sobes.tech
Junior — Middle

Explique as diferenças na utilização do modificador de acesso protected nas linguagens Java e Kotlin.

sobes.tech IA

Resposta da IA

Em Java, o modificador de acesso protected significa que o membro da classe é acessível:

  • Dentro da própria classe
  • Em todas as classes herdadas (mesmo que estejam em pacotes diferentes)
  • Em todas as classes dentro do mesmo pacote

Ou seja, protected em Java é uma combinação de acesso por herança e por pacote.

Em Kotlin, no entanto, protected significa acesso apenas dentro da própria classe e suas subclasses, mas não acessível de outras classes do mesmo pacote. Em Kotlin, não há conceito de acesso por pacote, por isso protected é mais restritivo do que em Java.

Exemplo:

// Java
package pkg1;
public class A {
    protected int x = 10;
}

package pkg1;
public class B {
    void test() {
        A a = new A();
        int val = a.x; // Acessível, pois no mesmo pacote
    }
}

package pkg2;
public class C extends A {
    void test() {
        int val = x; // Acessível, pois é um herdeiro
    }
}
// Kotlin
open class A {
    protected val x = 10
}

class B : A() {
    fun test() {
        println(x) // Acessível, herdeiro
    }
}

class C {
    fun test() {
        val a = A()
        // println(a.x) // Erro: `protected` não acessível fora da classe e seus herdeiros
    }
}

Portanto, a principal diferença é que em Kotlin protected não permite acesso por pacote, apenas por herança, enquanto que em Java permite ambos.