Java应用程序开发学习之多态
在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 类转换异常
接下来举一个例子:
父类: 人类
子类:学生、员工
员工的属性:打印岁数(父类方法)、打印名称(父类方法)、打印员工的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学习