O que seria variavel com nome de classe?

O que seria quando agente tem uma variável com nome de outra classe, assim: private Motorista motorista;?

Seria uma variável que tem os métodos dessa classe, não muda nada das variáveis que você está acostumado.
String por exemplo, é uma classe nativa do java, onde você pode criar uma variável que tem os métodos que ela fornece.

Assim vc pode acessar os atributos tbm da classe Motorista

Isso me parece similar a herança, seria isso msm?

Seria só uma identificação da variável, o nome pode ser qualquer um. Quando o nome da variável é igual a da classe, costuma fazer mais sentido em situações como:

Motorista motorista;
Carro carro;
motorista.dirigeO(carro); // motorista dirige o carro

Motorista cachorro;
Carro discoVoador;
cachorro.dirigeO(discoVoador); // cachorro dirige o disco voador
1 curtida

Isso vem a ser a declaração de um atributo da sua classe que por sua vez assume o tipo de um modelo, por exemplo, digamos que você possua 2 model, um de cor e outro de produto:

public class Cor {
    private Integer Id;
    private String Descricao;

    //Implementação
}

public class Produto {
    private Integer Id;
    private String Descricao;
    private Cor cor; //A partir daqui conseguimos acessar o Id e Descrição da cor dentro de sua própria classe partindo do produto, desta forma evitamos a duplicação de código como por exemplo declarar mais 2 atributos na classe produto para representar o Id e Descrição da cor.

     //Implementação
}

Considere o exemplo acima apenas com 2 atributos, agora pense desta forma em uma classe onde você possua N atributos.

1 curtida

Exatamente!
E sempre procure utilizar nomes de variáveis que façam sentido com o propósito da variável, como no exemplo acima.

Agora imagine se alguém escreve código assim:

Motorista xyz;
Carro abc;
xyz.dirigeO(abc); // é difícil de entender

Ou pior:

Motorista carro;
Carro motorista;
carro.dirigeO(motorista); // parece completamente sem sentido

Então, mas aqui não seria quase igual eu criar herança?

public class Produto extends Cor {

}

Aqui também consigo acessar os atributos de Cor.

São coisas distintas!

Perceba, a partir do exemplo que citei na resposta anterior o acesso se dá por meio da classe de origem partindo para a destino, exemplo:

produto.getCor().GetId(); //Classe produto, Classe Cor, Atributos da Classe Cor.
produto.getCor().GetDescricao();

Utilizando da Herança conforme você citou o acesso se dá diretamente pela classe de origem, exemplo:

produto.GetId(); //Classe produto, Atributo da Classe Cor.
produto.GetId(); //Classe produto, Atributo da Classe Produto.

Apesar de obtermos um mesmo resultado, o uso ocorre de forma totalmente diferente.

(Meu ponto de vista ao uso de Herança)
Edit: Vale destacar que em uma situação em que não serão utilizados todos os elementos e métodos da classe da qual está estendendo não faz sentido você utilizar Herança.