多态
概念
1.多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2.多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
3.多态的好处
多态的出现大大的提高程序的扩展性。
4.多态的弊端:
虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。
多态:
1.多态的概念发展出来,是以封装和继承为基础的。
2.概念:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。
3.理解:子类以父类的身份出现,但做事情时还是以自己的方法实现。子类以父类的身份出现需要向上转型(upcast),
其中向上转型是由JVM自动实现的,是安全的,但向下转型(downcast)是不安全的,需要强制转换。
子类以父类的身份出现时自己特有的属性和方法将不能使用。
demo
public class DuoTaiDemo {
public static void main(String[] args) {
DoStudent ds = new DoStudent();
ds.doSome(new BaseStudent());
ds.doSome(new AdvStudent());
}
}
class DoStudent {
public void doSome(Student stu) {
stu.sleep();
stu.study();
if (stu instanceof AdvStudent) {// 用于判断对象stu是否属于AdvStudent类型。
AdvStudent as = (AdvStudent) stu;
as.doWork();
}
}
}
abstract class Student {
public abstract void study();
public void sleep() {
System.out.println("睡觉");
}
}
class BaseStudent extends Student {
public void study() {
System.out.println("BaseStudent学习");
}
}
class AdvStudent extends Student {
public void study() {
System.out.println("AdvStudent学习");
}
public void doWork() {
System.out.println("工作");
}
}
demo2
/*
需求:
电脑运行实例,电脑运行基于主板。
主板通过PCI连接接声卡和网卡
*/
interface PCI {
public void open();
public void close();
}
class MainBoard {
public void run() {
System.out.println("mainboard run");
}
public void usePCI(PCI p) {
if (p != null) {
p.open();
p.close();
}
}
}
class NetCard implements PCI {
public void open() {
System.out.println("netcard open");
}
public void close() {
System.out.println("netcard close");
}
}
class SoundCard implements PCI {
public void open() {
System.out.println("soundCard open");
}
public void close() {
System.out.println("soundCard close");
}
}
class DuoTaiDemo3 {
public static void main(String[] args) {
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(null);
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}
}