6-1 jmu-Java-03面向对象基础-覆盖与toString
有Person
类,Company
类,Employee
类。
其中Employee类继承自Person类,属性为:
private Company company; private double salary;
现在要求编写Employee类的toString
方法,返回的字符串格式为:父类的toString-company的toString-salary
函数接口定义:
public String toString()
输入样例:
输出样例:
Li-35-true-MicroSoft-60000.0
Code:
public String toString(){ return super.toString()+'-'+company.toString()+'-'+salary; }
###
6-2 jmu-Java-03面向对象基础-Object
输入整数n,创建n个对象,放入同一个数组中。
如果输入c
,则new Computer();
//注意:Computer是系统中已有的类,无需自己编写
如果输入d
,则根据随后的输入创建Double
类型对象。
如果输入i
,则根据随后的输入创建Integer
类型对象。
如果输入s
,则根据随后的输入创建String
类型对象。
如果不是以上这些输入,则不创建对象,而是将null
存入数组相应位置。
最后倒序输出数组中的所有对象,如果数组中相应位置的元素为null
则不输出。
裁判测试程序:
public static void main(String[] args) { Scanner sc = new Scanner(System.in); //这边是你的代码 sc.close(); }
输入样例:
5 c d 2.3 other i 10 s Test
输出样例:
Test 10 2.3 //这行显示Computer对象toString方法
Code:
int n =sc.nextInt(); Object []o=new Object[n]; for(int i=0;i<n;i++){ String str=sc.next(); switch(str){ case "c": o[i] = new Computer(); break; case"d": o[i]=sc.nextDouble(); break; case"i": o[i]=sc.nextInt(); break; case"s": o[i]=sc.next(); break; default: o[i]=null; } } for(int j=n-1;j>=0;j--){ if(o[j]!= null){ System.out.println(o[j]);} }
7-1 jmu-Java-03面向对象基础-01-构造方法与toString
定义一个有关人的Person
类,内含属性: String name
、int age
、boolean gender
、int id
,所有的变量必须为私有(private
)。 注意:属性顺序请严格按照上述顺序依次出现。
1.编写无参构造函数:
-
打印"This is constructor"。
-
将name,age,gender,id按照
name,age,gender,id
格式输出
2.编写有参构造函数
依次对name,age,gender
赋值。
3.覆盖toString函数:
按照格式:类名 [name=, age=, gender=, id=]
输出。建议使用Eclipse自动生成.
4.对每个属性生成setter/getter方法
5.main方法中
-
首先从屏幕读取n,代表要创建的对象个数。
-
然后输入n行name age gender , 调用上面2编写的有参构造函数新建对象。
-
然后将刚才创建的所有对象
逆序
输出。 -
接下来使用无参构造函数新建一个Person对象,并直接打印该对象。
输入样例:
3 a 11 false b 12 true c 10 false
输出样例:
Person [name=c, age=10, gender=false, id=0] Person [name=b, age=12, gender=true, id=0] Person [name=a, age=11, gender=false, id=0] This is constructor null,0,false,0 Person [name=null, age=0, gender=false, id=0]
Code:
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc =new Scanner(System.in); int n=sc.nextInt(); Person p[]=new Person[n]; for(int i=0;i<n;i++){ String name=sc.next(); int age=sc.nextInt(); boolean gender=sc.nextBoolean(); p[i]=new Person(name,age,gender); } for(int j=n-1;j>=0;j--){ p[j].toString(); } new Person(); } } class Person { private String name=null; private int age=0; private boolean gender=false; private int id=0; Person(){ System.out.println("This is constructor"); System.out.println(name+","+age+","+gender+","+id); System.out.println("Person [name="+name+", age="+age+", gender="+gender+", id="+id+"]"); } Person(String name ,int age,boolean gender ){ this.name=name; this.age=age; this.gender=gender; } public String toString(){ System.out.println("Person [name="+this.name+", age="+this.age+", gender="+this.gender+", id="+this.id+"]"); return "1"; } }
###
7-2 jmu-Java-03面向对象基础-02-构造方法与初始化块
分数 10
全屏浏览题目切换布局
作者 郑如滨
单位 集美大学
1.定义一个Person类
属性:String name
, boolean gender
, int age
, int id
,所有的变量必须为私有(private)。 无参构造函数:Person()
, 功能:打印This is constructor 。 有参构造函数:Person(name, gender, age)
,功能:给属性赋值。 建议:使用Eclipse自动生成toString方法
2.定义类的初始化块
为Person类加入初始化块,在初始化块中对id
属性赋值,并且要保证每次的值比上次创建的对象的值+1
。然后在下一行打印This is initialization block, id is ...
其中...
是id的值。 提示:可为Person
类定义一个static
属性来记录所创建的对象个数。
3.编写静态初始化块
打印This is static initialization block
4.编写main方法
-
首先输入n,代表要创建的对象数量。
-
然后从控制台分别读取n行的
name age gender
, 并调用有参构造函数Person(name, age, gender)
新建对象 。 -
将创建好的n个对象逆序输出(即输出
toString()
方法)。 -
使用无参构造函数新建一个Person对象,然后直接打印该对象。
思考
初始化类与对象有几种方法,构造函数、初始化块、静态初始化块。这三种方法执行的先后顺序是什么?各执行几次。
输入样例:
3 a 11 false b 12 true c 10 false
输出样例:
This is static initialization block This is initialization block, id is 0 This is initialization block, id is 1 This is initialization block, id is 2 Person [name=c, age=10, gender=false, id=2] Person [name=b, age=12, gender=true, id=1] Person [name=a, age=11, gender=false, id=0] This is initialization block, id is 3 This is constructor null,0,false,3 Person [name=null, age=0, gender=false, id=3]
Code:
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); int n=sc.nextInt(); Person p[]=new Person[n]; for (int i=0;i<n;i++){ String name=sc.next(); int age=sc.nextInt(); boolean gender =sc.nextBoolean(); p[i]=new Person(name,age,gender); } for(int j=n-1;j>=0;j--){ System.out.println(p[j]); } System.out.println(new Person()); } } class Person{ private String name; private boolean gender; private int age; private int id; private static int idValue=0; Person(){ System.out.println("This is constructor"); System.out.println(name+","+age+","+gender+","+id); } Person(String name,int age ,boolean gender){ this.name=name; this.age=age; this.gender=gender; } { this.id=idValue++; System.out.println("This is initialization block, id is "+this.id); } static{ System.out.println("This is static initialization block"); } public String toString(){ return "Person [name="+name+", age="+age+", gender="+gender+", id="+id+"]"; } }
7-3 jmu-Java-03面向对象基础-03-形状
分数 10
全屏浏览题目切换布局
作者 郑如滨
单位 集美大学
1. 定义长方形类与圆形类Circle
长方形类-类名:Rectangle
,private属性:int width,length
圆形类-类名:Circle
,private属性:int radius
编写构造函数: 带参构造函数:Rectangle(width, length)
,Circle(radius)
编写方法: public int getPerimeter()
,求周长。 public int getArea()
,求面积。 toString
方法,使用Eclipse自动生成。
注意:
-
计算圆形的面积与周长,使用
Math.PI
。 -
求周长和面积时,应先计算出其值(带小数位),然后强制转换为
int
再返回。
2. main方法
-
输入2行长与宽,创建两个Rectangle对象放入相应的数组。
-
输入2行半径,创建两个Circle对象放入相应的数组。
-
输出1:上面2个数组中的所有对象的周长加总。
-
输出2:上面2个数组中的所有对象的面积加总。
-
最后需使用
Arrays.deepToString
分别输出上面建立的Rectangle数组与Circle数组
思考:如果初次做该题会发现代码冗余严重。使用继承、多态思想可以大幅简化上述代码。
输入样例:
1 2 3 4 7 1
输出样例:
69 170 [Rectangle [width=1, length=2], Rectangle [width=3, length=4]] [Circle [radius=7], Circle [radius=1]]
Code:
import java.util.Scanner; import java.util.Arrays; class Rectangle{ private int length; private int width; public Rectangle(int width,int length){ this.width=width; this.length=length; } public int getPerimeter(){ return (length+width)*2; } public int getArea(){ return length*width; } public String toString(){ return "Rectangle [width="+width+", length="+length+"]"; } } class Circle{ private int radius; private double s; Circle(int radius){ this.radius=radius; } public int getPerimeter(){ s=2 * Math.PI* radius; return (int)s; } public int getArea(){ s=Math.PI*radius*radius; return (int)s; } public String toString(){ return "Circle [radius="+radius+"]"; } } public class Main{ public static void main(String[] args){ Scanner sc =new Scanner(System.in); Rectangle[] rectangle=new Rectangle[2]; rectangle[0]=new Rectangle(sc.nextInt(),sc.nextInt()); rectangle[1]=new Rectangle(sc.nextInt(),sc.nextInt()); Circle []circle =new Circle[2]; circle[0]=new Circle(sc.nextInt()); circle[1]=new Circle(sc.nextInt()); System.out.println(rectangle[0].getPerimeter()+ rectangle[1].getPerimeter()+ circle[0].getPerimeter()+ circle[1].getPerimeter()); System.out.println(rectangle[0].getArea()+rectangle[1].getArea()+circle[0].getArea() +circle[1].getArea()); System.out.println(Arrays.deepToString(rectangle)); System.out.println(Arrays.deepToString(circle)); } }
7-4 jmu-Java-03面向对象基础-04-形状-继承
分数 15
全屏浏览题目切换布局
作者 郑如滨
单位 集美大学
前言
前面题目形状中我们看到,为了输出所有形状的周长与面积,需要建立多个数组进行多次循环。这次试验使用继承与多态来改进我们的设计。
本题描述
1.定义抽象类Shape 属性:不可变静态常量double PI
,值为3.14
, 抽象方法:public double getPerimeter()
,public double getArea()
2.Rectangle与Circle类均继承自Shape类。 Rectangle类(属性:int width,length)、Circle类(属性:int radius)。 带参构造方法为Rectangle(int width,int length)
,Circle(int radius)
。 toString
方法(Eclipse自动生成)
3.编写double sumAllArea
方法计算并返回传入的形状数组中所有对象的面积和与 double sumAllPerimeter
方法计算并返回传入的形状数组中所有对象的周长和。
4.main方法 4.1 输入整型值n,然后建立n个不同的形状。如果输入rect,则依次输入宽、长。如果输入cir,则输入半径。 4.2 然后输出所有的形状的周长之和,面积之和。并将所有的形状信息以样例的格式输出。 提示:使用Arrays.toString
。 4.3 最后输出每个形状的类型与父类型.使用类似shape.getClass()
//获得类型, shape.getClass().getSuperclass()
//获得父类型;
注意:处理输入的时候使用混合使用nextInt
与nextLine
需注意行尾回车换行问题。
思考
-
你觉得sumAllArea和sumAllPerimeter方法放在哪个类中更合适?
-
是否应该声明为static?
输入样例:
4 rect 3 1 rect 1 5 cir 1 cir 2
输出样例:
38.84 23.700000000000003 [Rectangle [width=3, length=1], Rectangle [width=1, length=5], Circle [radius=1], Circle [radius=2]] class Rectangle,class Shape class Rectangle,class Shape class Circle,class Shape class Circle,class Shape
Code:
import java.util.*; abstract class Shape{ static final double PI=3.14; public abstract double getPerimeter(); public abstract double getArea(); } class Rectangle extends Shape{ private int width; private int length; public Rectangle(int width,int length){ this.width=width; this.length=length; } public double getPerimeter(){ return 2*(this.width+this.length); } public double getArea(){ return this.width*this.length; } public String toString(){ return "Rectangle [width="+width+", length="+length+"]"; } } class Circle extends Shape{ private int radius; public Circle(int radius){ this.radius =radius; } public double getPerimeter(){ return PI*this.radius*2; } public double getArea(){ return PI*this.radius*this.radius; } public String toString(){ return "Circle [radius="+radius+"]"; } } public class Main{ public static void main(String [] args){ Scanner sc=new Scanner(System.in); int n=sc.nextInt(); sc.nextLine(); Shape []shapes =new Shape[n]; for(int i=0;i<n;i++){ String shape=sc.nextLine(); if(shape.equals("rect")){ int width =sc.nextInt(); int length=sc.nextInt(); sc.nextLine(); shapes[i]=new Rectangle(width,length); } else{ int radius=sc.nextInt(); sc.nextLine(); shapes[i]=new Circle(radius); } } System.out.println(sumAllPermeter(shapes)); System.out.println(sumAllArea(shapes)); System.out.println(Arrays.toString(shapes)); for(Shape s:shapes){ System.out.println(s.getClass()+","+s.getClass().getSuperclass()); } } public static double sumAllArea(Shape[] shapes){ double sum=0; for(Shape s:shapes){ sum=sum+s.getArea(); } return sum; } public static double sumAllPermeter(Shape[] shapes){ double sum =0; for(Shape s:shapes){ sum=sum+s.getPerimeter(); } return sum; } }
7-5 jmu-Java-03面向对象基础-05-覆盖
分数 15
全屏浏览题目切换布局
作者 郑如滨
单位 集美大学
Java每个对象都继承自Object,都有equals、toString等方法。 现在需要定义PersonOverride
类并覆盖其toString
与equals
方法。
1. 新建PersonOverride类
a. 属性:String name
、int age
、boolean gender
,所有的变量必须为私有(private)。
b. 有参构造方法,参数为name, age, gender
c. 无参构造方法,使用this(name, age,gender)
调用有参构造方法。参数值分别为"default",1,true
d.toString()
方法返回格式为:name-age-gender
e. equals
方法需比较name、age、gender,这三者内容都相同,才返回true
.
2. main方法
2.1 输入n1,使用无参构造方法创建n1个对象,放入数组persons1。 2.2 输入n2,然后指定name age gender
。每创建一个对象都使用equals方法比较该对象是否已经在数组中存在,如果不存在,才将该对象放入数组persons2。 2.3 输出persons1数组中的所有对象 2.4 输出persons2数组中的所有对象 2.5 输出persons2中实际包含的对象的数量 2.5 使用System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));
输出PersonOverride的所有构造方法。
提示:使用ArrayList
代替数组大幅复简化代码,请尝试重构你的代码。
输入样例:
1 3 zhang 10 true zhang 10 true zhang 10 false
输出样例:
default-1-true zhang-10-true zhang-10-false 2 [public PersonOverride(), public PersonOverride(java.lang.String,int,boolean)]
Code:
import java.util.*; class PersonOverride{ private String name; private int age; private boolean gender; public PersonOverride(){ this("default",1,true); } public PersonOverride(String name, int age,boolean gender){ this.name=name; this.age=age; this.gender=gender; } @Override public String toString(){ return this.name+"-"+this.age+"-"+this.gender; } @Override public boolean equals(Object o){ if(this == o){ return true; } if(o==null){ return false; } if(this.getClass() != o.getClass()){ return false; } PersonOverride p=( PersonOverride) o; return Objects.equals((this.name),p.name) && this.gender ==p.gender && this.age==p.age; } } public class Main{ public static void main (String [] args){ Scanner sc=new Scanner(System.in); int n1=sc.nextInt(); sc.nextLine(); PersonOverride[] person1=new PersonOverride[n1]; for(int i=0;i<n1;i++){ person1[i]=new PersonOverride(); } int n2=sc.nextInt(); sc.nextLine(); PersonOverride[] person2=new PersonOverride[n2]; int len2=0; for(int i=0;i<n2;i++){ String name =sc.next(); int age =sc.nextInt(); boolean gender=sc.nextBoolean(); sc.nextLine(); PersonOverride p =new PersonOverride(name ,age,gender); boolean flag = true; for(int j=0;j<len2;j++){ if(person2[j].equals(p)){ flag = false; break; } } if(flag){ person2[len2]=p; len2++; } } for(PersonOverride p:person1){ System.out.println(p); } for(int i=0;i<len2;i++){ System.out.println(person2[i]); } System.out.println(len2); System.out.println(Arrays.toString(PersonOverride.class.getConstructors())); } }
###
7-6 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company
分数 20
全屏浏览题目切换布局
作者 郑如滨
单位 集美大学
定义Person抽象类,Student类、Company类,Employee类。
Person类的属性:String name, int age, boolean gender
Person类的方法:
public Person(String name, int age, boolean gender); public String toString(); //返回"name-age-gender"格式的字符串 public boolean equals(Object obj);//比较name、age、gender,都相同返回true,否则返回false
Student类继承自Person
,属性:String stuNo, String clazz
Student类的方法:
//建议使用super复用Person类的相关有参构造函数 public Student(String name, int age, boolean gender, String stuNo, String clazz); public String toString(); //返回 “Student:person的toString-stuNo-clazz”格式的字符串 public boolean equals(Object obj);//首先调用父类的equals方法,如果返回true,则继续比较stuNo与clazz。
Company类属性:String name
Company类方法:
public Company(String name); public String toString(); //直接返回name public boolean equals(Object obj);//name相同返回true
Employee类继承自Person
,属性:Company company, double salary
Employee类方法:
//建议使用super复用Person类的相关有参构造函数 public Employee(String name, int age, boolean gender, double salary, Company company); public String toString(); //返回"Employee:person的toString-company-salary"格式的字符串 public boolean equals(Object obj);//首先调用父类的equals方法,如果返回true。再比较company与salary。 //比较salary属性时,使用DecimalFormat df = new DecimalFormat("#.#");保留1位小数
编写equals方法重要说明:
-
对Employee的company属性的比较。要考虑传入为
null
的情况。如果company不为null且传入为null,返回false -
对所有String字符类型比较时,也要考虑
null
情况。
提示
-
排序可使用Collections.sort
-
equals方法要考虑周全
main方法说明
-
创建若干Student对象、Employee对象。 输入
s
,然后依次输入name age gender stuNo clazz
创建Student对象。 输入e
,然后依次输入name age gender salary company
创建Employee对象。 然后将创建好的对象放入List<Person> personList
。输入其他字符,则结束创建。
创建说明: 对于String类型,如果为null
则不创建对象,而赋值为null
。对于company属性,如果为null则赋值为null
,否则创建相应的Company对象。
-
对personList中的元素实现先按照姓名升序排序,姓名相同再按照年龄升序排序。提示:可使用
Comparable<Person>
或Comparator<Person>
-
接受输入,如果输入为
exit
则return
退出程序,否则继续下面步骤。 -
将personList中的元素按照类型分别放到stuList与empList。注意:不要将两个内容相同的对象放入列表(是否相同是根据equals返回结果进行判定)。
-
输出字符串
stuList
,然后输出stuList中的每个对象。 -
输出字符串
empList
,然后输出empList中的每个对象。
1-3
为一个测试点 4-6
为一个测试点
输入样例:
s zhang 23 false 001 net15 e wang 18 true 3000.51 IBM s zhang 23 false 001 net15 e bo 25 true 5000.51 IBM e bo 25 true 5000.52 IBM e bo 18 true 5000.54 IBM e tan 25 true 5000.56 IBM e tan 25 true 5000.51 IBM s wang 17 false 002 null s wang 17 false 002 null e hua 16 false 1000 null s wang 17 false 002 net16 e hua 16 false 1000 null e hua 18 false 1234 MicroSoft ! continue
输出样例:
Employee:bo-18-true-IBM-5000.54 Employee:bo-25-true-IBM-5000.51 Employee:bo-25-true-IBM-5000.52 Employee:hua-16-false-null-1000.0 Employee:hua-16-false-null-1000.0 Employee:hua-18-false-MicroSoft-1234.0 Employee:tan-25-true-IBM-5000.56 Employee:tan-25-true-IBM-5000.51 Student:wang-17-false-002-null Student:wang-17-false-002-null Student:wang-17-false-002-net16 Employee:wang-18-true-IBM-3000.51 Student:zhang-23-false-001-net15 Student:zhang-23-false-001-net15 stuList Student:wang-17-false-002-null Student:wang-17-false-002-net16 Student:zhang-23-false-001-net15 empList Employee:bo-18-true-IBM-5000.54 Employee:bo-25-true-IBM-5000.51 Employee:hua-16-false-null-1000.0 Employee:hua-18-false-MicroSoft-1234.0 Employee:tan-25-true-IBM-5000.56 Employee:tan-25-true-IBM-5000.51 Employee:wang-18-true-IBM-3000.51
Code
import java.text.DecimalFormat; import java.util.*; abstract class Person implements Comparable<Person> { String name; int age; boolean gender; Person() { } Person(String name, int age, boolean gender) { this.name = name; this.age = age; this.gender = gender; } @Override public String toString() { return this.name + "-" + this.age + "-" + this.gender; } //返回"name-age-gender"格式的字符串 public boolean equals(Person o1) { if (this.name.equals(o1.name) && this.gender == o1.gender && this.age == o1.age) { return true; } else { return false; } }//比较name、age、gender,都相同返回true,否则返回false @Override public int compareTo(Person o) { if (this.name.compareTo(o.name) > 0) { return 1; } else if (this.name.compareTo(o.name) < 0) { return -1; } else { return this.age - o.age; } } } class Student extends Person { String stuNo; String clazz; Student() { super(); } Student(String name, int age, boolean gender, String stuNo, String clazz) { super(name, age, gender); this.stuNo = stuNo; this.clazz = clazz; } @Override public String toString() { return this.name + "-" + this.age + "-" + this.gender + "-" + this.stuNo + "-" + this.clazz; } public boolean equals(Student o2) { if (super.equals(o2) && this.stuNo.equals(o2.stuNo) && this.clazz.equals(o2.clazz)) { return true; } else { return false; } } } class Company { String name; Company(String name) { this.name = name; } @Override public String toString() { return name; } //直接返回name public boolean equals(Person o1) { if (o1.name == this.name) { return true; } else { return false; } } } class Employee extends Person { Company company; double salary; //建议使用super复用Person类的相关有参构造函数 Employee(String name, int age, boolean gender, double salary, Company company) { super(name, age, gender); this.company = company; this.salary = salary; } @Override public String toString() { return this.name + "-" + this.age + "-" + this.gender + "-" + this.company + "-" + this.salary; } public boolean equals(Employee e) { if (super.equals(e) && this.company.name.equals(e.company.name)) { String df1 = new DecimalFormat("#.#").format(this.salary); String df2 = new DecimalFormat("#.#").format(e.salary); return this.company.toString().compareTo(e.company.toString()) == 0 && df1.compareTo(df2) == 0; } else { return false; } } } class Main { public static void main(String[] args) { List<Person> personList = new ArrayList<>(); List<Student> stuList = new ArrayList<>(); List<Employee> empList = new ArrayList<>(); Scanner sc = new Scanner(System.in); String op; while (true) { op = sc.next(); //System.out.println(op); if (op.equals("s")) { String name; int age; boolean gender; String stuNo; String clazz; name = sc.next(); age = sc.nextInt(); gender = sc.nextBoolean(); stuNo = sc.next(); clazz = sc.next(); if (name.equals("null") || stuNo.equals("null")) { continue; } else { Student st = new Student(name, age, gender, stuNo, clazz); personList.add(st); } } else if (op.equals("e")) { String name; int age; boolean gender; String company; double salary; name = sc.next(); age = sc.nextInt(); gender = sc.nextBoolean(); salary = sc.nextDouble(); company = sc.next(); if (name.equals("null")) { continue; } else { Company cm = new Company(company); Employee em = new Employee(name, age, gender, salary, cm); personList.add(em); } } else { Collections.sort(personList); for (Person person : personList) { if (person instanceof Student) { Student student = (Student) person; int f = 1; for (Student stu : stuList) { if (stu.equals(student)) { f = 0; break; } } if (f == 1) { stuList.add(student); } System.out.println("Student:" + student); } else if (person instanceof Employee) { Employee employee = (Employee) person; int f = 1; for (Employee emp : empList) { if (emp.equals(employee)) { f = 0; break; } } if (f == 1) { empList.add(employee); } System.out.println("Employee:" + employee); } } op = sc.next(); if (op.equals("exit")) { break; } else if (op.equals("return")) { break; } System.out.println("stuList"); for (Student student : stuList) { System.out.println("Student:" + student); } System.out.println("empList"); for (Employee employee : empList) { System.out.println("Employee:" + employee); } } } } }
###