多态的作用和形式
1.多态的形式:
父类类型 对象名称=new 子类构造器;
接口 对象名称=new 实现类构造器。
2.方法:编译看左边,运行看右边。
3.变量:编译看左边,运行也看左边。
public abstract class Animal {
public String name="Animalname";
public abstract void run();
}
public class Cat extends Animal{
public String name="Catname";
@Override
public void run() {
System.out.println("Cat");
}
}
public class Dog extends Animal{
public String name="Dogname";
@Override
public void run() {
System.out.println("Dog");
}
}
public class Test {
public static void main(String[] args) {
Animal d=new Dog();
d.run();
System.out.println(d.name);
Animal c=new Cat();
c.run();
System.out.println(c.name);
}
}
//结果
Dog
Animalname
Cat
Animalname
多态的前提:
有继承/实现关系;有父类引用指向子类对象;有方法重写。
多态的优势
1.在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
2.定义方法的时候,使用父类型作为参数,该方法就可以接收着父类的一切子类对象,体现出多态的扩展性与便利。
多态的缺点
不能使用子类的独有功能(除了重写父类方法的其他功能)。
解决方法:
1.自动类型转换。父类类型 对象名称=new 子类构造器。
2.强制类型转换,父类到子类,必须强制类型转换。
注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException。比如Dog c1=(Dog)c会报错。
Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换。
Demo
定义USB接口
public interface USB {
void connect();
void unconnect();
}
定义键盘类和鼠标类实现USB接口
public class KeyBoard implements USB{
private String name;
public KeyBoard(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void click(){
System.out.println("jianpang");
}
@Override
public void connect() {
System.out.println(name+"已连接");
}
@Override
public void unconnect() {
System.out.println(name+"已断开");
}
}
public class Mouse implements USB{
private String name;
public Mouse(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void click(){
System.out.println("shubiao");
}
@Override
public void connect() {
System.out.println(name+"已连接");
}
@Override
public void unconnect() {
System.out.println(name+"已断开");
}
}
public class Computer {
private String name;
public void start(){
System.out.println("开机");
}
/**
*提供USB设备入口
*/
public void installUSB(USB usb){
usb.connect();
if (usb instanceof KeyBoard){
KeyBoard usb1=(KeyBoard) usb;
usb1.click();
} else if (usb instanceof Mouse) {
Mouse usb2=(Mouse) usb;
usb2.click();
}
usb.unconnect();
}
public Computer(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
Computer computer=new Computer("mac");
computer.start();
USB u1=new KeyBoard("logi");
USB u2=new Mouse("mi");
computer.installUSB(u1);
computer.installUSB(u2);
}
}
//结果
开机
logi已连接
jianpang
logi已断开
mi已连接
shubiao
mi已断开