• java编程思想第四版第十四章 类型信息习题


    1. fda
    2. dfa
    3. 第三题u
      package net.mindview.typeinfo.test4;
      
      import java.util.ArrayList;
      import java.util.Arrays;
      import java.util.List;
      
      abstract class Shape {
          void draw(){
              /*
               * 重点在这里: 
               * this指代的是实例对象,由于使用+连接字符串, 会自动调用对象的toString()方法.
               */
              System.out.println(this + ".draw()");
          }
          
          public abstract String toString();
      }
      
      class Circle extends Shape{
          @Override
          public String toString() {
              return "Circle";
          }
      }
      
      class Square extends Shape{
          @Override
          public String toString() {
              return "Square";
          }
      }
      
      class Triangle extends Shape{
          @Override
          public String toString() {
              return "Triangle";
          }
      }
      
      //菱形
      class Rhomboid extends Shape{
          @Override
          public String toString() {
              return "Rhomboid";
          }
      }
      
      public class Shapes {
      
          
          public static void main(String[] args) {
              List<Shape> shapes = new ArrayList<Shape>(Arrays.asList(
                  new Circle(), new Square(), new Triangle(), new Rhomboid()));
              
              for(Shape shape:shapes){
                  shape.draw();
              }
              
              for(int i=0;i<shapes.size(); i++){
                  Shape shape = shapes.get(i);
                  if(i == 3){
                      Rhomboid r = (Rhomboid)shape;
                      Circle c = (Circle)shape;
                  }
              }
          }
                                                                    }

      运行结果:

      Circle.draw()
      Square.draw()
      Exception in thread "main" Triangle.draw()
      Rhomboid.draw()
      java.lang.ClassCastException: net.mindview.typeinfo.test4.Rhomboid cannot be cast to net.mindview.typeinfo.test4.Circle
          at net.mindview.typeinfo.test4.Shapes.main(Shapes.java:63)

      不可以向下转型到Circle

    4. 第四题

      package net.mindview.typeinfo.test4;
      
      import java.util.ArrayList;
      import java.util.Arrays;
      import java.util.List;
      
      abstract class Shape {
          void draw(){
              /*
               * 重点在这里: 
               * this指代的是实例对象,由于使用+连接字符串, 会自动调用对象的toString()方法.
               */
              System.out.println(this + ".draw()");
          }
          
          public abstract String toString();
      }
      
      class Circle extends Shape{
          @Override
          public String toString() {
              return "Circle";
          }
      }
      
      class Square extends Shape{
          @Override
          public String toString() {
              return "Square";
          }
      }
      
      class Triangle extends Shape{
          @Override
          public String toString() {
              return "Triangle";
          }
      }
      
      //菱形
      class Rhomboid extends Shape{
          @Override
          public String toString() {
              return "Rhomboid";
          }
      }
      
      public class Shapes {
          public static void main(String[] args) {
              List<Shape> shapes = new ArrayList<Shape>(Arrays.asList(
                  new Circle(), new Square(), new Triangle(), new Rhomboid()));
              
              for(Shape shape:shapes){
                  shape.draw();
              }
              
              for(int i=0;i<shapes.size(); i++){
                  Shape shape = shapes.get(i);
                  if(i == 3){
                      //添加instanceof判断
                      if (shape instanceof Rhomboid){
                          Rhomboid r = (Rhomboid)shape;
                      }
                      if(shape instanceof Circle){
                          Circle c = (Circle)shape;
                      }
                  }
              }
          }
                                                                    }

      使用Class.newInstance方法,必须有一个无参构造方法

    5. 第五题:
      package net.mindview.typeinfo;
      
      import java.util.ArrayList;
      import java.util.Arrays;
      import java.util.List;
      
      abstract class Shape {
          void draw(){
              /*
               * 重点在这里: 
               * this指代的是实例对象,由于使用+连接字符串, 会自动调用对象的toString()方法.
               */
              System.out.println(this + ".draw()");
          }
          
          void rotate(){
              Class<? extends Shape> clazz = this.getClass();
              if(!clazz.getSimpleName().equals("Circle")){
                  System.out.println("旋转"+ this);
              }else{
                  System.out.println(this+"不需要旋转");
              }
          }
          
          public abstract String toString();
      }
      
      class Circle extends Shape{
          @Override
          public String toString() {
              return "Circle";
          }
      }
      
      class Square extends Shape{
          @Override
          public String toString() {
              return "Square";
          }
      }
      
      class Triangle extends Shape{
          @Override
          public String toString() {
              return "Triangle";
          }
      }
      
      //菱形
      class Rhomboid extends Shape{
          @Override
          public String toString() {
              return "Rhomboid";
          }
      }
      
      public class Shapes {
      
          
          public static void main(String[] args) {
              List<Shape> shapes = new ArrayList<Shape>(Arrays.asList(
                  new Circle(), new Square(), new Triangle(), new Rhomboid()));
              
              for(Shape shape:shapes){
                  shape.draw();
                  shape.rotate();
              }
              
              /*for(int i=0;i<shapes.size(); i++){
                  Shape shape = shapes.get(i);
                  if(i == 3){
                      Rhomboid r = (Rhomboid)shape;
                      Circle c = (Circle)shape;
                  }
              }*/
          }
                                                                    }
    6. 第七题
      package net.mindview.typeinfo.test8;
      
      import java.util.HashSet;
      import java.util.Set;
      
      interface A {}
      interface B {}
      interface C {}
      
      class D implements B{
          private int di=0;
          private String dname="";
          static{
              System.out.println("this is D");
              
          }
      }
      
      class E extends D implements A, B, C{
          private int ei=0;
          private String ename="";
          static{
              System.out.println("this is E");
              
          }
      }
      
      class F extends E implements A {
          private int fi=0;
          private String fname="";
          static{
              System.out.println("this is F");
              
          }
      }
      /**
       * 接受任意对象作为参数, 递归打印出该对象继承体系中所有的的类.
       * 包括继承的父类, 和实现的接口
       * 
       * 分析: 一个类智能继承一个父类, 可以实现多个接口.
       * 父类可以继承一个类,实现多个接口. 实现的接口可能和子类重复, 因此需要去重.
       * 递归实现
       * @author samsung
       *
       */
      class G {
          public void printSuperClass(Class c){
              if(c == null) return ;
              
              System.out.println(c.getName());
              
              //得到这个类的接口
              Class[] interfaces = c.getInterfaces();
              
              for(Class interfaceClass:interfaces){
                  printSuperClass(interfaceClass);
              }
              printSuperClass(c.getSuperclass());
          }
      }
      
      public class Test8 {
          public static void main(String[] args) {
              G g = new G();
              g.printSuperClass(F.class);
          }
      }

      运行结果:

      net.mindview.typeinfo.test8.F
      net.mindview.typeinfo.test8.A
      net.mindview.typeinfo.test8.E
      net.mindview.typeinfo.test8.A
      net.mindview.typeinfo.test8.B
      net.mindview.typeinfo.test8.C
      net.mindview.typeinfo.test8.D
      net.mindview.typeinfo.test8.B
      java.lang.Object
    7. 第八题
      package net.mindview.typeinfo.test8;
      
      interface A {}
      interface B {}
      interface C {}
      
      class D {
          static{
              System.out.println("this is D");
              
          }
      }
      
      class E extends D implements A, B, C{
          static{
              System.out.println("this is E");
              
          }
      }
      
      class F extends E {
          static{
              System.out.println("this is F");
              
          }
      }
      
      class G {
          public void printSuperClass(Class c){
              Class upClass = c.getSuperclass();
              
              try {
                  System.out.println(upClass.newInstance());
              } catch (InstantiationException e) {
                  System.out.println("实例化Instance 失败");
                  System.exit(1);
              } catch (IllegalAccessException e) {
                  System.out.println("实例化Instance 失败");
                  System.exit(1);
              }
              if(upClass.getSuperclass() != null ){
                  printSuperClass(upClass);
              }
          }
      }
      
      public class Test8 {
          public static void main(String[] args) {
              G g = new G();
              g.printSuperClass(F.class);
          }
      }

      运行结果:

      this is D
      this is E
      net.mindview.typeinfo.test8.E@17cb0a16
      net.mindview.typeinfo.test8.D@1303368e
      java.lang.Object@37f2ae62
    8. 第九题
      package net.mindview.typeinfo.test9;
      
      import java.lang.reflect.Field;
      
      interface A {}
      interface B {}
      interface C {}
      
      class D {
          public int i=0;
          public String name="";
          static{
              System.out.println("this is D");
              
          }
      }
      
      class E extends D implements A, B, C{
          public int i=0;
          public String name="";
          static{
              System.out.println("this is E");
              
          }
      }
      
      class F extends E {
          public int i=0;
          public String name="";
          static{
              System.out.println("this is F");
              
          }
      }
      
      class G {
          public void printSuperClass(Class c){
              Class upClass = c.getSuperclass();
              try {
                  //获取类中的字段
                  Field[] fs = upClass.getDeclaredFields();
                  System.out.println(fs.length);
                  for(Field f:fs){
                      //打印字段名
                      System.out.println(f.getName());
                      //获取字段值
                      Object value = upClass.getDeclaredField(f.getName());
                      System.out.println(value);
                  }
              } catch (Exception e1) {
                  e1.printStackTrace();
              }
              
              try {
                  System.out.println(upClass.newInstance());
              } catch (InstantiationException e) {
                  System.out.println("实例化Instance 失败");
                  System.exit(1);
              } catch (IllegalAccessException e) {
                  System.out.println("实例化Instance 失败");
                  System.exit(1);
              }
              if(upClass.getSuperclass() != null ){
                  printSuperClass(upClass);
              }
          }
      }
      
      public class Test9 {
          public static void main(String[] args) {
              G g = new G();
              g.printSuperClass(F.class);
          }
      }

      运行结果:

      2
      i
      public int net.mindview.typeinfo.test9.E.i
      name
      public java.lang.String net.mindview.typeinfo.test9.E.name
      this is D
      this is E
      net.mindview.typeinfo.test9.E@1440578d
      2
      i
      public int net.mindview.typeinfo.test9.D.i
      name
      public java.lang.String net.mindview.typeinfo.test9.D.name
      net.mindview.typeinfo.test9.D@26f04d94
      0
      java.lang.Object@38a3c5b6
    9. 第十题
      package net.mindview.typeinfo.test10;
      class Pot{}
      public class  Test10 {
          public static void judgeType(Object c){
              Class arrType = c.getClass().getComponentType();
              System.out.println(arrType.getName());
          }
          public static void main(String[] args) {
              judgeType(new char[10]);
              judgeType(new String[10]);
              judgeType(new long[10]);
              judgeType(new boolean[10]);
              judgeType(new Pot[10]);
              
          }
      
      }

      运行结果:

      char
      java.lang.String
      long
      boolean
      net.mindview.typeinfo.test10.Pot
    10. f
    11. asf
    12. a
    13. 第十四题
      package net.mindview.typeinfo.test14;
      
      import java.util.ArrayList;
      import java.util.Arrays;
      import java.util.List;
      import java.util.Random;
      
      import net.mindview.typeinfo.factory.Factory;
      
      /**
       *  部件类
       *  
       *  比如: 有过滤器部件, 皮带部件等. 
       *  空气净化器中需要有过滤器部件, 因此要有一个制造空气净化器的过滤器的工厂
       *  汽车尾气净化器也需要有过滤器部件, 因此需要一个制造汽车尾气的过滤器的工厂
       *  
       *  皮带
       *  车轮需要皮带, 因此需要一个制造车轮的皮带的工厂
       * @author samsung
       *
       */
      class Part{
          @Override
          public String toString() {
              return this.getClass().getSimpleName();
          }
          
          //目前已注册的部件工厂
          static List<String> partNames = Arrays.asList(
                  "net.mindview.typeinfo.test14.FuelFilter",
                  "net.mindview.typeinfo.test14.AirFilter",
                  "net.mindview.typeinfo.test14.CabinFilter",
                  "net.mindview.typeinfo.test14.OilFilter",
                  "net.mindview.typeinfo.test14.FanBelt",
                  "net.mindview.typeinfo.test14.GeneratorBelt",
                  "net.mindview.typeinfo.test14.PowerSteeringBelt"
                  
              );
          static{
              
          }
          
          private static Random rand = new Random(47);
          
          //随机得到一个已注册的部件工厂, 并制造部件
          public static Part createRandom(){
              int n = rand.nextInt(partNames.size());
              try {
                  return (Part) Class.forName(partNames.get(n)).newInstance();
              } catch (InstantiationException e) {
                  e.printStackTrace();
              } catch (IllegalAccessException e) {
                  e.printStackTrace();
              } catch (ClassNotFoundException e) {
                  e.printStackTrace();
              }
              return null;
          }
      }
      
      //过滤器部件
      class Filter extends Part {
          
      }
      
      //燃料过滤器部件
      class FuelFilter extends Filter {
          public static class Factory implements net.mindview.typeinfo.factory.Factory<FuelFilter>{
      
              @Override
              public FuelFilter create() {
                  return new FuelFilter();
              }
          }
      }
      
      //空气净化器部件
      class AirFilter extends Filter {
          public static class Factory implements net.mindview.typeinfo.factory.Factory<AirFilter>{
              @Override
              public AirFilter create() {
                  return new AirFilter();
              }
          }
      }
      
      //机舱空气过滤器部件
      class CabinFilter extends Filter {
          public static class Factory implements net.mindview.typeinfo.factory.Factory<CabinFilter>{
              @Override
              public CabinFilter create() {
                  return new CabinFilter();
              }
          }
      }
      
      //燃油过滤器部件
      class OilFilter extends Filter {
          public static class Factory implements net.mindview.typeinfo.factory.Factory<OilFilter>{
              @Override
              public OilFilter create() {
                  return new OilFilter();
              }
          }
      }
      
      //皮带部件
      class Belt extends Part{}
      
      //风扇皮带部件
      class FanBelt extends Belt {
          public static class Factory implements net.mindview.typeinfo.factory.Factory<FanBelt>{
              @Override
              public FanBelt create() {
                  return new FanBelt();
              }
          }
      }
      
      //发动机皮带部件
      class GeneratorBelt extends Belt {
          public static class Factory implements net.mindview.typeinfo.factory.Factory<GeneratorBelt>{
              @Override
              public GeneratorBelt create() {
                  return new GeneratorBelt();
              }
          }
      }
      
      //转向动力装置皮带部件
      class PowerSteeringBelt extends Belt {
          public static class Factory implements net.mindview.typeinfo.factory.Factory<PowerSteeringBelt>{
              @Override
              public PowerSteeringBelt create() {
                  return new PowerSteeringBelt();
              }
          }
      }
      
      
      /**
       * 查询目前已注册的工厂类
       * @author samsung
       *
       */
      public class RegisteredFactories {
      
          public static void main(String[] args) {
              for(int i=0;i<10;i++){
                  System.out.println(Part.createRandom());
                  
              }
      
          }
      
      }
    14. 第十五题: 内容太多, 直接参考demo
    15. af
    16. a
    17. 第十八题:
      package net.mindview.typeinfo;
      
      import java.lang.reflect.Constructor;
      import java.lang.reflect.Method;
      import java.util.regex.Pattern;
      
      public class ShowMethods {
          private ShowMethods(){}
          private static String usage = ""
                  + "usage:
      "
                  + "ShowMethods qualified.class.name
      "
                  + "To show all methods in class or:
      "
                  + "ShowMethods qualified.class.name. word
      "
                  + "To search for methodds invoiving 'word'";
          
          private static Pattern p = Pattern.compile("\w+\.");
          public static void main(String[] args) {
              if(args.length<1){
                  System.out.println(usage);
                  System.exit(1);
              }
              
              int lines = 0; 
              try {
                  Class<?> c = Class.forName(args[0]);
                  //getMethods获取的是整个继承树中所有的方法
                  Method[] methods = c.getMethods();
                  //获取已有的构造器
                  Constructor[] ctors = c.getConstructors();
                  
                  if(args.length == 1){
                      //打印所有继承树中的方法名
                      for(Method method: methods){
                          System.out.println(p.matcher(method.toString()).replaceAll(""));
                      }
                      //打印全部构造器
                      for(Constructor ctor: ctors){
                          System.out.println(p.matcher(ctor.toString()).replaceAll(""));
                      }
                      lines = methods.length + ctors.length;
                  }else {
                      //打印指定类中的方法
                      for(Method method: methods){
                          if(method.toString().indexOf(args[1]) != -1){
                              System.out.println(p.matcher(method.toString()).replaceAll(""));
                              lines++;
                          }
                      }
                      //打印构造器
                      for(Constructor ctor :ctors){
                          if(ctor.toString().indexOf(args[1])!=-1){
                              System.out.println(p.matcher(ctor.toString()).replaceAll(""));
                              lines++;
                          }
                      }
                  }
                  
              } catch (ClassNotFoundException e) {
                  e.printStackTrace();
              }
          }
      
      }
    18. af
    19. a
    20. f
    21. af
    22. a
    23. fa
    24. f
  • 相关阅读:
    C# String 前面不足位数补零的方法
    bootstrap-wysiwyg这个坑
    PRECONDITION_FAILED
    JdbcTemplate in()传参
    Mysql Specified key was too long; max key length is 767 bytes
    获取两日期之前集合并转为String类型的集合
    SQL里的concat() 以及group_concat() 函数的使用
    spring boot如何打印mybatis的执行sql
    MockMvc 进行 controller层单元测试 事务自动回滚 完整实例
    找到 Confluence 6 的日志和配置文件
  • 原文地址:https://www.cnblogs.com/ITPower/p/8664944.html
Copyright © 2020-2023  润新知