黑马程序员技术交流社区
标题:
多态总结
[打印本页]
作者:
a80C51
时间:
2015-9-10 21:33
标题:
多态总结
1,定义
相同类型的变量,调用同一个方法时,呈现出多种不同的行为特征。
2,父类多态的体现
a,父类的引用指向了自己的子类对象
b,父类的引用也可以接收自己子类的对象
3,多态的前提
a,类与类之间有关系,要么继承,要么实现;
b,类与类之间存在覆盖。
4,多态的好处
大大提高程序的扩展性。
5,多态的弊端
只能使用父类的引用访问父类中的成员。
6,类型转换
class Cats extends Animal
{}
Animal a = new Cats();//类型提升,向上提升。
Cats c = (Cats)a;//强制将父类的引用,转成子类。
强制类型转换的注意事项
1,基本类型之前的转换只能在数值类型(整型、字符型和浮点型)之间进行。
2,引用类型之间的转换只能在具有继承关系的两个类型之间进行。
7,instanceof关键字
作用:避免出现ClassCastException异常。
用法:前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类。
读法:判断前面的对象是否是后面的类,或者其子类、实现类的实例。如果是,则返回true,否则返回false。
注意事项:
运算符前面操作数的编译时类型要么与后面的类型相同,要么与后面的类具有父子类继承关系。
8,多态始终都是子类在做着变化。
9,多态中成员的特点
只有非静态的成员方法,才会有如下原则:
编译时看左边,运行时看右边。
换言之,编译时期。要看引用型变量所属的类中是否有调用方法;
而运行时,要参考对象所属的类中是否有调用的方法。
而对于其他成员,则只看左边即可。
10,接口类型的引用变量指向它自己子类的对象。
相应例子如下:
接口相关:
interface PCI
{
public abstract void open();
public abstract void close();
}
class NetCard implements PCI
{
public void open()
{
System.out.println("NetCard is open!!!!");
}
public void close()
{
System.out.println("NetCard is close!!!!");
}
}
class SoundCard implements PCI
{
public void open()
{
System.out.println("SoundCard is open!!!!!!!!");
}
public void close()
{
System.out.println("SoundCard is close!!!!!");
}
}
class MainBoard
{
public void run()
{
System.out.println("the MainBoard is running!!!");
}
public void usePCI(PCI p)
{
if(p == null)
System.out.println("nothing is here!!!");
p.open();
p.close();
}
}
public class myMainBoard
{
public static void main(String[] args)
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(new NetCard());//接口类型的引用变量指向它自己子类的对象.
mb.usePCI(new SoundCard());//接口类型的引用变量指向它自己子类的对象.
}
}
复制代码
其他与多态相关
class BaseClass
{
//父类的实例成员变量
public int booksNums = 6;
public void base()
{
System.out.println("父类的普通方法");
}
public void test()
{
System.out.println("父类被覆盖的方法");
}
public static void testStaticMethod()
{
System.out.println("父类的静态方法");
}
}
class SubClass extends BaseClass
{
//子类的实例成员变量
public int booksNums = 8;
public void test()
{
System.out.println("子类覆盖父类的方法");
}
public void sub()
{
System.out.println("子类的普通方法");
}
public static void testStaticMethod()
{
System.out.println("子类覆盖父类的静态方法");
}
}
public class PolymorphismClass
{
public static void main(String[] args)
{
//父类的引用指向自己子类的对象
BaseClass bs = new SubClass();//类型提升
//对于多态中的成员变量,无论编译和运行,都参考左边。
System.out.println(bs.booksNums);
//对于多态中的非静态方法,编译时,参考左边;运行时,参考右边
bs.test();
//因此,如下语句报错
//bs.sub();
//对于多态中的静态方法,编译和运行时,都参考右边
bs.testStaticMethod();
SubClass sb = (SubClass)bs;//强制将父类的引用,转成子类。
sb.sub();
//instanceof使用注意事项:
//运算符前面操作数的编译时类型要么与后面的类型相同,要么与后面的类具有父子类继承关系。
if(sb instanceof BaseClass)
System.out.println("sb is a instance of BaseClass");
//如下会引起编译错误
//if(sb instanceof String)
//System.out.println("sb is a instance of Object");
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2