zoukankan      html  css  js  c++  java
  • 20180117多态复习之二

    多态:一种代码重用的机制。

    分类:运行时多态(重写)和编译时多态(重载)。

    /*代码举例*/
    /*代码说明:督导监督教师教学和学生上课听课等情况*/
    public class Person{
        private String name;
        private int age;
        private char gender;
    
        public Person(){
    
        }
    
        public void setName(String name){
            this.name=name;
        }
        public String getName(){
            return name;
        }
        public void setAge(int age){
            this.age=age;
        }
        public String getAge(){
            return age;
        }
        public void setGender(char gender){
            this.gender=gender;
        }
        public char getGender(){
            return gender;
        }
    
        public void print(){
            System.out.println("我是"+name+",年龄是"+age+"岁,我的性别是"+gender);
        }
    
    }
    
    /*教师类*/
    public class Teacher extends Person{
        private String majorField;
    
        public void setMajorField(String majorField){
            this.majorField=majorField;
        }
        public String getMajorField(){
            return majorField;
        }
    
        public Teacher(){
            majorField=".net";
        }
        public Teacher(int a,char g){
            
        }
    
        public void print(){
            super.print();
            System.out.println(",我的授课方向是"+majorField);
        }
        //调用父类方法并在后面加上自己特有的内容
    
    }
    
    /*Student类*/
    public class Student extends Person{
           private String grade;
           public void setGrade(String grade){
                     this.grade=grade;
           }
           public String getGrade(){
                     return grade;
           }
           public void print(){//重写
                     super.print();
                     System.out.println(",目前我上"+grade);
           }
    
    }
    
    public class Supervisor{
        //监督教师的方法
        public void supervise(Teacher t){
               System.out.println("开始监督");
               System.out.println("1.表达准确");
               System.out.println("2.讲解思路清晰");
        }
    
        //监督学生的方法
        public void supervise(Student s){
               System.out.println("开始监督...");
               System.out.println("1.不迟到,早退,旷课");
               System.out.println("2.课堂认真学习");
        }
    
    }
    
    /*测试类*/
    public class Test{
        public static void main(String[] args) {
            Supervisor supervisor=new Supervisor();
            supervisor.supervisor(new Student());
            supervisor.supervisor(new Teacher());
            //上面这两行代码怎么理解??
        }
    }

    /*程序问题分析:

    *1.学生和老师上课应该属于学生和老师的行为,不应该放在监督类中

    *2.这个程序的扩展性不好,若要在督导类中添加新的人员,则需要增添新的类

    *然后还要修改督导类。(要求:高内聚,低耦合)

    */

     

    /*

    *如何修改呢?

    *1.learn方法放到person类中,并在teacher类和Person类中重写person类中上课方法

    *  public void learn(){

    *

    *  }

    *2.在督导类中修改监督方法supervise(),参数类型改为Person对象类型

    */

     

    //代码修改如下

     

    /*代码说明:督导监督教师教学和学生上课听课等情况*/
    public class Person{
        private String name;
        private int age;
        private char gender;
    
        public Person(){
    
        }
    
        public void setName(String name){
            this.name=name;
        }
        public String getName(){
            return name;
        }
        public void setAge(int age){
            this.age=age;
        }
        public String getAge(){
            return age;
        }
        public void setGender(char gender){
            this.gender=gender;
        }
        public char getGender(){
            return gender;
        }
    
        public void print(){
            System.out.println("我是"+name+",年龄是"+age+"岁,我的性别是"+gender);
        }
        public void learn(){
            //后来加的一个learn的空方法
        }
    
    }
    
    /*教师类*/
    public class Teacher extends Person{
        private String majorField;
    
        public void setMajorField(String majorField){
            this.majorField=majorField;
        }
        public String getMajorField(){
            return majorField;
        }
    
        public Teacher(){
            
            //this.majorField="";
            this.(".net");
            //调用构造方法必须是第一句,它调用本类中其它的构造器
        }
        public Teacher(String majorField){
            this.majorField=majorField;
            //this调用自己的属性
        }
    
        public void print(){
            //System.out.println("执行Teacher中的print方法");
            super.print();
            System.out.println(",我的授课方向是"+majorField);
            //调用自己的某个方法
        }
        //调用父类方法并在后面加上自己特有的内容
    
        //真正实现的learn方法
        public void learn(){
            System.out.println("1.表达准确");
            System.out.println("2.讲解思路清晰");
        }
    
    }
    
    /*Student类*/
    public class Student extends Person{
           private String grade;
           public void setGrade(String grade){
                     this.grade=grade;
           }
           public String getGrade(){
                     return grade;
           }
           public void print(){
                     super.print();
                     System.out.println(",目前我上"+grade);
           }
    
           //真正实现的learn方法
           public void learn(){
               System.out.println("1.不迟到,不早退。");
               System.out.println("2.课堂上认真听讲");
           }
    
    }
    
    /*监督者类*/
    public class Supervisor{
        public void supervise(Person p){
               System.out.println("开始监督...");
               p.learn();    
               /*两个监督方法变成一个,以此降低类之间的耦合性,
               实现“低耦合”的要求,利于后期修改和增加特殊的类*/
        }
    }
    
    /*测试类*/
    public class Test{
        public static void main(String[] args) {
            Supervisor supervisor=new Supervisor();
            supervisor.supervisor(new Student());
            supervisor.supervisor(new Teacher());    
        }
    }

    /*说明:

    supervise(Person p)中,这个监督方法所带的Person对象,在测试

    类中给的实际对象是Student和Teacher对象,在运行”p.learn();”

    语句的时候,可以是是Student和Teacher对象,也可以说是Person的任何一个子类对象。这就是多态,也叫表现形式多态,p就有多种表现形态。

    多态的产生条件:1.必须有继承  2.有方法重写 3.必须是父类声明,

    实际是子类对象。

    多态的作用特点:使得代码高效重用,也使得系统可扩展性强。

    */

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    (转)MapReduce中的两表join几种方案简介
    Java 网络编程(转)
    RDD的转换操作---RDD转换过程
    mapreduce 实现pagerank
    mapreduce 实现矩阵乘法
    Spark Standalone运行过程
    (转)MapReduce二次排序
    (转)《深入理解java虚拟机》学习笔记10——并发编程(二)
    jetty启动源码分析
    tomcat源码分析 Http11Processor process
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/8306395.html
Copyright © 2011-2022 走看看