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

Animal dog1 = new Dog();
Dog dog2 = new Dog();

dog1 和 dog2 有什么区别吗?
最前面写的 Animal 和 Dog的作用是什么?

阅读 4.1k
5 个回答

多态,这个涉及到 java 引用变量的 编译时类型(申明变量时的类型) 和 运行时类型(变量所引用的实际对象的类型)

Animal dog1 = new Dog();

关于编译时类型:
dog1 被申明为 Animal,在编译时也就是书写代码的时候,dog1 只能够调用 Animal 中申明(不一定要实现)的方法。
关于运行时类型:
dog1 实际引用的对象类型为 Dog。如果 Dog 类中实现了或者重载了 Animal 中的方法,那么在运行时,dog1 实际调用的方法是 Dog 类中的方法。

dog2 两种类型一致,不需要纠结~,写的时候和运行的时候是一致的。

Aniaml.java

package cn.lonecloud.pojo;

/**
 * Created by lonecloud on 2017/8/29.
 */
public interface Animal {

}

Dog.java

package cn.lonecloud.pojo;

/**
 * Created by lonecloud on 2017/8/29.
 */
public class Dog implements Animal {
}

POJOTest.java

package cn.lonecloud;

import cn.lonecloud.pojo.Animal;
import cn.lonecloud.pojo.Dog;

/**
 * Created by lonecloud on 2017/8/29.
 */
public class POJOTest {

    public static void main(String[] args){
        Animal dog1=new Dog();
        Dog dog2=new Dog();
        **System.out.println(dog1);//cn.lonecloud.pojo.Dog@266474c2
        System.out.println(dog2);//cn.lonecloud.pojo.Dog@6f94fa3e**
    }
}

楼主请看上面的代码
Aniaml.java创建了一个Animal的接口类
Dog.java创建了一个Dog类,该类对Animal的实现类。
POJOTest.java为测试类
请看两行加粗部分的代码
像楼主这样创建了两个类其后面输出韩式Dog类:
原因为图片描述

其实现了Dog类实现了Animal类
其实为面向接口编程
好处是:

统一定义接口,方便后期进行业务调用,让系统解耦

如果将改为
Aniaml.java

package cn.lonecloud.pojo;

/**
 * Created by lonecloud on 2017/8/29.
 */
public class Animal {

}

Dog.java

package cn.lonecloud.pojo;

/**
 * Created by lonecloud on 2017/8/29.
 */
public class Dog extends Animal {
}

则其为多态,

其为dog1相当于向上转型了,虽然自身为Dog类但是只拥有父类的方法

好处是:

减少重复代码,使代码变得简洁。
提高系统扩展性。

设计模式中有一个原则,就是针对接口编程或者叫针对超类型编程。程序针对超类编程,执行时会根据实际类型执行到真正的行为,不要绑死在具体的类型上。

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!");
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题