zoukankan      html  css  js  c++  java
  • Java 面向对象 --多态性

    1,方法的重载和重写;

    2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现

    父类Animal:

    package com.java1234.chap03.sec13;
     
    public class Animal {
     
        public void say(){
            System.out.println("我是一个动物");
        }
    }

    再搞两个子类,分别是Dog和Cat类,重写父类方法say:

    package com.java1234.chap03.sec13;
     
    public class Cat extends Animal{
     
        public void say(){
            System.out.println("我是一个猫");
        }
    }
    package com.java1234.chap03.sec13;
     
    public class Dog extends Animal{
     
        public void say(){
            System.out.println("我是一个狗");
        }
    }

    然后我们写个Test测试类:

    package com.java1234.chap03.sec13;
     
    public class Test {
     
        public static void main(String[] args) {
            Dog dog=new Dog();
            dog.say();
             
            Cat cat=new Cat();
            cat.say();
        }
    }

    运行输出:

    我是一个狗

    我是一个猫

     下面我来用多态测试,父类引用指向子类具体实现:

    package com.java1234.chap03.sec13;
     
    public class Test {
     
        public static void main(String[] args) {
            // 父类引用指向Dog子类的具体实现
            Animal animal=new Dog();
            animal.say();
             
            // 更换实现
            animal=new Cat();
            animal.say();
        }
    }

    运行输出:

    我是一个狗

    我是一个猫

     

    对象的转型:

    向上转型:子类对象->父类对象 安全

    向下转型:父类对象->子类对象 不安全

    比如上面的实例:Animal animal=new Dog(); 就是后面的new Dog() 子类对象 向上  Animail animal 转型  是安全的;

    package com.java1234.chap03.sec13;
     
    public class Test {
     
        public static void main(String[] args) {
            // 父类引用指向Dog子类的具体实现
            Animal animal=new Dog();
            animal.say();
             
            // 向下转型
            Dog dog=(Dog) animal;
            dog.say();
             
            // 向下转型  因为animal指向的是Dog具体实现 所以会报错
            Cat cat=(Cat)animal;
            cat.say();
        }
    }

    运行报错:

    我是一个狗

    我是一个狗

    Exception in thread "main" java.lang.ClassCastException: com.java1234.chap03.sec13.Dog cannot be cast to com.java1234.chap03.sec13.Cat

    at com.java1234.chap03.sec13.Test.main(Test.java:15)

    转换异常 所以说向下转型是不安全的,我们必须知道具体的实现类;

    我们上面用的继承方式演示了多态 其实在实际开发中 更多的是用接口:

    我们再写一个实例:

    我们先建一个父类接口People:

    package com.java1234.chap03.sec13;
     
    public interface People {
     
        public void say();
    }

    接下来写两个具体实现类,Student Teacher:

    package com.java1234.chap03.sec13;
     
    public class Student implements People{
     
        @Override
        public void say() {
            System.out.println("我是学生");
        }
     
    }
    package com.java1234.chap03.sec13;
     
    public class Teacher implements People{
     
        @Override
        public void say() {
            System.out.println("我是老师");
        }
     
    }

    我们来写一个测试类:

    package com.java1234.chap03.sec13;
     
    public class Test2 {
     
        public static void main(String[] args) {
            People p1=new Student();
            p1.say();
             
            p1=new Teacher();
            p1.say();
        }
    }

    运行输出:

    我是学生

    我是老师

     

  • 相关阅读:
    SharePoint 2010 获取当前用户的权限
    SharePoint 2010 移除Ribbon菜单中的命令项
    SqlServer2000孤立用户解决方案
    Hello Go!
    XMLHttpRequest对象介绍——1
    Struts 2 简单配置
    asp.net 2.0热贴收藏
    .NET牛人应该知道些什么(转)?
    ASP.net 2.0 中 WebResource.axd 管理资源的一些知识点
    asp.net中的异步页面
  • 原文地址:https://www.cnblogs.com/xyg-zyx/p/9827207.html
Copyright © 2011-2022 走看看