Novato Java aqui, eu tenho uma pergunta básica que é metade respondida por respostas anteriores em outros tópicos ou os docs, mas eu ainda não entendo completamente o mecanismo e eu quero ter certeza de que cobre os fundamentos (código na parte inferior, perguntas meio).
Basicamente, eu estou substituindo o método () é igual para verificar se dois objetos MyDate têm a mesma data. Eu faço uma verificação instanceof se o objeto o é um objeto MyDate, em seguida, digite converter um objeto temporário especificamente para um objeto MyDate o
, então você comparar datas. Por que você digite converter a variável temp para MyDate classe de o, quando já é da classe MyDate?
- Você usa variável temporário como uma referência mais fácil o objeto que você deseja executar os iguais de comparação ()? Porque você usa equals () como comparar
MyDate.equals(MyOtherDate)
, no código, se eu não designar uma variável para armazenar a referência, então você obter vários erros (temperatura não podem ser resolvidos como uma variável, incompatibilidade de tipo, etc, basicamente, o compilador não tem certeza de onde para olhar a menos que você escrever um código mais bando).
2a. Alguns dos outros tópicos disse algo no sentido de que, enquanto instanceof verifica se uma instância é de uma classe, ele verifica a base de classe, mas não verifica uma subclasse. Você faz o typecasting porque você está dizendo especificamente o compilador para verificar se esse objeto específico (tipo fundição de um objeto em geral para um objeto específico). NOTA: Esta pode ser uma pergunta versão e específico sabor tipo, eu vi diferentes respostas a perguntas semelhantes.
2b. Fundição muda a referência, não o objeto em si. Então, se os objetos são da mesma classe, mas diferentes subclasses, não seria falhar em tempo de execução, em vez de tempo de compilação. E eu não iria obter um ClassCastException?
public boolean equals(Object o) {
if (o instanceof MyDate) {
MyDate temp = (MyDate) o;
if ((temp.day == day) && (temp.month == month) && (temp.year == year)) {
return true;
}
}
return false;
}