java中的多态

2017-07-20  本文已影响0人  glory_前端

多态对象的多中形态

1.引用的多态

1.父类的引用可以指向本类的对象
2.父类的引用可以指向子类的对象

2.方法的多态

1.创建本类对象时,调用的方法为本类的方法。
2.创建子类对象时,调用的方法为子类重写的方法或继承的方法

父类
package com.imooc;

public class Animal {
    public int age=10;
    public String name;
    public void eat(){
        System.out.println("动物具有吃的能力");
    }
}
子类
package com.imooc;

public class Dog extends Animal {
        public int age=20;
        public void eat(){
            System.out.println("狗爱吃骨头");
        }
        public void method(){
            System.out.println(age);
            System.out.println(super.age);
            
        }
}
主方法
package com.imooc;

public class Initial {

    public static void main(String[] args) {
        
        
        Animal obj1=new Animal(); //父类的引用可以指向本类的对象
        Animal obj2= new Dog(); //父类的引用可以指向子类的对象
        obj1.eat(); //调用本类中的方法
        obj2.eat(); //调用的方法为子类重写的方法或继承的方法
        obj2.method();//不能调用子类中独有的方法 ,错误写法
    }

}
3.多态中引用类型的转换

1.向上类型的转换,是小类型向大类型转换
2.向下类型的转换,是大类型向小类型转换存在一定的风险。

通常会用instanceof关键字来判断是否包含某种类型,返回一个boolean值

package com.imooc;

public class Initial {

    public static void main(String[] args) {
        
        Dog dog=new Dog();
        Animal animal=dog;//向上类型的转换
        Dog dog2=(Dog)animal;//向下类型转换,强制转换
        if(animal instanceof Cat){
            Cat cat=(Cat)animal;
        }else{
            System.out.println("无法进行类型转换");
        }
        
    }

}
4.抽象类

抽象类前使用abstract关键字修饰的类,为抽象类
抽象类的作用:限制规定子类必须实现某些方法,但不必关注细节

1.应用场景
1.在某些情况下,某个父类只知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
2.从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类一个模板,从而避免了设计子类的随便性
3.使用规则
a.abstract定义抽象类
b.abstract定义抽象的方法,只有声明,不需要实现。
c.包含抽象方法的类是抽象类。
d.抽象类中可以包含普通的方法,也可以包含抽象方法
e.抽象类不可以直接创建,可以定义引用变量。

5.接口

接口可以理解为一种特殊的类,由全局常量和公共抽象方法组成。
类是一种具体的实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法实现细节,它只规定这些类里必须提供某些方法

1.接口的定义
和类的定义不同,接口的定义不在使用class关键字,而是使用interface关键字。
2.接口的基本语法

image.png

注意:接口一般是用来被继承和被实现的,修饰符一般用public,接口中的1.属性是常量,即使定义时不添加 public static final ,系统也会自动加上。
2.接口中的方法只能是抽象方法,在使用时即使不添加public abstract ,系统也会自动加上。
3.接口也是抽象的在修饰符后面需要加上abstract,如果不加系统会给我们自动加上。

3.使用接口
一个类可以实现一个或多个接口,实现一个接口用implements关键字,java中一个类只能继承一个父类,不够灵活,通过多个接口可以做补充。

image.png
4.抽象类图形分析
image.png

可以定义一个Telphone抽象类,用CellPhone和Smartphone继承抽象类。

抽象类
package com.xhouxiang;

public abstract class TelePhone {
    public abstract void message();
    public abstract void tell();
}
CellPhone继承
package com.xhouxiang;

public class CellPhone extends TelePhone {

    @Override
    public void message() {
        // TODO Auto-generated method stub
        System.out.println("通过键盘发短信");
    }

    @Override
    public void tell() {
        // TODO Auto-generated method stub
        System.out.println("通过键盘打电话");
    }

}
SmartPhone继承
package com.xhouxiang;

public class SmartPhone extends TelePhone {

    @Override
    public void message() {
        // TODO Auto-generated method stub
        System.out.println("通过语音发短信");
    }

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

}
主函数
package com.xhouxiang;

public class initialmian {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        CellPhone obj1=new CellPhone();
        SmartPhone obj2=new SmartPhone();
        obj1.message();
        obj1.tell();
        obj2.message();
        obj2.tell();
    }

}
5.接口图形化分析
image.png

智能手机也可以玩游戏,Psp也可以玩游戏,PsP不能继承TelPhone这个类,只有写一个接口让他们各自实现。

接口
package com.xhouxiang;

public interface InterPlaygame {
    public void playgame();
}
智能手机玩游戏
package com.xhouxiang;

public class SmartPhone extends TelePhone implements InterPlaygame {

    @Override
    public void message() {
        // TODO Auto-generated method stub
        System.out.println("通过语音发短信");
    }

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

    @Override
    public void playgame() {
        // TODO Auto-generated method stub
        System.out.println("智能手机打游戏");
    }

}
上一篇下一篇

猜你喜欢

热点阅读