多态
定义:某一类事物的多种存在形态。
1.例:动物中猫,狗。
2.猫这个对象对应的类型是猫类型
猫 x = new 猫();
3.同时猫也是动物中的一种,也可以把猫称为动物。
动物 y = new 猫();
动物是猫和狗具体事物中抽取出来的父类型。
父类型引用指向了子类对象。
多态的体现
1.父类的引用指向了自己的子类对象。
2.父类的引用也可以接收自己的子类对象。
演示代码
多态的前提
1.必须是类与类之间有关系。要么继承,要么实现。
2.通常还有一个前提:存在覆盖。
多态的优点和弊端
1.优点:多态的出现大大的提高程序的扩展性和后期可维护性。
2.弊端:提高了扩展性,但是只能使用父类的引用访问父类中的成员。
多态的特点
1.在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
2.在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
3.在多态中,静态成员的特点:
无论编译和运行,都参考做左边。
instanceof关键字
instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
多态的应用
多态的主板示例
定义:某一类事物的多种存在形态。
1.例:动物中猫,狗。
2.猫这个对象对应的类型是猫类型
猫 x = new 猫();
3.同时猫也是动物中的一种,也可以把猫称为动物。
动物 y = new 猫();
动物是猫和狗具体事物中抽取出来的父类型。
父类型引用指向了子类对象。
多态的体现
1.父类的引用指向了自己的子类对象。
2.父类的引用也可以接收自己的子类对象。
演示代码
/*
* 需求:
* 1.演示多态的体现
* (1)父类的引用指向了自己的子类对象。
* (2)父类的引用也可以接收自己的子类对象。
* 2.怎么更好的调用子类特有方法
*/
//动物类
abstract class Animal{
//共性方法,但内容不确定
abstract void eat();
}
//猫
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
//特有方法
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
//狗
class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头");
}
//特有方法
public void kanJia(){
System.out.println("猫看家");
}
}
//测试类
public class DuoTaiDemo {
public static void main(String[] args) {
/*以前的做法
Cat cat = new Cat();
cat.eat();
Dog dog = new Dog();
dog.eat();
*/
//多态的体现
Animal c = new Cat();
function(c);
Animal d = new Dog();
function(d);
/*
* 说明:
* 1.我们能转换的是父类引用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
* 2.多态自始至终都是子类对象在做着变化。
*/
//向上转型(类型提升)。
Animal c1 = new Cat();
System.out.println(c1.getClass());
//向下转型(强制转换):强制将父类的引用转成子类类型
Cat c2 = (Cat)c1;
System.out.println(c2.getClass());
}
public static void function(Animal a){
a.eat();
//调用子类的特用方法;instanceof用于判断对象的类型
if(a instanceof Cat){
Cat c = (Cat)a;
c.catchMouse();
}else if(a instanceof Dog){
Dog c = (Dog)a;
c.kanJia();
}
}
}
多态的前提
1.必须是类与类之间有关系。要么继承,要么实现。
2.通常还有一个前提:存在覆盖。
多态的优点和弊端
1.优点:多态的出现大大的提高程序的扩展性和后期可维护性。
2.弊端:提高了扩展性,但是只能使用父类的引用访问父类中的成员。
多态的特点
1.在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
2.在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
3.在多态中,静态成员的特点:
无论编译和运行,都参考做左边。
instanceof关键字
instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
多态的应用
多态的主板示例
/*
需求:电脑运行实例
接口的出现增加了功能拓展,同时多态的应用提高了程序拓展性
*/
//接口
interface PCI{
public abstract void open();
public abstract void close();
}
//主板
class MainBoard{
public void run(){
System.out.println("mainboard run");
}
//拓展功能,(PCI p)使用多态提高了程序拓展性
public void usePCI(PCI p){
if(p!=null){
p.open();
p.close();
}
}
}
//---------------------------------------------------------
//下面都是拓展功能
//网卡
class NetCard implements PCI{
public void open(){
System.out.println("NetCard run");
}
public void close(){
System.out.println("NetCard close");
}
}
//声卡
class SoundCard implements PCI{
public void open(){
System.out.println("SoundCard run");
}
public void close(){
System.out.println("SoundCard close");
}
}
//测试类
class PCDemo{
public static void main(String[] args){
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}
}