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
第四题
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方法,必须有一个无参构造方法
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; } }*/ } }
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
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
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
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
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()); } } }
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(); } } }