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

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

Java中的多态性表现:

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

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

我们先搞个父类Animal:

1 package com.java1234.chap03.sec13;
2
3 public class Animal {
4
5     public void say(){
6         System.out.println("我是一个动物");
7     }
8 }

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

1 package com.java1234.chap03.sec13;
2
3 public class Cat extends Animal{
4
5     public void say(){
6         System.out.println("我是一个猫");
7     }
8 }
1 package com.java1234.chap03.sec13;
2
3 public class Dog extends Animal{
4
5     public void say(){
6         System.out.println("我是一个狗");
7     }
8 }

然后我们写个Test测试类:

 1 package com.java1234.chap03.sec13;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6         Dog dog=new Dog();
 7         dog.say();
 8
 9         Cat cat=new Cat();
10         cat.say();
11     }
12 }

运行输出:

我是一个狗

我是一个猫

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

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

 1 package com.java1234.chap03.sec13;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6         // 父类引用指向Dog子类的具体实现
 7         Animal animal=new Dog();
 8         animal.say();
 9
10         // 更换实现
11         animal=new Cat();
12         animal.say();
13     }
14 }

运行输出:

我是一个狗

我是一个猫

对象的转型:

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

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

 

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

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

 1 package com.java1234.chap03.sec13;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6         // 父类引用指向Dog子类的具体实现
 7         Animal animal=new Dog();
 8         animal.say();
 9
10         // 向下转型
11         Dog dog=(Dog) animal;
12         dog.say();
13
14         // 向下转型  因为animal指向的是Dog具体实现 所以会报错
15         Cat cat=(Cat)animal;
16         cat.say();
17     }
18 }

运行报错:

我是一个狗

我是一个狗

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:

1 package com.java1234.chap03.sec13;
2
3 public interface People {
4
5     public void say();
6 }

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

 1 package com.java1234.chap03.sec13;
 2
 3 public class Student implements People{
 4
 5     @Override
 6     public void say() {
 7         System.out.println("我是学生");
 8     }
 9
10 }
 1 package com.java1234.chap03.sec13;
 2
 3 public class Teacher implements People{
 4
 5     @Override
 6     public void say() {
 7         System.out.println("我是老师");
 8     }
 9
10 }

我们来写一个测试类:

 1 package com.java1234.chap03.sec13;
 2
 3 public class Test2 {
 4
 5     public static void main(String[] args) {
 6         People p1=new Student();
 7         p1.say();
 8
 9         p1=new Teacher();
10         p1.say();
11     }
12 }

运行输出:

我是学生

我是老师

时间: 2024-12-09 00:52:31

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

Java面向对象-对象和类概述

java语言提供了定义类.成员变量.方法等基本功能. 类可以认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类来定义的变量都是引用变量,它们都会引用到类的对象. java面向对象的三大特征:封装.继承.多态. 封装:提供了private.protected和public三个访问修饰符来实现 继承:extends关键字让子类继承父类 多态:父类引用指向子类对象,使用继承关系来实现复用时,子类对象可以直接赋给父类变量,这个变量具有多态性,编程更加灵活.(百度搜:花木兰替父从军引例) 类和对

JAVA面向对象 对象/引用

本页面更新日期: 2016年07月17日 对象/引用 在前面 PersonTest.java 代码中, 有这样一行代码: Person p = new Person(); 这行代码创建了一个 Person 实例, 也被称为 Person对象,这个Person对象被赋给 p 变量. 这行代码实际产生了两个东西: 一个是 p 变量, 一个是 Person 对象. 从 Person 类定义来看, Person 对象应包含两个实例变量, 而变量时需要内存来存储的. 因此, 当创建 Person 对象时,

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

泛型类--ArrayList<>; 2.对象数组中的每个元素都是对象的管理者而并非对象本身!!!!! 3.java类的基本数据类型 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean 4.for-each循环在对象数组中的应用 在基本类型的数组中,比如 int[],使用for-each 循环可以遍历数组中的值,但是不能对数组

java 第十一天 面向对象(高级篇之接口、对象的多态性,instanceof)

接口的基本概念:接口的访问权限是public,关键字interface,子类通过implements关键字实现接口.一个子类可以同时实现多个接口. 对象的多态性: 两种体现形式:(1)方法的重载与覆写.(2)对象的多态性. 对象的多态性分两种: (1)向上转型:子类对象--→父类对象 (2)向下转型:父类对象--→子类对象 java中可以使用instanceof关键字判断对象到底是哪个类的实例 java 第十一天 面向对象(高级篇之接口.对象的多态性,instanceof),码迷,mamicod

面向对象高级——接口的基本概念和对象的多态性

接口 需要掌握接口的定义格式及使用 掌握接口与抽象类的关系 具体内容: 接口是Java中最重要的概念,接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成. 如果一个类中完全是由全局常量(static final声明)和抽象方法组成,就可以将其定义成一个接口. 接口的定义格式: interface 接口名称{    全局常量:    抽象方法: }   interface A{ // 定义接口A public static final String AUTHOR = "刘勋&q

Java对象的多态性

多态性在面向对象中主要有两种体现: <1>方法的重载与覆写 <2>对象的多态性 对象的多态性:向上转型:子类对象-->父类对象,向上转型会自动完成 向下转型:父类对象-->子类对象,向下转型时,必须明确地指明转型的子类类型 对象的向上转型 虽然使用的父类对象调用fun1方法,但是实际上调用的方法是被子类覆写过的方法,也就是说,如果对象发生了向上转型关系后,所调用的方法一定是被子类覆写过的方法. 但是父类的a无法调用b类中的fun3方法,因为这个方法只在子类中定义,而没有

Java基于对象基础 基于对象和面向对象的区别(转)

Java基于对象基础 基于对象和面向对象的区别 JavaScript设计者想把javascript语言设计成基于对象(object-based)的语言,他想把这个与面向对象(object-oriented)语言区分开来.但是实际上,可以将基于对象看作是面向对象. 原型对象和类的区别 在JavaScript中没有类这一可以使用关键字,当然保留字不算.所以它有自己对类这种封装结构的实现,这和Java,c++还是有很大区别的.但是我们还是能将原型对象(prototype object)看做是类,它们的

Java面向对象-类与对象

Java面向对象-类与对象 类与对象的关系 我们通俗的举个例子,比如人类是一种类,张三这个人就是人类的具体的一个个体,也就是java中的对象:这就是一个类与对象的关系: 类的定义 下面看实例 类的创建和使用 看下面实例 我们在com.java1234.chap03.sec01包下新建一个Person类 1 package com.java1234.chap03.sec01; 2 3 /** 4 * Person类 文件名和类名必须一致 5 * @author user 6 * 7 */ 8 pu

java面向对象编程(1)-类与对象

1.问题的提出      张老太养了两只猫猫:一只名字叫小白,今年3岁,白色.还有一只叫小花,今年100岁,花色.请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色.如果用户输入的小猫名错误,则显示张老太没有这只猫. //用前面学习过的知识写出代码如下: public class Demo107{ public static void main(String []args){ int a=49;//输入的名字49,50 int cat1age=3; //第一只猫 String