java笔记10-多态

  多态定义: 同一个对象体现出来的多种不同的形态 将一种行为表现出不同的效果,先有继承关系 通过父类类型的引用 指向子类的对象 该引用只能调用父类的方法和属性,如果子类中将父类的方法重写了调用之后执行的结果是子类重写之后的结果,如果子类和父类中有相同的属性 调用父类的属性,造型时 向下转换可能会出ClassCastException造型异常 

  记得当时学pyhon时多态就是我的薄弱项,在这里讲的详细一点。这里还是通过一个例子来说明

  动物类   属性:姓名 方法:吃 睡

  羊类(继承动物类)  属性:姓名 方法:重写睡

  猴类(继承动物类)  属性:姓名、 方法: 重写吃 重写睡 独有说话

  金丝猴(继承猴类) 属性:姓名 方法: 重写吃  独有毛发颜色

  黑猴(继承猴类) 属性:姓名 方法: 重写说话  独有屁股颜色

 

class Animals{
    public String name="动物的名字";
    public void eat(){
        System.out.println("动物吃饭的方法");
    }
    public void sleep(){
        System.out.println("动物睡觉的方法");
    }

}
class sheep extends Animals{
    public String name="羊的名字";
    public void sleep(){
        System.out.println("羊睡觉的方法");
    }

}


class Monkey extends Animals{
    public String name="猴子的名字";
    public String weight="猴子的体重";
    public void eat(){
        System.out.println("猴子吃饭的方法");
    }
    public void sleep(){
        System.out.println("猴子睡觉的方法");
    }
    public void talk(){
        System.out.println("猴子说话的方法");
    }

}

class GoldenMonkey extends Monkey{
    public String name="金丝猴的名字";
    public String weight="金丝猴的体重";
    public void eat(){
        System.out.println("金丝猴吃饭的方法");
    }

    public void color(){
        System.out.println("我是金丝猴,我的颜色和普通猴子不一样");
    }

}


class BlackMonkey extends Monkey{
    public String name="黑猴";
    public void talk(){
        System.out.println("黑猴说话的方法");
    }
    public void redhip(){
        System.out.println("黑猴子的红屁股");
    }
}
public class Test {
    public static void main(String[] args) {
        //正经的使用
        GoldenMonkey goldenmonkey=new GoldenMonkey();
        System.out.println(goldenmonkey.name); //金丝猴的属性
        goldenmonkey.eat();  //金丝猴的方法
        goldenmonkey.color(); //金丝猴的方法
        goldenmonkey.talk(); //金丝猴没有talk方法 向上找用猴子的
        //多态的使用
        //Object对象
        //这种创建对象属于向上转型
        Object o=new GoldenMonkey();
        //只能用到object的一些方法
        System.out.println(o.hashCode());
        //动物的对象
        //如果想使用子类的属性和方法 需要向下转型(强制)
        Animals a =(Animals)o;
        Animals a1=new GoldenMonkey();
        System.out.println(a.name); //父类有属性先用父类的 所以是animals的名字
        //System.out.println(a.weight);//父类如果没有属性 不能调用子类的会报错
        a.sleep(); //金丝猴没有重写sleep 猴子和动物都有sleep 用子类猴子的睡觉方法
        a.eat();  //金丝猴重写了吃饭的方法 用金丝猴的方法
        //猴子的对象
        Monkey m = (Monkey)o;
        System.out.println(m.name);
        m.eat();//金丝猴重写了吃饭的方法 用金丝猴的方法
        m.sleep(); //金丝猴没有重写sleep 猴子和动物都有sleep 用子类猴子的睡觉方法
        m.talk(); //金丝猴没有talk方法  向上找 用猴子的talk方法
        GoldenMonkey gg=(GoldenMonkey)o;
        System.out.println(gg.name);
        gg.eat();
        gg.sleep();
        gg.talk();
        gg.color();
        //平级转换会出异常
        //BlackMonkey b=(BlackMonkey)o;
        //instanceof 方法 判断是否属于
        System.out.println(o instanceof BlackMonkey); //返回false
        System.out.println(o instanceof Monkey); //返回true

 

 

 

 

 

 

 

 

 

 

 

 

}

      

 

posted @ 2019-06-10 17:42  国际惯例  阅读(203)  评论(0编辑  收藏  举报