内部类

基础题目

第一题:需求实现

  • 定义HandleAble接口,具备一个处理字符串数字的抽象方法方法HandleString(String num)。

    • 处理方式1:取整数部分。

    • 处理方式2:保留指定位小数,四舍五入。

  • 代码实现,效果如图所示:

  • 开发提示:

    • 匿名内部类的方式,调用所有抽象方法。

  • 参考答案:


     public class Test1 {
    ​
          public static void main(String[] args) {
    ​
              String str = "23.23456789";
              System.out.println("原数字字符串:" + str);
    ​
              HandleAble s1 = new HandleAble() {
                  @Override
                  public String handleString(String str) {
                      return str.substring(0, str.indexOf("."));
                  }
              };
              String string = s1.handleString(str);
    ​
              System.out.println("取整后:" + string);
    ​
              int num = 4;
        
              HandleAble s2 = new HandleAble() {
                  @Override
                  public String handleString(String str) {
        
                      int i = str.indexOf(".") + num + 1;
                      char c = str.charAt(i);
                      //System.out.println(c);
        
                      if (c <= '4') {
                          return str.substring(0, i).toString();
                      } else {
                          char c1 = (char) (str.charAt(str.indexOf(".") + num) + 1);
                          return str.substring(0, i - 1) + c1;
        
                      }
                  }
              };
              String sss = s2.handleString(str);
              System.out.println("保留" + num + "位小数后:" + sss);
        
          }
      }
      interface HandleAble {
          public abstract String handleString(String str);
      }
     

第二题:需求实现

  • 模拟上课出勤情况。

  • 定义学生类:

    • 属性:姓名,出勤。

    • 提供基本的构造方法和get方法,set方法。

  • 定义讲师类:

    • 属性:姓名。

    • 提供基本的构造方法和get方法,set方法

    • 成员方法:点名方法,设置每一位的学生出勤情况。假设,小明今日未出勤。

  • 定义课程类:

    • 属性:课程名称,讲师,学生集合。

    • 提供基本的构造方法和get方法,set方法

    • 成员方法:show方法,打印课程信息,老师姓名,学生是否上课情况。

  • 代码实现,效果如图所示:

  • 参考答案:

    public class Test2 {
          public static void main(String[] args) {
              // 创建Student 对象
              Student s = new Student("小红");
              Student s2 = new Student("小亮");
              Student s3 = new Student("小明");
    ​
              //  创建 ArrayList
              ArrayList<Student> sList = new ArrayList<>();
              sList.add(s);
              sList.add(s2);
              sList.add(s3);
    ​
              Teacher t = new Teacher("张老师");
    ​
              Course course = new Course("Java", t, sList);
    ​
              t.dianMing(sList);
    ​
              course.show();
          }
      }
    ​
      class Course {
    ​
          private String name;
    ​
          private Teacher t;
    ​
          private ArrayList<Student> sList;
    ​
          public Course() {
          }
    ​
          public Course(String name, Teacher t, ArrayList<Student> sList) {
              this.name = name;
              this.t = t;
              this.sList = sList;
          }
    ​
          public void show() {
              System.out.println("课程名称:" + name);
              System.out.println("授课老师:" + t.getName());
    ​
              for (int i = 0; i < sList.size(); i++) {
                  Student student = sList.get(i);
                  String name = student.getName();
    ​
                  if (student.isCome()) {
                      System.out.println("上课: " + name);
                  } else {
                      System.out.println("旷课: " + name);
                  }
              }
          }
      }
    ​
      class Teacher {
    ​
          private String name;
    ​
          public Teacher(String name) {
              this.name = name;
          }
    ​
          public void dianMing(ArrayList<Student> slist) {
              for (int i = 0; i < slist.size(); i++) {
                  Student student = slist.get(i);
                  if (!student.getName().equals("小明")) {
    ​
                      student.setCome(true);
                  }
              }
    ​
          }
    ​
          public String getName() {
              return name;
          }
      }
    ​
      class Student {
    ​
          private String name;
    ​
          private boolean come;
    ​
          public Student(String name) {
              this.name = name;
    ​
          }
    ​
          public String getName() {
              return name;
          }
    ​
          public void setName(String name) {
              this.name = name;
          }
    ​
          public boolean isCome() {
              return come;
          }
    ​
          public void setCome(boolean come) {
              this.come = come;
          }
      }
    

      

第三题:需求实现

  • 模拟接待员接待用户,根据用户id,给用户分组。

  • 定义接口Filter:

    • 提供抽象方法filterUser(User u)

  • 定义用户类:

    • 属性:用户类型,用户id

    • 提供基本的构造方法和get方法,set方法

  • 定义接待员类:

    • 属性:接口Filter

    • 提供基本的构造方法和get方法,set方法

    • 成员方法:接待用户方法,设置用户类型。

  • 测试类:

    • 初始化50个User对象,id为1-50。

    • 创建三个接待员对象。

      • 第一个接待员,设置接待规则,将10-19号用户类型设置为v1。

      • 第二个接待员,设置接待规则,将20-29号用户类型设置为v2。

    • 遍历用户集合,给用户分区。

  • 代码实现,效果如图所示:

  • 参考答案:

 public class Test3 {
            public static void main(String[] args) {
        
                ArrayList<User> ulist = new ArrayList<>();
                for (int i = 1; i <= 50; i++) {
                    ulist.add(new User(i));
                }
        
                System.out.println("未分组:");
                System.out.println(ulist);
        
                Reception r1 = new Reception();
                Reception r2 = new Reception();
                Reception r3 = new Reception();
                r1.setF(new Filter() {
                    @Override
                    public void filterUser(User u) {
                        if (u.getId() >= 10 && u.getId() < 20)
                            u.setType("v1");
                    }
                });
        
                r2.setF(new Filter() {
                    @Override
                    public void filterUser(User u) {
                        if (u.getId() >= 20 && u.getId() < 30)
                            u.setType("v2");
                    }
                });
        
                for (int i = 0; i < ulist.size(); i++) {
                    User user = ulist.get(i);
                    r1.recept(user);
                    r2.recept(user);
                    r3.recept(user);
                }
                System.out.println("已分组:");
                for (int i = 0; i < ulist.size(); i++) {
                    User user = ulist.get(i);
                    if (i % 9 == 0) {
                        System.out.println();
                    }
                    System.out.print(user + " ");
                }
        
            }
        }
        
        class Reception {
        
            Filter f;
        
            public Filter getF() {
                return f;
            }
        
            public void setF(Filter f) {
                this.f = f;
            }
        
            public void recept(User u) {
                if (u.getType() != null)
                    return;
                if (f != null) {
                    f.filterUser(u);
                    return;
                } else {
                    u.setType("A");
                }
            }
        }
        
        class User {
        
            private String type;
        
            private int id;
        
            public User(int id) {
                this.id = id;
            }
        
            public int getId() {
                return id;
            }
        
            public String getType() {
                return type;
            }
        
            public void setType(String type) {
            this.type = type;
        }

        @Override
        public String toString() {
            return id + "-" + type;
        }
    }

interface Filter {

        public abstract void filterUser(User u);

    }

  

第四题:需求实现

  • 模拟工人挑苹果。

  • 定义苹果类:

    • 属性:大小,颜色。

    • 提供基本的构造方法和get方法,set方法

  • 定义接口CompareAble:

    • 定义默认方法compare,挑选较大苹果。

  • 定义接口实现类Compare。

  • 定义工人类:

    • 成员方法:挑选苹果Apple pickApple(CompareAble,Apple a1,Apple a2)。

  • 测试类:

    • 创建Worker对象。

    • 创建两个Apple对象,一个Apple(5,"青色"),一个Apple(3,"红色")

    • 默认挑选大的苹果,打印苹果信息。

    • 指定颜色挑选,通过匿名内部类实现。

  • 代码实现,效果如图所示:

  • 参考答案:

        
public class Test4 {
            public static void main(String[] args) {
        
                Worker worker = new Worker();
        
                Apple apple1 = new Apple(5, "青色");
                Apple apple2 = new Apple(3, "红色");
        
                System.out.println("默认挑大的:");
                Apple apple = worker.pickApple(new Com(), apple1, apple2);
                System.out.println(apple);
        
                System.out.println("挑红的:");
                Apple apple3 = worker.pickApple(new Com() {
                    @Override
                    public Apple compare(Apple a1, Apple a2) {
                        return "红色".equals(a1.getColor()) ? a1 : a2;
                    }
                }, apple1, apple2);
                System.out.println(apple3);
        
            }
        
        }
        
        class Worker {
        
            public Apple pickApple(CompareAble c, Apple a1, Apple a2) {
        
                Apple compare = c.compare(a1, a2);
                return compare;
        
            }
        
        }
        
        class Apple {
            double size;
            String color;
        
            public Apple(double size, String color) {
                this.size = size;
                this.color = color;
            }
        
            public String getColor() {
                return color;
            }
        
            public void setColor(String color) {
                this.color = color;
            }
        
            public double getSize() {
                return size;
            }
        
            public void setSize(double size) {
                this.size = size;
            }
        
            @Override
            public String toString() {
                return size + "-" + color;
            }
        }
        
        interface CompareAble {
            public default Apple compare(Apple a1, Apple a2) {
                return a1.getSize() > a2.getSize() ? a1 : a2;
            }
        }
        
        class Com implements CompareAble {
        
        }

 

第五题:需求实现

  • 模拟玩家选择角色。

  • 定义接口FightAble:

    • 抽象方法:specialFight。

    • 默认方法:commonFight,方法中打印"普通打击"。

  • 定义战士类:

    • 实现FightAble接口,重写方法中打印"武器攻击"。

  • 定义法师类:

    • 实现FightAble接口,重写方法中打印"法术攻击"。

  • 定义玩家类Player:

    • 成员方法:FightAble select(String str),根据指令选择角色。

      • 法力角色,选择法师。

      • 武力角色,选择战士。

  • 代码实现,效果如图所示:

  • 参考答案:

        
 public class Test5 {
            public static void main(String[] args) {
        
                Player player = new Player();
                String select  = "法力角色";
                System.out.println("选择:"+ select);
                FightAble f = player.select(select);
                f.specialFight();
                f.commonFight();
        
                System.out.println("=================");
                select = "武力角色";
                System.out.println("选择:"+ select);
                FightAble f2 = player.select(select);
                f2.specialFight();
                f2.commonFight();
          
            }
        }
        
        class Player {
            public FightAble select(String str) {
        
                if ("法力角色".equals(str)) {
                    return new FaShi();
                } else if ("武力角色".equals(str)) {
                    return new ZhanShi();
                }
          
                return null;
            }
        
        }
        
        class FaShi implements FightAble {
            @Override
            public void specialFight() {
        
                System.out.println("法术攻击");
            }
        }
        
        class ZhanShi implements FightAble {
            @Override
            public void specialFight() {
                System.out.println("武器攻击");
            }
        }
        
        interface FightAble {
            public abstract void specialFight();
        
            public default void commonFight() {
                System.out.println("普通打击");
            }
        }

 

posted @ 2020-08-11 16:01  极地阳光-ing  阅读(452)  评论(0编辑  收藏  举报