为了账号安全,请及时绑定邮箱和手机立即绑定

java创建对象的语法,求解释

java创建对象的语法,求解释

桃花长相依 2019-03-01 10:35:37
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 两种类型一致,不需要纠结~,写的时候和运行的时候是一致的。

查看完整回答
反对 回复 2019-03-01
?
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!");
    }
}
查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 1118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信