Coleções Hetergêneas

gente, pode ser ateh bobo D+
mas, digamos q eu tenha:

class Funcionario {

public void decimoTerceiro(){

}
}

class Professor extends Fucnionario{

}

class Coordenador extends Professor {
Funcionario[] f =new Funcionario[10];
f[0] = New Coordenador();
}

me perdi nesse lance :funcionario[0] = New Coordenador();

Seguindo a hierarquia de suas classes:

Um coordenador é um professor (Coordenador extends Professor), que por sua vez é um funcionário (Professor extends Funcionario). Então vc pode fazer isso normalmente:

Funcionado f1 = new Professor();
Funcionado f2 = new Coordenador();
Professor p1 = new Coordenador();

Como vc tem um array de Funcionarios e um coordenador é um funcionario então vc pode colocá-lo nesta lista normalmente.

Espero que tenha ficado mais claro.

então, tenho:

class Funcionario {

public void salario(double dblSalario) {

}
}

class Coodenador extends Funcionario {

Funcionario[] f1 = new Professor(); 

// posso fazer
f1[0].salario(4.12) ;
}

eh sempre por valor neh ? tanto Objetos qto tipo primitivos

Exato!

Neste caso você está tratando Professor como um funcionário, então só pode invocar os métodos da classe Funcionario.

E passagem é SEMPRE por valor.