Animal dog1 = new Dog();
Dog dog2 = new Dog();
dog1 和 dog2 有什么区别吗?
最前面写的 Animal 和 Dog的作用是什么?
Animal dog1 = new Dog();
Dog dog2 = new Dog();
dog1 和 dog2 有什么区别吗?
最前面写的 Animal 和 Dog的作用是什么?
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!");
}
}
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
多态,这个涉及到 java 引用变量的 编译时类型(申明变量时的类型) 和 运行时类型(变量所引用的实际对象的类型)
关于编译时类型:
dog1 被申明为 Animal,在编译时也就是书写代码的时候,dog1 只能够调用 Animal 中申明(不一定要实现)的方法。
关于运行时类型:
dog1 实际引用的对象类型为 Dog。如果 Dog 类中实现了或者重载了 Animal 中的方法,那么在运行时,dog1 实际调用的方法是 Dog 类中的方法。
dog2 两种类型一致,不需要纠结~,写的时候和运行的时候是一致的。