Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程中核心的核心!
动态绑定、多态、迟绑定指的是一个意思。
1. 编译期和运行期进行的操作是不相同的,编译器只是进行语法的分析,分析出来的错误也只是语法上的错误,而运行期在真正在分配内存。编译时是调用检查你的源程序是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。 运行时是java虚拟机解释执行字节码文件;
2. 动态绑定:是指在执行期间也是指运行期(而非编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法;
3. 动态绑定的条件:
① 要有继承
② 要有重写
③ 父类引用指向子类对象
4. 多态:也就是向上转型,就是用父类对象的类型信息去调用子类类型信息中和父类相同的方法(子类覆盖父类的方法);
5. 父类中的某个方法只有在父类中定义而子类中没有重写的情况下,才能被父类类型引用调用;对于父类中定义的方法,如果子类重写了该方法,那么父类类型的引用会调用子类中方法;
6. 在Java中,向上转型是自动进行的,而向下转型却不是的,需要强制转换;
7. 继承:继承是使子类拥有父类所有的属性和方法,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用
8. 下面给出一个demo:
// 核心代码 class Animal { private String name; Animal(String name) { this.name = name; } public String enjoy() { return "父类:叫唤"; } public String getName(){ return name; } } class Cat extends Animal { private String eyesColor; Cat(String n, String c){ super(n); eyesColor = c; } public String enjoy() { return "猫叫唤"; } } class Dog extends Animal { private String furColor; Dog(String n, String c){ super(n); furColor = c; } public String enjoy() { return "狗叫唤"; } } class Lady { private String name; private Animal pet; Lady(String name, Animal pet) { this.name = name; this.pet = pet; } public void myPetInfo(){ System.out.println("Lady Name:"+name+" "+"PetName:"+pet.getName()+" "+"PetEnjoy:"+pet.enjoy()); } } class TestDuo { public static void main(String[] args) { Cat c = new Cat("mimi", "Blue"); Dog d = new Dog("bigYellow", "Yellow"); Lady L1 = new Lady("L1", c); Lady L2 = new Lady("L2", d); L1.myPetInfo(); L2.myPetInfo(); } }
结果打印:
Lady Name:L1 PetName:mimi PetEnjoy:猫叫唤
Lady Name:L2 PetName:bigYellow PetEnjoy:狗叫唤