#Z01768. Java面向对象第一题,哇哈哈
Java面向对象第一题,哇哈哈
题目描述
面向对象博大精深,但是一直不好出题 难点在于OJ只能机械的比对输出结果,但是狡猾的你们可以很无耻的使用面向过程编程,直接System.out.pritnln()打印信息 所以,我要想办法逼着你们用面向对象编程
题目要求:(请严格按照如下顺序定义Student类) 1-定义一个名为 Student 的类,里面定义三个字段,一个公开的 sname, 一个 受保护的 sex,一个私有的 age,分别是字符串、字符串 和 普通整形 2-定义2个构造函数,一个无参,一个有参,有参的构造函数3个参数分别和 sname,sex,age一一对应 3-然后定义一个返回值为int,名为xusui的函数,作用是返回比age大一岁的虚岁 4-重写Student对象的toString函数,返回如下格式的对象信息: [sname=xz,sex=boy,age=18] 其中 xz、boy、18分别从输入中读取。
为了防止你们作弊,要求最后能打印出如下的Student类的相关信息 从上到下,依次是类的类名父类名接口名、字段名、构造函数名、自定义函数名 --------------super class and interface-------------- //防止你们拷贝,忽略
--------------Fields-------------- //防止你们拷贝,忽略
--------------Constructors-------------- //防止你们拷贝,忽略
--------------Methods-------------- //防止你们拷贝,忽略 读到这里我估计你蒙圈了,我才刚开始面向对象,如何打印这些东西?不用方,小邹把代码给你写好了,你调用就行了:
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;
public class Main { public static void main(String[] args) { Student s=new Student("xz","boy",18); System.out.println(s.toString()); //System.out.println("xusui=" + (s.xusui())); //调用对象的 xusui方法,打印虚岁,防止你完全拷贝,到时候要取消行首的注释
Tools.printClassDetails(s); Tools.printFieldMessage(s); Tools.printConMessage(s); Tools.printClassMethodMessage(s); } }
//类的基本信息打印封装,可以打印类的所有自定义函数、所有字段类型和名字、所有构造函数等信息、和接口 class Tools { //打印给定类的所有自定义方法 public static void printClassMethodMessage(object obj) { System.out.println("\n--------------Methods--------------"); Class c = obj.getClass(); Method[] ms = c.getDeclaredMethods(); for(int i = 0; i { Class returnType = ms[i].getReturnType(); System.out.print(returnType.getName()+" "); System.out.print(ms[i].getName()+"("); Class[] paramTypes = ms[i].getParameterTypes(); for (Class class1 : paramTypes) { System.out.print(class1.getName()+","); } System.out.println(")"); } }
//打印变量信息 public static void printFieldMessage(object obj) { System.out.println("\n--------------Fields--------------"); Class c = obj.getClass(); Field[] fs = c.getDeclaredFields(); for (Field field : fs) { Class fieldType = field.getType(); String typeName = fieldType.getName(); String fieldName = field.getName(); System.out.println(fieldName+"-"+typeName); } }
//打印构造函数信息 public static void printConMessage(object obj) { System.out.println("\n--------------Constructors--------------");
Class c = obj.getClass(); Constructor[] cs = c.getDeclaredConstructors(); for (Constructor constructor : cs) { System.out.print(constructor.getName()+"("); Class[] paramTypes = constructor.getParameterTypes(); for (Class class1 : paramTypes) { System.out.print(class1.getName()+","); } System.out.println(")"); } }
//打印类名,父类和接口名 public static void printClassDetails(object obj) { System.out.println("\n--------------super class and interface--------------"); Class c=obj.getClass(); System.out.println("class name= "+c.getName()); System.out.println("super class="+c.getSuperclass().toString()); Class interfaces[] = c.getInterfaces(); for (Class inte : interfaces) { System.out.println("interface name:"+inte); } } }
class Student { //这是你要完成的事情,尽情的面向对象吧 }
红色的是要完成的类的定义和函数啊,构造函数的书写
蓝色的是你在main里面如何调用我写好的tools类 橙色的tools类是我封装好的可以打印类相关信息的类
输入格式
多组测试数据 每组 输入3个数据,分别代表学生姓名、性别和年龄
输出格式
调用Student类的toString函数按格式打印相关信息并换行 然后调用xusui函数打印虚岁并换行 接着使用上面样例里4条蓝色的代码打印类的相关信息(前提你要按格式把Tools复制到Main类的下面)
xz boy 18
[sname=xz,sex=boy,age=18]
xusui=19
//后面的你们自己打印,省的被你们拷贝
提示
哎,这么周折干嘛,想学面向对象的自己会用class 来实现的
豫公网安备41072702000346号