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

时间:2023-02-22 22:20:36
  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:\n"
                + "ShowMethods qualified.class.name\n"
                + "To show all methods in class or:\n"
                + "ShowMethods qualified.class.name. word\n"
                + "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