`
msn877763580
  • 浏览: 83786 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java与多态

阅读更多

多态:所谓多态,就是父类型的引用可以指向子类型的对象,或者接口类型的引用可以指向实现该接口的类的实例。关于接口与实现的类之间强制类型转换方式与父和子之间的强完全一样。

代码:源于张龙老师的视频

关于多态学习的代码:

 Animal.java

package cn.sisy.polymorphism;

public class Animal {
	public void sing(){
		System.out.println("Animal is singing");
	}
	public String name = "小动物";
}

 Cat.java

package cn.sisy.polymorphism;

public class Cat extends Animal{
	public void sing(){
		System.out.println("Cat is singing");
	}

}

 PolyTest02:主要说明向上类型转换和向下类型转换,向上转型不需显示指定,向下转型必须强制转换。

package cn.sisy.polymorphism;

public class PolyTest02 {
	public static void main(String[] args) {
		//向上类型转换---子类转换为父类
		Cat cat = new Cat();
		Animal animal = cat;
		cat.sing();
		//向下类型转换---父类转换为子类
		//必须使用强制类型转换
		Animal a = new Cat();
		Cat c1 = (Cat) a;
		c1.sing();
		//以下的转换可以吗?
		// cn.sisy.base.Animal cannot be cast to cn.sisy.base.Cat
		Animal b = new Animal();
		Cat c2 = (Cat)b;
	}
}

程序运行结果 :

Cat is singing
Cat is singing
Exception in thread "main" java.lang.ClassCastException: cn.sisy.polymorphism.Animal cannot be cast to cn.sisy.polymorphism.Cat
    at cn.sisy.polymorphism.PolyTest02.main(PolyTest02.java:17)

------------------------------------------------------------------------------

下面我们为Cat方法增加一些自己的方法和属性

Cat.java

package cn.sisy.polymorphism;

public class Cat extends Animal{
	public void sing(){
		System.out.println("Cat is singing");
	}
	public void voice(){
		System.out.println("喵喵~~");
	}
	public String name = "小花猫";
}

 PolyTest03.java

package cn.sisy.polymorphism;

public class PolyTest03 {
	public static void main(String[] args) {
		Animal animal = new Cat();
		//以下的语句编译不能通过,因为Animal类中并没有定义voice方法
		//animal.voice();
		System.out.println(animal.name);
		
		//为了调用子类特有的方法,有时候需要进行强制类型转换
		Cat cat = (Cat)animal;
		cat.voice();
		System.out.println(cat.name);
	}
}

 程序的运行结果:

小动物
喵喵~~
小花猫

以上的结果没有体现出属性的多态;为了调用子类特有的方法,需要进行强制类型转换

-------------------------------------------------------------------------

PolyTest4.java 这个例子为了说明多态是一种运行时的行为

package cn.sisy.polymorphism;

/*
 * 此类为了说明Java的多态是一种运行时的行为
 * 因为运行之前a根本不知道将会指向哪种引用,
 * 这种情况也称为dynamically bound
 */
public class PolyTest4{
	public static void main(String[] args){
		A a = null;

		if(args[0].equals("1")){
			a = new B();	
		}
		else if(args[0].equals("2")){
			a = new C();
		}
		else if(args[0].equals("3")){
			a = new D();
		}

		a.method();
	}
}

class A{
	public void method(){
		System.out.println("A");
	}
}

class B extends A{
	public void method(){
		System.out.println("B");
	}
}

class C extends A{
	public void method(){
		System.out.println("C");
	}
}

class D extends A{
	public void method(){
		System.out.println("D");
	}
}

 用 java PolyTest4 2执行程序时将会输出:

 C

----------------------------------------------------------------------------------

以下的程序说明了多态在实际开发中应该如何应用:

class Car{
	public void run(){
		System.out.println("car is running");
	}
}

class BMW extends Car{
	public void run(){
		System.out.println("BMW is running");
	}
}

class QQ extends Car{
	public void run(){
		System.out.println("QQ is running");
	}
}
 
public class PolyTest5{
	
	public void run(BMW bmw)
	{
		bmw.run();
	}

	public void run(QQ qq)
	{
		qq.run();
	}
	
	public static void main(String[] args){
		
		PolyTest5 test = new PolyTest5();

		BMW bmw = new BMW();

		test.run(bmw);

		QQ qq = new QQ();

		test.run(qq);
		

	}
}

 通过以上的程序我们会发现,如何我们把实际存在的车型都写出来,那么PolyTest5.java这个程序将会十分拥挤,那我们是不是可以用已经学到的多态的知识加以改进呢?请看下面的程序。

public class PolyTest5{

	public void run(Car car){
		car.run();
	}

	public static void main(String[] args){
		
		PolyTest5 test = new PolyTest5();

		Car car = new BMW();

		test.run(car);
		
		QQ qq = new QQ();

		test.run(qq);//此处应用了自动向上转型,所以子类对象都是父类对象

	}
}

 上面的程序是不是改进很多呢。。。只需一个方法。。。。

分享到:
评论

相关推荐

    北大青鸟javaOOP多态Ch03作业全集.rar

    "北大青鸟javaOOP多态Ch03作业全集.rar"这个压缩包文件很显然是针对学习者提供的一系列关于Java多态性的练习和案例,帮助学生深入理解并掌握这一核心技能。 多态性是面向对象三大特性之一,另外两个是封装和继承。...

    java中多态的内存分析

    3. **本地方法栈**:与虚拟机栈类似,但它是为执行Java Native Interface (JNI) 方法而设计的。 4. **堆**:所有类实例和数组都在堆中创建。由于堆是所有线程共享的,所以对象的分配和垃圾回收都在这里进行。 5. *...

    java多态练习题

    java多态、继承练习题,包含题目与答案,............................................................................................................

    Java多态的讲解

    Java多态的讲解

    java中多态实现

    java多态实现的课件,给那些需要的人 讲述了java多态的概念、分类、实现 综合案例讲解、总结多态的作用

    对java中多态理解

    对 Java 中多态理解 Java 中的多态是指在不同的情况下可以有不同的行为,多态是面向对象编程的一种基本特征。多态的实现是通过方法重载和方法重写来实现的。 在 Java 中,多态可以分为两种:编译时多态和运行时...

    java多态的总结

    在Java中,多态分为编译时多态和运行时多态。编译时多态主要体现在方法的重载(Overloading),即在同一个类中可以有多个同名方法,但参数列表不同。编译器会根据传入参数的类型和数量来决定调用哪个方法。运行时...

    深入Java核心 Java中多态的实现机制编程资料

    ### 深入Java核心:Java中多态的实现机制 多态性是面向对象编程中的一个重要概念,它使得程序代码具有高度的灵活性和可扩展性。本文将围绕Java中的多态实现机制展开讨论,包括多态的基本概念、实现原理以及具体的...

    10-JAVA-多态

    JAVA多态思维导图,便捷整理思路,多态的好处、多态的语法格式、多态中的两种类型转换:向上转型、向下转型

    java 多态 经典讲解

    ### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...

    java继承与多态

    ### Java继承与多态知识点详解 #### 一、引言 在面向对象编程语言中,继承和多态是非常重要的概念。它们提供了强大的机制来管理代码的复杂性,并且能够有效地复用现有代码。本文将详细介绍Java中的继承和多态概念...

    Java基础多态PPT教学课件.pptx

    Java基础多态PPT教学课件.pptx

    Java的多态.md

    Java的多态是学习Java的第一个重点,也是一个难点。在学习Java多态之前, 要学好封装和继承,封装和继承是理解多态的一个过程。在表现多态时,同 时也体现了封装和继承。

    java的多态扩展性

    java教学视频,讲解了多态的扩展性、转型、成员特点、主板实例、object类等

    Java 语言程序设计:第5章接口多态.ppt

    Java 语言程序设计第 5 章接口多态 本章主要讲解 Java 语言程序设计中接口和多态的概念、语法和应用。接口是 Java 语言中的一种抽象机制,它提供了一种定义类之间的“协议”的方式,允许类之间实现多继承,同时免除...

    java继承和多态ppt

    java 继承和多态PPT教程

    Java中多态的具体应用代码

    此外,Java的接口也是实现多态的一种方式。接口是一种完全抽象的类型,它只包含抽象方法和常量。一个类可以实现多个接口,从而获得多重身份,进一步增强多态性。例如,我们可以定义一个`Runnable`接口: ```java ...

    java基础-java多态详解

    Java 多态详解 Java 多态是 Java 编程语言中的一种基本概念,它允许开发者定义一个接口,并且可以通过不同的类来实现该接口。多态性是 Java 面向对象编程的核心机制之一,它使得程序更加灵活、可维护和可扩展。 ...

    java 多态.docx

    - **消除类型之间的耦合关系**:多态使得类与类之间解耦,降低了模块间的依赖。 - **可替换性**:子类对象可以在任何需要父类对象的地方使用,提高了代码的灵活性。 - **可扩充性**:增加新的子类不会影响到现有代码...

    Java 继承 多态方面的实例源码.rar

    Java 继承 多态方面的实例源码,内容方面涉及对象类Object和它的toString()方法、多态性、动态绑定和一般程序设计、数组线性表ArrayList类、final类、方法和变量、数据域和静态方法的隐藏等。。。

Global site tag (gtag.js) - Google Analytics