Java之理解多态详解

目录
  • 一、多态的概念
  • 二、多态的特点
  • 三、instanceof操作符
  • 四、多态的转型
    • 1、向上转型
    • 2、向下转型
  • 五、方法重写
  • 六、小结

一、多态的概念

       继承关系使一个子类能继承父类的特征,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立。例如:每个圆都是一个几何对象,但并非每个几何对象都是圆。因此,总可以将子类的实例传给需要父类型的参数。参考案例如下:

public class PolymorphismDemo{
/** Main method */
public static void main(String[] args){
  displayObject(new Circle(1,"red",false));
  displayObject(new Rectangle(1,1,"black",true));
}

public static void displayObject(GeometriicObject object){
  System.out.println("Created on "+ object.getDateCreated()+".Color is"+object.getColor());
}
}

Created on Mon Mar 09 19:25:20 EDT 2011.Color is red

Created on Mon Mar 09 19:25:20 EDT 2011.Color is black

       方法displayObject具有GeometriicObject类型的参数。可以通过传递任何一个GeometriicObject的实例来调用displayObject。使用父类对象的地方都可以使用子类的对象。这就是通常说的多态。简单来说,多态意味着父类型的变量可以引用子类型的对象

二、多态的特点

 多态的前提:继承(即必须有子父类关系。)在使用多态后的父类引用变量调用方法时,会   调用子类重写后的方法。 定义格式:父类类型 变量名=new 子类类型();                                                                       父类引用指向子类对象,如:Animal a = new Cat(); 多态中,编译看左边,运行看右边

三、instanceof操作符

       instanceof是Java的关键字。Java关键字中的每个字母都是小写的。

       为了更好地理解类型转换,可以认为它们类似于动物、北极熊、熊猫之间的关系,其中动物类Animal是北极熊类Polar bear和熊猫类Panda类的父类。北极熊是动物,所以,总是可以将 Polar bear的实例安全地赋值给Animal变量。该关键字用法是判断某个对象是否属于某种数据类型,返回值为布尔类型。


        Fu Zz=new Xu();
        Fu Zzz=new yiting();
        if(f1 instanceof Xu){
            System.out.println("Zz是Xu的类型");
        }
        else{
            System.out.println("Zzz是yiting的类型");
        }

四、多态的转型

1、向上转型

       总是可以将一个子类的实例转换为一个父类的变量,称为向上转换,因为子类的实例总是它的父类的实例。

作用:

减少一些重复的代码对象实例化的时候可以根据不同需求实例化不同的对象

package project2;
	class Animal{
		int num=100;
		void say(){
			System.out.println("It's an Animal.");
		}
	}

	class Cat extends Animal{
		int num=50;
		void say(){
			System.out.println("It's a Cat.");
		}
		void bark(){
			System.out.println("喵喵喵!");
		}
	}

	public class project2{
		public static void main(String[] args) {
			Animal cat=new Cat();//向上转型
			System.out.println(cat.num);
			cat.say();
//			cat.bark();
		}
	}

运行结果:

100
It's a Cat.

向上转型不要强制转型,父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定。向上转型后父类引用不能调用子类自己的方法。

2、向下转型

       把一个父类的实例转换为它的子类变量。必须使用转换标记(子类名)进行显示转换,向编译器表明你的意图。为使转换成功,必须确保要转换的对象是子类的一个实例。

作用:

        向上转型时 ,会遗失子类对象独有的其他方法;可以通过向下转型再重新转回。

package project2;
class Animal{
	int num=100;
	void say(){
		System.out.println("It's an Animal.");
	}
}

class Cat extends Animal{
	int num=50;
	void say(){
		System.out.println("It's a Cat.");
	}
	void bark(){
		System.out.println("喵喵喵!");
	}
}

public class project2{
	public static void main(String[] args) {
		Animal cat=new Cat();//向上转型
		Cat cat2=(Cat) cat;//向下转型
		System.out.println(cat2.num);
		cat2.say();
		cat2.bark();
	}
}

运行结果:

50
It's a Cat.
喵喵喵!

五、方法重写

提示:要重写一个方法,需要在子类中使用和父类一样的签名来对该方法进行定义。

子类从父类中继承方法。有时,子类需要修改父类中定义的方法的实现,这称为方法重写。

以下几点值得注意:

重写的方法必须与被重写的方法具有一样的签名,以及一样或者兼容的返回类型。兼容的含义是重写方法的返回类型可以是被重写方法的返回类型的子类型。仅当实例方法可访问时,它才能被重写。如果子类中定义的方法在父类中是私有的,那么这两个方法完全没有关系。与实例方法一样,静态方法也能被继承。但是,静态方法不能被重写。如果父类定义的静态方法在子类中被重新定义,那么在父类中定义的静态方法将被隐藏。可以使用语法“父类名.静态方法名”调用隐藏的静态方法。防止继承和重写

       一个被final修饰的类和方法都不能被继承。被final修饰的数据域是一个常数。

       有时候,可能希望防止类被继承。在这种情况下,使用final修饰符表明一个类是最终类,是不能作为父类的。Math类就是一个最终类。String、StringBuilder和StringBuffer类以及所有基本数据类型的包装类也都是最终类。例如,如下类A 就是最终类,不能被继承:

public final class A{
  //Data fields,constructors, and methods omitted
}

       也可以定义一个方法为最终,最终方法不能被它的子类重写。例如如下,不能被重写:

public class Test {
  //Data fields,constructors, and methods omitted

  public final void m() {
    // Do something
 }
}

注:修饰符public、protected、private、static、abstract以及final可以用在类和类的成员上,只有final修饰符还可以用在方法中的局部变量上。方法内的final局部变量就是常量。

六、小结

为了重写一个方法,必须使用与它的父类中的方法一样的签名、一样或者兼容的返回类型来定义子类中的方法。实例方法只有在可访问时才能重写。这样,私有方法是不能重写的,因为它是不能在类本身之外访问的。如果子类中定义的方法在父类中是私有的,那么这两个方法是完全没有关系的噢!静态方法与实例方法一样可以继承。但是,静态方法不能重写,如果父类中定义的静态方法在子类中重新定义,那么父类中定义的方法被隐藏。可以使用表达式obj instanceof AClass 测试一个对象是否是一个类的实例。可以使用final修饰符来表明一个类是最终类,是不能被继承的;也可以表明一个方法是最终的,是不能被重写的。

到此这篇关于Java之理解多态详解的文章就介绍到这了,更多相关Java多态内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java 对象实例化过程中的多态特性解析

    目录 java 对象实例化过程中的多态特性 通过案例说明 通过上述代码 java对象的三个特性(封装.继承.多态) 1.封装 2.继承 3.多态 java 对象实例化过程中的多态特性 执行对象实例化过程中遵循多态特性 ==> 调用的方法都是实例化的子类中的重写方法,只有明确调用了super.xxx关键词或者是子类中没有该方法时,才会去调用父类相同的同名方法. 通过案例说明 package com.njau.test1; class Test { public static void main(S

  • Java编程 多态

    目录 一.向上转型 二.转机 1.绑定 2.扩展性 3.缺陷 三.构造器与多态 1.构造器的调用顺序 2.构造器内部的多态方法的行为 四.协变返回类型 五.继承进行设计 前言: 封装,是合并属性和行为创建一种新的数据类型,继承是建立数据类型之间的某种关系(is-a),而多态就是这种关系在实际场景的运用. 多态就是把做什么和怎么做分开了:其中,做什么是指调用的哪个方法[play 乐器],怎么做是指实现方案[使用A乐器 使用B乐器],''分开了''指两件事不在同一时间确定. 一.向上转型 对象既可以

  • java多态注意项小结

    展示多态现象 package test; //父类引用,指向(不同子类)的实例,对同一个实例方法名调用,调用的程序不 //一样.继承是多态得以实现的基础. public interface test1 { void shout(); } package test; public class test2 implements test1 { public void shout() { System.out.println("1111"); } } package test; public

  • Java 多态中继承的转型详解与用法分析

    目录 一.前言 二.转型 向上转型 向下转型 三.instanceof运算符 instanceof的用处 instanceof的使用格式: 一.前言 前面我们学习了多态的概述和使用,现在我们来学习前面剩下的转型问题. 二.转型

  • Java之理解多态详解

    目录 一.多态的概念 二.多态的特点 三.instanceof操作符 四.多态的转型 1.向上转型 2.向下转型 五.方法重写 六.小结 一.多态的概念        继承关系使一个子类能继承父类的特征,并且附加一些新特征.子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立.例如:每个圆都是一个几何对象,但并非每个几何对象都是圆.因此,总可以将子类的实例传给需要父类型的参数.参考案例如下: public class PolymorphismDemo{ /** Main me

  • Java OOP三大特征之封装继承与多态详解

    目录 封装 继承 多态 OOP语言的三大特征即:面向对象的三个比较重要的思想 封装 官话:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口进行交互 通俗讲,不让类外看到实现的细节,通过技术手段对这些细节包装一个外壳,同时提供几个公开的接口,让你进行交互即可(例如:手机,内部的具体零件,不会让你观察到,使用者只能看到外壳,通过外壳的显示屏,充电口进行交互)简而言之——套壳屏蔽细节 实际上通过private来实现 例如: 继承 面向对象的思想中提出了继承的概念,专门用来进

  • C++/java 继承类的多态详解及实例代码

    C++/java 继承类的多态详解 学过C++和Java的人都知道,他们二者由于都可以进行面向对象编程,而面向对象编程的三大特性就是封装.继承.多态,所有今天我们就来简单了解一下C++和Java在多态这方面的不同. 首先我们各看一个案例. C++ //测试继承与多态 class Animal { public: char name[128]; char behavior[128]; void outPut() { cout << "Animal" << endl

  • Java中接口的多态详解

    目录 多态参数 多态数组 接口的多态传递现象 总结 多态参数 就像我们现实生活中电脑的usb接口,我们既可以接受手机对象,又可以接受相机对象,等等,体现了接口的多态,查看以下代码 接口: package InterfaceM; public interface Interface { public void join(); public void stop(); } 手机类: package InterfaceM; public class Phone implements Interface{

  • Java 封装的使用详解

    目录 1. 基本介绍 2. 封装介绍 3. 封装的理解和好处 4. 封装的实现步骤 (三步) 5. 快速入门案例 6. 将构造器和 setXxx 结合 7. 练习 1. 基本介绍 面向对象编程有三大特征:封装.继承和多态. 2. 封装介绍 3. 封装的理解和好处 4. 封装的实现步骤 (三步) 5. 快速入门案例 package com.xdr630.encap; public class Encapsulation01 { public static void main(String[] ar

  • java回调机制实例详解

    java回调机制实例详解 以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback--背景1 class A中包含一个class B的引用b --背景2 clas

  • Java中的HashSet详解和使用示例_动力节点Java学院整理

    第1部分 HashSet介绍 HashSet 简介 HashSet 是一个没有重复元素的集合. 它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素. HashSet是非同步的.如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步.这通常是通过对自然封装该 set 的对象执行同步操作来完成的.如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来"包装" set.

  • Java绘图技术的详解及实例

    Java绘图技术的详解及实例 简单实例 public class Demo1 extends JFrame{ MyPanel mp=null; public static void main(String[] args){ Demo1 demo=new Demo1(); } public Demo1(){ mp=new MyPanel(); this.add(mp); this.setSize(400,300); this.setDefaultCloseOperation(JFrame.EXIT

  • java 内部类的实例详解

    java 内部类的实例详解 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. public class OuterClass { private String name ; private int age; public String getName() { return name; } p

  • Java中final关键字详解

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. 主要介绍:一.final关键字的基本用法.二.深入理解final关键字 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能

随机推荐