二十一、多态

来源:互联网 发布:股票实时数据 大智慧 编辑:程序博客网 时间:2024/04/29 17:47

1、对象的多种形态
《1》引用多态
父类的引用指向本类的对象
父类的引用指向子类的对象
《2》方法多态
创建本类对象时,调用的方法是本类方法
创建子类对象时,调用的方法为子类重写的方法或者继承的方法
2、父类:

public class Animal {    public void eat(){        System.out.println("动物吃");    }}

子类:

public class Dog extends Animal{    /**     * @param args     */    public void eat(){        System.out.println("狗吃");    }    public void whatch(){        System.out.println("看门");    }    public static void main(String[] args) {        // TODO Auto-generated method stub        Animal obj1=new Animal();        Animal obj2=new Dog();       // Dog obj3=new Animal();//错误,不能是子类的引用指向父类的对象        obj1.eat();        obj2.eat();       //obj2.whatch();//错误,不能把父类的引用指向子类没有继承重写的方法    }}

输出:动物吃
狗吃
3、多态中引用类型的转换
《1》向上类型转换(隐式/自动类型转换),是小类型到大类型的转换。
《2》向下类型转换(强制类型转换),是大类型到小类型
《3》instanceof运算符,来解决引用对象的类型,避免类型转换的安全问题
Dog dog=new Dog();
Animal animal=dog;
if(animal instanceof Dog){
Dog dog2=(Dog)animal;
}else{
System.out.print(“无法进行”);
}
if(animal instanceof Cat){
Cat cat=(Cat)animal;//编译是按cat类型那个编译,运行时Dog类型
}else{
System.out.println(“无法进行类型转换”);
}
输出:无法进行类型转换
4、抽象类
abstract

《1》某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。也就是说抽象类是约束子类必须有哪些方法,而并不关注子类如何去实现。
《2》从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模版,从而避免了子类设计的随意性。
作用:
限制规定子类必须实现某些方法,但不关注实现细节。
使用规则:
abstract定义抽象类
abstract定义抽象方法,只有声明。不需要实现。
包含抽象方法的类是抽象类。
抽象类中可以包含普通方法,也可以没有抽象方法。
抽象类不能直接创建,可以定义引用变量

包含抽象方法的类一定是抽象类,抽象类和抽象方法都需要添加关键字 abstract,且顺序为 abstract class

public abstract class Telphone {   public abstract void call();//抽象方法没有方法体以分号结束       public abstract void message();}``

public class Smartphone extends Telphone{

@Overridepublic void call() {    // TODO Auto-generated method stub    System.out.println("通过语音打电话");}@Overridepublic void message() {    // TODO Auto-generated method stub    System.out.println("通过语音打电话");}

}

public class Cellphone extends Telphone{

@Overridepublic void call() {    // TODO Auto-generated method stub    System.out.println("通过键盘打电话");}@Overridepublic void message() {    // TODO Auto-generated method stub    System.out.println("通过键盘发短信");}

}

public static void main(String[] args) {
// TODO Auto-generated method stub
Telphone tel1=new Cellphone();
tel1.call();
Telphone tel2=new Smartphone();
tel2.call();

}
5、接口一种特殊的类,由全局常量和公共的抽象方法所组成。类是一种具体实现体,而接口定义了某一批所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类方法的实现细节,它只规定这些类里必须提供某些方法。**interface关键字**[修饰符 ] interface 接口名【extends 父接口1,父接口2...】{多个常量多个抽象方法}常量:接口中的属性是常量,即使定义时不添加public static final 修饰符,系统会自动添加。方法:接口中的方法都是抽象方法,即使定义时不添加public abstract修饰符,系统自动添加。使用接口:一个类可以实现一个或多个接口,实现接口使用**implements关键字**。Java中一个类只能继承一个父类,不够灵活,可以通过实现多个接口补充。继承父类实现接口的语法:**[修饰符] class 类名 extends 父类 implements 接口1,接口2...{类体部分//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法}**如果要继承父类,继承的父类必须在实现接口之前。定义接口:

public interface IPlayGame {//省略到abstract关键字
public void playGame();
}

实现接口

public class Smartphone extends Telphone implements IPlayGame{

@Overridepublic void call() {    // TODO Auto-generated method stub    System.out.println("通过语音打电话");}@Overridepublic void message() {    // TODO Auto-generated method stub    System.out.println("通过语音打电话");}@Overridepublic void playGame() {    // TODO Auto-generated method stub    System.out.println("可以打游戏");}

}

public class Psp implements IPlayGame{

@Overridepublic void playGame() {    // TODO Auto-generated method stub    System.out.println("可以打游戏");}

}

Main()函数

public static void main(String[] args) {
// TODO Auto-generated method stub
Telphone tel1=new Cellphone();
tel1.call();
Telphone tel2=new Smartphone();
tel2.call();

    IPlayGame ip1=new Smartphone();//指向实现接口的类    IPlayGame ip2=new Psp();    ip1.playGame();    ip2.playGame();}
使用接口:接口在使用过程中,还经常与匿名内部类配合使用。**匿名内部类**就是没有名字的内部类,多用于关注实现而不关注实现类的名称语法格式:

IPlayGame ip3=new IPlayGame(){
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println(“使用匿名内部类的方式实现接口”);
}
};//注意以分号结束
ip3.playGame();

或者

new IPlayGame(){
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println(“使用匿名内部类的方式实现接口”);
}
}.playGame();
“`

6、UML
Unified Modeling Language统一建模语言
是一个支持模型化和软件系统开发的图形化语言
Visio, Rational Rose , PowerDesign

原创粉丝点击