6-21 从shape类扩展出一个正五边形类 (10 分)
从下列的shape类扩展出一个正五边形(regular pentagon)类RPentagon,这个类将正五边形的边长作为私有成员,类中包含初始化这个值的构造方法。
public class shape {// 形状类
public double getArea()// 求面积
{ return 0; }
public double getPerimeter()// 求周长
{ return 0; }
计算正五边形的面积公式为:
import java.util.Scanner;
import java.text.DecimalFormat;
class shape {// 形状类
public double getArea()// 求面积
{ return 0; }
public double getPerimeter()// 求周长
{ return 0; }
}
/* 你提交的代码将被嵌入到这里 */
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
DecimalFormat d = new DecimalFormat("#.####");// 保留4位小数
double side = input.nextDouble();
shape rp = new RPentagon(side);
System.out.println(d.format(rp.getArea()));
System.out.println(d.format(rp.getPerimeter()));
input.close();
}
}
答案
class RPentagon extends shape {
RPentagon(double side) {
a = side;
}
@Override
public double getArea() {
return 0.25 * a * a * Math.sqrt(25 + 10 * Math.sqrt(5));
}
@Override
public double getPerimeter() {
return 5 * a;
}
private double a;
}
6-2 jmu-Java-03面向对象基础-覆盖与toString (3 分)
有Person类,Company类,Employee类。
其中Employee类继承自Person类,属性为:
private Company company;
private double salary;
现在要求编写Employee类的toString方法,返回的字符串格式为:父类的toString-company的toString-salary
函数接口定义:
public String toString()
public String toString() {
return super.toString()+"-"+company.toString()+"-"+salary;
}
7-1 jmu-Java-03面向对象基础-05-覆盖 (3 分)
Java每个对象都继承自Object,都有equals、toString等方法。
现在需要定义PersonOverride类并覆盖其toString与equals方法。
- 新建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. - 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代替数组大幅复简化代码,请尝试重构你的代码。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner se=new Scanner (System.in);
int n1=se.nextInt();
PersonOverride persons1[] =new PersonOverride[n1];
for(int i=0;i<n1;i++) {
persons1[i]=new PersonOverride();
System.out.println(persons1[i].toString());
}
int n2=se.nextInt();
ArrayList<PersonOverride> persons2=new ArrayList<PersonOverride>();
for(int i=0;i<n2;i++) {
PersonOverride a=new PersonOverride(se.next(),se.nextInt(),se.nextBoolean());
if(!persons2.contains(a)) {
persons2.add(a);
System.out.println(a.toString());
}
}
System.out.println(persons2.size());
System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));
}
}
class PersonOverride {
private String name;
private int age;
private boolean gender;
public PersonOverride() {
this.name = "default";
this.age = 1;
this.gender = true;
}
public PersonOverride(String name, int age, boolean gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return name + "-" + age + "-" + gender;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + (gender ? 1231 : 1237);
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PersonOverride other = (PersonOverride) obj;
if (age != other.age)
return false;
if (gender != other.gender)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
}
7-2 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (15 分)
定义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 personList。输入其他字符,则结束创建。
创建说明: 对于String类型,如果为null则不创建对象,而赋值为null。对于company属性,如果为null则赋值为null,否则创建相应的Company对象。
对personList中的元素实现先按照姓名升序排序,姓名相同再按照年龄升序排序。提示:可使用Comparable或Comparator
接受输入,如果输入为exit则return退出程序,否则继续下面步骤。
将personList中的元素按照类型分别放到stuList与empList。注意:不要将两个内容相同的对象放入列表(是否相同是根据equals返回结果进行判定)。
输出字符串stuList,然后输出stuList中的每个对象。
输出字符串empList,然后输出empList中的每个对象。
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws InterruptedException {
Scanner sc=new Scanner(System.in);
List<Person> personList=new ArrayList<Person>();
String name;
int age;
boolean gender;
String stuNo;
String clazz;
String companyName;
Company company;
double salary;
//输入
while(true) {
String t=sc.next();
if(t.equals("s")) {
name=sc.next();
age=sc.nextInt();
gender=sc.nextBoolean();
stuNo=sc.next();
clazz=sc.next();
if(name==null||stuNo==null||clazz==null) {
continue;
}
personList.add(new Student(name, age, gender, stuNo, clazz));
}else if(t.equals("e")){
name=sc.next();
age=sc.nextInt();
gender=sc.nextBoolean();
salary=sc.nextDouble();
companyName=sc.next();
company=new Company(companyName);
if(name==null) {
continue;
}
//除了companyName可以为空,其他为空均不能创建对象(应该是这么理解吧)
if(companyName==null) {
companyName="null"; //为空的话要给他赋值为空(删了也能过 可能写了句废话 )
}
personList.add(new Employee(name, age, gender, company, salary));
}else{ //要是遇到感叹号就该结束输入啦(题目上好像没说)
break;
}
}
//排序(因为之前的类都建好了,Person类还是抽象类,所以比较器只能用Comparator了)
Collections.sort(personList, new Name_AgeComparator());
for(int i=0;i<personList.size();i++) {
System.out.println(personList.get(i).toString());
}
//只要不输入return和exit就要分组啦
String str=sc.next();
while(true) {
if(str.equals("return")||str.equals("exit")) {
break;
}else {
//分组
List<Person> stuList=new ArrayList<Person>();
List<Person> empList=new ArrayList<Person>();
//判断过程要根据equals 是自己定义的 所以比较工资那有坑,用contains是不行的 所以还是循环比较吧
boolean flag1=true;
boolean flag2=true;
for(int i=0;i<personList.size();i++) {
if(personList.get(i).toString().indexOf("Student")>=0) {
if(stuList.size()==0) {
stuList.add(personList.get(i));
}
for(int j=0;j<stuList.size();j++) {
if(personList.get(i).equals(stuList.get(j))){
flag1=false;
}
}
if(flag1) {
stuList.add(personList.get(i));
}
flag1=true;
}else {
if(empList.size()==0) {
empList.add(personList.get(i));
}
for(int j=0;j<empList.size();j++) {
if(personList.get(i).equals(empList.get(j))){
flag2=false;
}
}
if(flag2) {
empList.add(personList.get(i));
}
flag2=true;
}
}
System.out.println("stuList");
for(int i=0;i<stuList.size();i++) {
System.out.println(stuList.get(i).toString());
}
System.out.println("empList");
for(int i=0;i<empList.size();i++) {
System.out.println(empList.get(i).toString());
}
break;
}
}
}
//Comparator需要创建一个类,又因为想在main方法里直接调,所以就要用static修饰
static class Name_AgeComparator implements Comparator<Person>{ //不加这个泛型也可以,但以后要强制转换
@Override
public int compare(Person o1, Person o2) {
if(o1.name.compareTo(o2.name)==0) {
if(o1.age==o2.age) {
return 0;
}else if(o1.age<o2.age) {
return -1;
}else {
return 1;
}
}else {
//比较字符串的方法(放张图片吧)
return(o1.name.compareTo(o2.name));
}
}
}
}
abstract class Person{
String name;
int age;
boolean gender;
public Person(String name, int age, boolean gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return this.name+'-'+String.valueOf(this.age)+'-'+String.valueOf(this.gender);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (gender != other.gender)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
class Student extends Person{
String stuNo;
String clazz;
public Student(String name, int age, boolean gender, String stuNo, String clazz) {
super(name,age,gender);
this.clazz=clazz;
this.stuNo=stuNo;
}
@Override
public String toString() {
return"Student:"+ super.toString()+'-'+this.stuNo+'-'+this.clazz;
}
@Override
public boolean equals(Object obj) {
if (!super.equals(obj))
return false;
if (this == obj)
return true;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (clazz == null) {
if (other.clazz != null)
return false;
} else if (!clazz.equals(other.clazz))
return false;
if (stuNo == null) {
if (other.stuNo != null)
return false;
} else if (!stuNo.equals(other.stuNo))
return false;
return true;
}
}
class Company{
String name;
public Company(){
}
public Company(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Company other = (Company) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
class Employee extends Person{
Company company;
double salary;
public Employee(String name, int age, boolean gender, Company company, double salary) {
super(name, age, gender);
this.company = company;
this.salary = salary;
}
@Override
public String toString() {
return "Employee:"+ super.toString()+'-'+company+'-'+salary;
}
@Override
public boolean equals(Object obj) {
if (!super.equals(obj))
return false;
if (this == obj)
return true;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (company == null) {
if (other.company != null)
return false;
}
else if (!company.equals(other.company))
return false;
//坑在这啊,要用decimal比较,要学会decimal这种用法
DecimalFormat df = new DecimalFormat("#.#");
if (!df.format(salary) .equals( df.format(other.salary)))
return false;
return true;
}
}