Java中的多态性表现:
1,方法的重载和重写;
2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现;
先建一个父类Animals;
package m12d26;
public class Animal {
public void say(){
System.out.println("我是一个动物");
}
}
再建两个子类:
package m12d26;
public class Dog extends Animal{
public void say(){
System.out.println("我是一只狗");
}
}
package m12d26;
public class Cat extends Animal{
public void say(){
System.out.println("我是一只猫");
}
}
测试类;
package m12d26;
public class Test {
public static void main(String[] args) {
Dog d=new Dog();
d.say();
Cat c=new Cat();
c.say();
}
}
输出结果为:
我是一只狗
我是一只猫
这是一个简单的子类继承父类,实例化对象,调用方法
下面用多态测试 ,父类的引用指向子类的具体实现:
package m12d26;
public class Test {
public static void main(String[] args) {
//父类引用指向子类的具体实现
Animal a=new Dog();
a.say();
//更换实现
a=new Cat();
a.say();
}
}
输出结果为:
我是一只狗
我是一只猫
对象的转型:
向上转型:子类对象->父类对象 安全
向下转型:父类对象->子类对象 不安全
比如上面的实例:
Animal animal=new Dog();
就是后面的new Dog() 子类对象 向上 Animail animal 转型 是安全的;
向下转型 是父类对象强制转换成子类对象:我们来改下Test类:
package m12d26;
public class Test {
public static void main(String[] args) {
Animal a=new Dog();
//向下转型
Dog d=(Dog) a;
a.say();
//向下转型,此时animal指向的是a的具体实现,所以会报错
Cat c=(Cat) a;
a.say();
}
}
输出结果:
我是一只狗
Exception in thread "main" java.lang.ClassCastException: m12d26.Dog cannot be cast to m12d26.Cat
at m12d26.Test.main(Test.java:13)
结果会报错,向下转型是不安全的。
上面用的继承方式演示了多态 其实在实际开发中 更多的是用接口:
先建一个接口:
package m12d26;
public interface People {
public void say();
}
建立两个类继承接口:
package m12d26;
public class Student implements People{
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("我是一个学生");
}
}
package m12d26;
public class Teacher implements People{
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("我是一个老师");
}
}
建立测试类:
package m12d26;
public class Test1 {
public static void main(String[] args) {
People p=new Student();
p.say();
p=new Teacher();
p.say();
}
}
输出结果:
我是一个学生
我是一个老师