Java面向对象-对象的多态性

Java中的多态性表现:

1,方法的重载和重写(覆盖);

2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现;

我们先搞个父类Animal:

 package com.java1234.chap03.sec13;

 public class Animal {

     public void say(){
System.out.println("我是一个动物");
}
}

再搞两个子类,分别是Dog和Cat类,重写父类方法say:

 package com.java1234.chap03.sec13;

 public class Cat extends Animal{

     public void say(){
System.out.println("我是一个猫");
}
}
 package com.java1234.chap03.sec13;

 public class Dog extends Animal{

     public void say(){
System.out.println("我是一个狗");
}
}

然后我们写个Test测试类:

 package com.java1234.chap03.sec13;

 public class Test {

     public static void main(String[] args) {
Dog dog=new Dog();
dog.say(); Cat cat=new Cat();
cat.say();
}
}

运行输出:

我是一个狗

我是一个猫

这个大家肯定能看明白 简单的子类继承 以及实例化对象 调用方法 ;

下面我来用多态测试,父类引用指向子类具体实现:

 package com.java1234.chap03.sec13;

 public class Test {

     public static void main(String[] args) {
// 父类引用指向Dog子类的具体实现
Animal animal=new Dog();
animal.say(); // 更换实现
animal=new Cat();
animal.say();
}
}

运行输出:

我是一个狗

我是一个猫

对象的转型:

向上转型:子类对象->父类对象 安全

向下转型:父类对象->子类对象 不安全

 

比如上面的实例:Animal animal=new Dog(); 就是后面的new Dog() 子类对象 向上  Animail animal 转型  是安全的;

向下转型 是父类对象强制转换成子类对象:我们来改下Test类:

 package com.java1234.chap03.sec13;

 public class Test {

     public static void main(String[] args) {
// 父类引用指向Dog子类的具体实现
Animal animal=new Dog();
animal.say(); // 向下转型
Dog dog=(Dog) animal;
dog.say(); // 向下转型 因为animal指向的是Dog具体实现 所以会报错
Cat cat=(Cat)animal;
cat.say();
}
}

运行报错:

我是一个狗

我是一个狗

Exception in thread "main" java.lang.ClassCastException: com.java1234.chap03.sec13.Dog cannot be cast to com.java1234.chap03.sec13.Cat

at com.java1234.chap03.sec13.Test.main(Test.java:15)

转换异常 所以说向下转型是不安全的,我们必须知道具体的实现类;

我们上面用的继承方式演示了多态 其实在实际开发中 更多的是用接口:

我们再写一个实例:

我们先建一个父类接口People:

 package com.java1234.chap03.sec13;

 public interface People {

     public void say();
}

接下来写两个具体实现类,Student Teacher:

 package com.java1234.chap03.sec13;

 public class Student implements People{

     @Override
public void say() {
System.out.println("我是学生");
} }
 package com.java1234.chap03.sec13;

 public class Teacher implements People{

     @Override
public void say() {
System.out.println("我是老师");
} }

我们来写一个测试类:

 package com.java1234.chap03.sec13;

 public class Test2 {

     public static void main(String[] args) {
People p1=new Student();
p1.say(); p1=new Teacher();
p1.say();
}
}

运行输出:

我是学生

我是老师

最新文章

  1. MySQL学习笔记二:权限管理
  2. jQuery设置聚焦并使光标位置在文字最后
  3. Java集合类学习笔记(List集合)
  4. 渣渣小本求职复习之路每天一博客系列——Java基础(9)
  5. c# 集合及特殊集合
  6. LeetCode-95. Unique Binary Search Trees II
  7. linux下查找某个目录下包含某个字符串的文件
  8. MongoDB分片集群还原
  9. c#操作Zip压缩文件
  10. ruby函数回调的实现方法
  11. JavaEE Tutorials (27) - Java EE的并发工具
  12. Java面向对象总复习-QuickHit
  13. (二)Hololens Unity 开发之 语音识别
  14. Apache solr(二)
  15. ROS使用FLIR品牌的相机
  16. 配置数据库方言——hibernate
  17. javaweb之Cookie学习
  18. std::bind学习
  19. python3安装PIL提示Could not find a version that satisfies the requirement pil
  20. 轮播图采用js、jquery实现无缝滚动和非无缝滚动的四种案例实现,兼容ie低版本浏览器

热门文章

  1. WinForm 创建与读写配置文件
  2. Node.js 问题集合
  3. redux源码阅读之compose,applyMiddleware
  4. 安装nodejs+npm的体验
  5. cannot be read or is not a valid ZIP file
  6. linux 6 网卡名称修改
  7. Android 如何快速生成aar?
  8. 作为一名Java开发工程师需要掌握的专业技能
  9. 正则,re模块
  10. 在linux中使用shell来分析统计日志中的信息