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();
}
}

运行输出:

我是学生

我是老师

Java面向对象-对象的多态性的更多相关文章

  1. java面向对象---对象容器

    泛型类--ArrayList<>; 2.对象数组中的每个元素都是对象的管理者而并非对象本身!!!!! 3.java类的基本数据类型 基本数据类型 包装类 byte Byte short S ...

  2. java面向对象---对象初始化

    在本地变量中,如果定义了一个变量后没有赋值就使用,那么eclipse就会报错:但是在成员变量中,java是会强制给一个没有初始化的变量一个默认的初始值0, 如果是一个boolean类型的变量,那么默认 ...

  3. JAVA面向对象

    JAVA面向对象 对象   我们生活中能看到能摸到的一切事物都是对象.在程序中模拟出生活中的所有东西万物皆对象   只要是对象--属性和行为(方法)   属性   对象有什么   例如:学生有姓名.学 ...

  4. Java面向对象设计主要有三大特征:封装性、继承性和多态性

    Java面向对象设计主要有三大特征:封装性.继承性和多态性 一  封装性   1.1  概念:它是将类的一些敏感信息隐藏在类的类部,不让外界直接访问到,但是可以通过getter/setter方法间接访 ...

  5. 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等

    今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...

  6. Java——面向对象的特征三:多态性

    2.5面向对象的特征三:多态性 2.5.1 关于java语言中的向上转型和向下转型 ①向上转型(upcasting) :  子--->父(自动类型转换) ②向下转型(downcasting) : ...

  7. 如何讲清楚 Java 面向对象的问题与知识?(类与对象,封装,继承,多态,接口,内部类...)

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  8. Java对象的多态性(转型)

    多态性在面向对象中主要有两种体现: <1>方法的重载与覆写 <2>对象的多态性 对象的多态性:向上转型:子类对象-->父类对象,向上转型会自动完成 向下转型:父类对象-- ...

  9. Java面向对象 其他对象

     Java面向对象  其他对象 知识概要:             (1)可变参数 (2)静态导入 (3)System (4)Runtime (5)Date  Calendar (6)Math 本 ...

随机推荐

  1. xcrun: error: active developer path (/Users/XJW/Desktop/Xcode.app/Contents/Developer) does not exist, use `xcode-select --switch path/to/Xcode.app` to

    问题: 装了双xcode     删掉低版本  (注意:低版本xcode 开启过项目 )  创建git时报错 解决方法: sudo xcode-select -switch /Applications ...

  2. Python globals() locals() vars() 三个内建函数的区别

    首先参考官方文档对这三个函数的介绍: 2. Built-in Functions – Python3.5 1.globals() 返回当前全局符号表, 通常是返回当前模块下的全局符号表, 比如全局内建 ...

  3. CC国内厂商现状

    (1)阿里云的产品 CC攻击 攻击者攻击服务器的认证页面.登录页面.游戏论坛等.还是用饭馆的例子,CC攻击相当于,坏人霸占收银台结账.霸占服务员点菜,导致正常的客人无法享受到服务. 游戏盾如何防御CC ...

  4. python基础之字符编码(一)

    一.什么是字符编码 计算机要想工作必须通电,也就是说‘电’驱使计算机干活,而‘电’的特性,就是高低电压(高低压即二进制数1,低电压即二进制数0),也就是说计算机只认识数字 编程的目的是让计算机干活,而 ...

  5. MySQL学习笔记2018-02-07更新

    前言:本人wechat:YWNlODAyMzU5MTEzMTQ=. 如果内容有错,请指出来. win10下安装 https://dev.mysql.com/downloads/mysql/下载并解压m ...

  6. Linux命令2018-03-01更新

    前言:Linux主要应用于服务器端,嵌入式开发和个人pc桌面端 本人wechat:YWNlODAyMzU5MTEzMTQ=. *** GPL GPL是一个开源许可协议,由自由软件基金会创建的.GPL许 ...

  7. NHibernate的几种查询方式

    SQL:普通SQL查询(也就是SQLServer,Oracle,Sybase等数据库的查询语句,建议使用基于TSQL-92) 核心对象:CreateSQLQuery IList list = sess ...

  8. “一键”知道自己的IP地址和网络供应商

    打开浏览器,然后在地址栏里面输入“www.baidu.com” 进入百度主页以后,在搜索框内输入 “ip”,然后回车就可以了

  9. spring import jar中的bean配置文件

    在spring中import resource file,有两种情况:classes目录和jar包 如果资源文件在classes目录: <import resource="classp ...

  10. 西交利物浦大学Java PAPER CODE: CSE105/12-13/S1/Resit Coursework

    Question 6:What is an accessor method?What is a mutator method? 答案参考:http://www.xmsydw.com Number An ...