从头开始学java--多态

一.多态的定义

何谓多态?多态可以理解为事物存在的多种体现形态。同一种事物,在不同条件下,表现为不同的结果。

举个例子,有一只猫,还有一只狗,统称为动物。当我们面前有一只猫的时候,我们说动物,那么指的就是这只猫,如果我们面前是一只狗,那么我们说动物就指的是这只狗。

多态的定义方式:  父类  父类的引用  = new 子类。父类的引用也可以接受子类对象。

我们根据父类的引用来调用子类的方法,可以大大提高程序的扩展性。

例如:

abstract class Animal
{
	public abstract void eat();
}

class Cat extends Animal
{
	public void eat()
	{
		System.out.println("eat 猫食");
	}
}

class Dog extends Animal
{
	public void eat()
	{
		System.out.println("eat 狗食");
	}
}

public class PolymorphismTest {

	public static void main(String[] args)
	{
		Animal animal1 = new Cat();
		Animal animal2 = new Dog();
		feedAnimal(animal1);
		feedAnimal(animal2);
	}

	//静态方法,喂动物,接收Animal类型,执行子类方法
	public static void feedAnimal(Animal animal)
	{
		animal.eat();
	}

}

如果没有多态,那么喂动物的静态方法则需要根据各种动物,写各种eat方法。如果有新增的动物,那么改动会很大。而有了多态,我们只需要根据父类Animal的引用,调用各种动物的eat方法。

要点:

1.多态的体现:父类引用指向了子类的对象。可以是定义时声明,也可以接受。

2.多态的前提:(a)类之间有继承或者实现的关系 (b)存在方法的覆盖

3.提高了扩展性,但是注意用父类的引用使用父类存在的方法,子类实现。

二.多态的转型

父类类型的引用引用子类的对象,但是子类对象会有自己的一些方法和字段,如果要调用子类自己的方法,父类没有这些方法,那要怎么做呢?

答案就是父类引用强制转换为子类引用,但是对象还是子类的对象,一直没有改变。

//父类
class Parent
{
	//eat方法
	public void eat()
	{
		System.out.println("Parent eat");
	}
}

//子类,继承父类
class Son extends Parent
{
	//子类eat方法,覆写父类eat方法
	public void eat()
	{
		System.out.println("Son eat");
	}

	public void play()
	{
		System.out.println("Son play");
	}
}

//main
public class PolymorphismTest2 {
	public static void main(String[] args)
	{
		Parent parent = new Son();
		//调用eat方法
		parent.eat();
		//调用play方法,但是父类没有play方法,所以将引用向下转型为Son类型,有play方法,才可以调用
		((Son)parent).play();
	}
}

要点:

1.定义一个子类对象并用父类引用时(或者直接将子类对象赋值给父类引用时),称为向上转型,可以直接转型。

2.从父类引用转向为子类引用,称为向下转型,不能直接转型,需要用强制转换。

3.注意自始至终对象是没有转换的,转换的都是引用!!!

三.多态的特性

public class ParentChildTest {
	public static void main(String[] args) {
		Parent parent=new Parent();//100
		parent.printValue();
		Child child=new Child();//200
		child.printValue();

		parent=child;
		parent.printValue();//200

		parent.myValue++;
		parent.printValue();//200

		((Child)parent).myValue++;
		parent.printValue();//201

	}
}

class Parent{
	public int myValue=100;
	public void printValue() {
		System.out.println("Parent.printValue(),myValue="+myValue);
	}
}
class Child extends Parent{
	public int myValue=200;
	public void printValue() {
		System.out.println("Child.printValue(),myValue="+myValue);
	}
}

要点:

1.多态中父类和子类有同名变量时,看的是引用类型的变量,根据引用类型的变量判断使用子类还是父类中的变量。

2.多态中父类和子类中有同名方法时,看的是对象类型。对象是子类的,调用的是子类的方法;对象是父类的,调用的是父类的方法。

3.多态中父类和子类有相同的静态时,看到是引用类型。

时间: 2024-11-05 13:47:12

从头开始学java--多态的相关文章

从头开始学Java【1】

1:常见的DOS命令 盘符的切换 d:回车 目录的进入 cd javase cd javase\day01\code 目录的回退 cd.. cd\ 清屏 cls 退出 exit 创建目录 md 删除目录 rd 创建文件一般不做 删除文件 del 显示目录下的内容 dir 删除带内容的目录 rd /s /q 2:Java语言概述 (1)Java语言的开源,跨平台 (2) JVM:保证Java语言跨平台 JRE:Java程序的运行环境(JVM+类库) JDK:Java程序的开发环境(JRE+工具)

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需

JAVA 多态的一种实现

今天一个同事问我一个问题,就是关于子类,父类之间方法的调用这里的.这里我整理了一个小DEMO. 代码如下: 父类的代码: public abstract class ClassA { public final void execute() { System.out.println("A"); work(); } protected abstract void work(); } 这里,我个人理解,这里的execute()方法,好像用了设计模式中的命令模式. 子类代码: public c

【软帝学院】零基础学Java,必须搞懂的10个问题!

零基础学Java,必须搞懂的10个问题! Java是当前互联网行业内的热门语言,不仅可以应用于Android和网站开发而且也广泛应用于金融服务.高频金融空间等领域.也正是因为高居不下的热度,越来越多的人选择学习Java语言.那么零基础学习Java都需要搞懂那些问题呢? 1.Java语言的特点,Java与c++的区别 Java语言具有简单易学.安全性.可靠性.支持多线编程.编译和解释共存.与平台无关性等特点.Java与c++都是面向对象的语言.两者的区别是,C++的类支持多重继承,而Java的类是

零基础学Java,必须搞懂的10个问题!

零基础学Java,必须搞懂的10个问题!Java是当前互联网行业内的热门语言,不仅可以应用于Android和网站开发而且也广泛应用于金融服务.高频金融空间等领域.也正是因为高居不下的热度,越来越多的人选择学习Java语言.那么零基础学习Java都需要搞懂那些问题呢?1.Java语言的特点,Java与c++的区别Java语言具有简单易学.安全性.可靠性.支持多线编程.编译和解释共存.与平台无关性等特点.Java与c++都是面向对象的语言.两者的区别是,C++的类支持多重继承,而Java的类是单继承

【经验分享】新手学Java编程语言怎么入门?

新手学Java编程语言怎么入门?掌握语言基础是第一步,了解java基础知识,Java关键字.核心概念或者基本编码技术.掌握操作符.控制执行流程.访问权限控制.复用类.多态.接口.字符串.泛型.数组.容器深入研究.JavaI/O系统.枚举类型.并发以及图形化用户界面等内容. 为了帮助大家更轻松的学好java开发,给大家分享一套java开发学习资料,小编推荐一个学java开发技术的学习裙:三七四三二零二八二,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干

阿甘学java视频--lesson5

 视频信息: 时长:56分钟34秒 作者:于盼盼 内容:java API的详细使用方法,java中常用的包:java.lang,java.awt,java.applet,java.net,java.io,java.util等. 视频地址:点击打开阿甘学java视频--lesson5 如果你想在学习java开发技术上少走弯路,欢迎一起加入我的课堂,这里有更多的java技术爱好者与你一起交流,一起成长. 于盼盼简介:专注Java软件开发.软件培训行业.2006年从事java软件开发工作,历任武汉

学java教程之普通方法重载

学编程吧学java教程之普通方法重载发布了,欢迎通过xuebiancheng8.com来访问 先来看什么是普通方法重载呢,先来看一个例子 public class Person{ String username; int age; public void hello(){ System.out.println("Hello"); } public void hello(String username){ System.out.println("你好"+usernam

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Rhythmk 一步一步学 JAVA (20) JAVA enum常用方法

JAVA 枚举定义常用方法: 1.static Enum valueOf(Class enum,String name) 返回指定name的枚举类型 2.Static Enum values[] 返回枚举常量集合 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50