Java应用程序开发学习之多态

版权声明:本文为博主原创文章,如有需要,请注明转载地址:http://blog.csdn.net/morixinguan。若是侵权用于商业用途,请联系博主,否则将追究责任 https://blog.csdn.net/morixinguan/article/details/85052059

在Java中,使用关键字extends继承或者关键字implements实现,是Java实现多态性的前提。

一、Java多态定义的格式

父类引用指向之类对象称之为多态,多态的定义格式主要有两种。

(1)父类名称 对象名 = new 子类名称();
(2)接口名称 对象名 = new 实现类名称();

二、多态变量的使用特点

1、直接通过对象名称访问成员变量;看等号左边是谁,就优先用谁,没有则向上找,最高是Object。
2、直接通过成员方法访问成员变量;看方法属于谁,就优先用谁,没有则向上找,最高是Object。

三、多态中成员方法的使用特点

1、在多态的代码当中,成员方法的访问规则是:
    看new的是谁,就优先用谁,没有则向上找,最高是Object。
口诀:编译看左边,运行看右边。
对比一下:
成员变量:编译看左边,运行还看右边。
成员方法:编译看左边,运行看右边。

四、使用多态的好处

1、无论右边new的时候换成哪个子类对象,等号左边调用方法都不会变化,而单纯子类访问可能就会变化。

五、对象的向下转型

对象的向上转型格式:
格式:父类名称 对象名 = new 子类名称();

对象一旦向上转型为父类,那么就无法调用子类原本特有的内容(弊端)
解决方法:
    用对象的向下转型[还原]。
格式:子类名称 对象名 = (子类名称)父类对象。
含义:将父类对象,[还原]成为本来的子类对象。

例如:动物、猫

Animal animal = new Cat();
Cat cat = (Cat)animal ;

注意事项:
a.必须保证对象本来创建的时候,就是猫,才能向下转型成为猫
b.如果对象创建的时候本来就不是猫,现在非要向下转型成为猫,就会报错(报类转换异常的错误)
    java.lang.ClassCastException  类转换异常

接下来举一个例子:

扫描二维码关注公众号,回复: 4625028 查看本文章

父类: 人类

子类:学生、员工

员工的属性:打印岁数(父类方法)、打印名称(父类方法)、打印员工的ID(子类特有)

学生的属性:打印岁数(父类方法)、打印名称(父类方法)、打印员工的ID(子类特有)

小明既是人类、又是学生、又是员工

小红既是人类、又是学生、又是员工

实现案例一:

Human父类:

package test_java;

public class Human {
	
	private int age ;
	private String name ;
	
	public void set_human_info(int age,String name)
	{
		this.age = age ; 
		this.name = name ;
	}
	
	public int Get_age()
	{
		return this.age ;
	}
	
	public String Get_name()
	{
		return this.name ;
	}
	
	//形态1
	public void print_human_info()
	{
		System.out.println(this.name+this.age+"岁"+","+"他是一个人类");
		System.out.println("调用了父类的human方法....");
	}
	//形态2
	public void print_person_info()
	{
		System.out.println(this.name+this.age+"岁"+","+"他是一个员工");
		System.out.println("调用了父类的person方法....");
	}
	//形态3
	public void print_student_info()
	{
		System.out.println(this.name+this.age+"岁"+","+"他是一个学生");
		System.out.println("调用了父类的stdent方法....");
	}
}

Student子类:

package test_java;

public class Student extends Human
{
	//实现子类的方法
	public void print_student_info()
	{
		//复用父类的代码
		super.print_student_info();
	}

	//Personnel特定的方法
	public void print_student_idinfo()
	{
		System.out.println("它的学号是:"+1);
		System.out.println("调用了子类的person方法....");
	}
}

Personnel子类:

package test_java;

public class Personnel extends Human
{
	//实现子类的方法
	public void print_person_info()
	{
		//复用父类的代码
		super.print_person_info();
	}
	//Personnel特定的方法
	public void print_person_idinfo()
	{
		System.out.println("它的工号是:"+2);
		System.out.println("调用了子类的person方法....");
	}
}

Main方法:

package test_java;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Human member1 = new Personnel();
		member1.set_human_info(17, "小明");
		member1.print_human_info();
		System.out.println("========================");
		member1.print_person_info();
		System.out.println("========================");
		member1.print_student_info();
		//member1想调用Personnel特定的方法获取工号,不能直接.去访问,而要向下转型。
		Personnel person = (Personnel)member1 ;
		person.print_person_idinfo();
		
		Human member2 = new Student();
		member2.set_human_info(19, "小红");
		member2.print_human_info();
		System.out.println("========================");
		member2.print_person_info();
		System.out.println("========================");
		member2.print_student_info();
		System.out.println("========================");
		//member2想调用Student特定的方法获取工号,不能直接.去访问,而要向下转型。
		Student student = (Student)member2 ;
		student.print_student_idinfo();
	}
}

运行结果:

接下来再举一个例子:

我们使用电脑,每个电脑上都有USB接口,可以使用USB的设备分别有USB鼠标、USB键盘、鼠标和键盘都有它们自己的点击和敲击方法。而使用USB鼠标和USB键盘是通过电脑提供的USB接口去实现的。

案例分析:

USB接口:包含打开设备、关闭设备

笔记本类:包含开机、关机、使用USB设备功能

鼠标类:实现USB接口,具备点击的方法

键盘类:实现USB接口,具备敲击方法

实现案例二:

USB接口类:

package Interface_test;

public interface USB {
	//打开USB设备
	public abstract void open_usb_device();
	//关闭USB设备
	public abstract void close_usb_device();
}

电脑类:

package Interface_test;

public class Computer{

	public void power_on()
	{
		System.out.println("打开电脑电源");
	}
	
	public void power_off()
	{
		System.out.println("关闭电脑电源");
	}
	//使用USB设备
	public void Use_Usb_device(USB usb)
	{
		//如果该设备是鼠标
		if(usb instanceof Mouse)
		{
			usb.open_usb_device();
			usb.close_usb_device();
		}
		//如果该类设备键盘
		else if(usb instanceof KeyBoard)
		{
			usb.open_usb_device();
			usb.open_usb_device();
		}
	}
}

USB鼠标类:

package Interface_test;

public class Mouse implements USB {

	@Override
	public void open_usb_device() {
		// TODO Auto-generated method stub
		System.out.println("打开鼠标设备");
	}

	@Override
	public void close_usb_device() {
		// TODO Auto-generated method stub
		System.out.println("关闭鼠标设备");
	}
	
	public void mouse_click()
	{
		System.out.println("鼠标点击");
	}

}

USB键盘类:

package Interface_test;

public class KeyBoard implements USB {

	@Override
	public void open_usb_device() {
		// TODO Auto-generated method stub
		System.out.println("打开键盘设备");
	}

	@Override
	public void close_usb_device() {
		// TODO Auto-generated method stub
		System.out.println("关闭键盘设备");
	}
	
	public void keyboard_click()
	{
		System.out.println("键盘敲击");
	}

}

用户使用:

package Interface_test;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Computer user1 = new Computer();
		user1.power_on();
		//左父右子为多态,使用Mouse
		USB usb_mouse = new Mouse();	
		usb_mouse.open_usb_device();
		//使用Mouse类独有的click方法,需要向下转型
		Mouse mouse = (Mouse)usb_mouse ;
		mouse.mouse_click();
		usb_mouse.close_usb_device();
		
		//左父右子为多态,使用KeyBoard
		KeyBoard  usb_keyboard = new KeyBoard();
		usb_keyboard.open_usb_device();
		//使用KeyBoard独特的click方法,需要向下转型
		KeyBoard keyboard = (KeyBoard)usb_keyboard ;
		keyboard.keyboard_click();
		usb_keyboard.close_usb_device();
		
		user1.power_off();
	}

}

运行结果:

参考资料:传智播客Java学习

猜你喜欢

转载自blog.csdn.net/morixinguan/article/details/85052059