Animal dog1 = new Dog();Dog dog2 = new Dog();
dog1 和 dog2 有什么区别吗?最前面写的 Animal 和 Dog的作用是什么?
3 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
多态,这个涉及到 java 引用变量的 编译时类型(申明变量时的类型) 和 运行时类型(变量所引用的实际对象的类型)
Animal dog1 = new Dog();
关于编译时类型:
dog1 被申明为 Animal,在编译时也就是书写代码的时候,dog1 只能够调用 Animal 中申明(不一定要实现)的方法。
关于运行时类型:
dog1 实际引用的对象类型为 Dog。如果 Dog 类中实现了或者重载了 Animal 中的方法,那么在运行时,dog1 实际调用的方法是 Dog 类中的方法。
dog2 两种类型一致,不需要纠结~,写的时候和运行的时候是一致的。
MMTTMM
TA贡献1869条经验 获得超4个赞
设计模式中有一个原则,就是针对接口编程或者叫针对超类型编程。程序针对超类编程,执行时会根据实际类型执行到真正的行为,不要绑死在具体的类型上。
public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
Dog dog = new Dog();//针对实现编程
Animal animal = new Dog();//针对接口/超类编程
Animal animal2 = getAnimal(1);//我不管对象是狗,还是猫,我只要知道它有doSomething()的行为,利用Animal进行多态调用。
animal2.doSomething();
}
public static Animal getAnimal(int type){
if(1 == type){
return new Dog();
}else if(2 == type){
return new Cat();
}else{
throw new IllegalArgumentException("非法类型");
}
}
}
class Animal{
public void doSomething(){
}
}
class Cat extends Animal{
@Override
public void doSomething() {
System.out.println("cat do!");
}
}
class Dog extends Animal{
@Override
public void doSomething() {
System.out.println("dog do!");
}
}
添加回答
举报
0/150
提交
取消