Java练习题

创建一个球员类,并且该类最多只允许创建十一个对象。提示利用 static 和 封装性来完成。

类图如下:

效果如下:

class Players {

private static int sum;

/ **

* 无参构造方法

*

* /

private Players() {

}

public static Players create() {

sum = 1;

Players p = null;

while (sum <= 11){

p = new Players();

sum++;

System.out.println("创建了一个对象");

}

System.out.println("对不起,已经创建了11个对象。不能再创建对象了");

return p;

}

}

public class Exercise_07_01 {

public static void main(String[] args) {

// 对象的创建

Players.create();

}

}

(1)定义一个汽车类Vehicle,要求如下:

(a)属性包括:汽车品牌brand(String类型)、颜色color(String类型)和速度speed(double类型)。

(b)至少提供一个有参的构造方法(要求品牌和颜色可以初始化为任意值,但速度的初始值必须为0)。

(c)为属性提供访问器方法。注意:汽车品牌一旦初始化之后不能修改。

(d)定义一个一般方法run(),用打印语句描述汽车奔跑的功能

定义测试类VehicleTest,在其main方法中创建一个品牌为“benz”、颜色为“black”的汽车。

public class Vehicle {

private String brand;

private String color;

private double speed;

Vehicle(){

}

Vehicle(String brand,String color){

this.brand = brand;

this.color = color;

speed = 0;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

public double getSpeed() {

return speed;

}

public void setSpeed(double speed) {

this.speed = speed;

}

public void run(){

System.out.println(getColor()+"的"+getBrand()+"的速度是"+getSpeed());

}

public String getBrand() {

return brand;

}

}

(2)定义一个Vehicle类的子类轿车类Car,要求如下:

(a)轿车有自己的属性载人数loader(int 类型)。

(b)提供该类初始化属性的构造方法。

(c)重新定义run(),用打印语句描述轿车奔跑的功能。

(d)定义测试类Test,在其main方法中创建一个品牌为“Honda”、颜色为“red”,载人数为2人的轿车。

public class Car extends Vehicle {

int loader;

Car(){

}

Car(String brand,String color,int loader){

super(brand, color);

this.loader = loader;

}

public void run(){

System.out.println(getColor()+"的载人数"+loader+getBrand()+"的速度是"+getSpeed());

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Car car =new Car("Honda","red",2);

car.run();

}

设计四个类,分别是:

(1)Shape表示图形类,有面积属性area、周长属性per,颜色属性color,有两个构造方法(一个是默认的、一个是为颜色赋值的),还有3个抽象方法,分别是:getArea计算面积、getPer计算周长、showAll输出所有信息,还有一个求颜色的方法getColor。

public abstract class Shape {

double area;

double per;

char color;

Shape(){

}

Shape(char color){

this.color = color;

}

public abstract double getArea();

public abstract double getPer();

public abstract void showAll();

public char getColor(){

return color;

}

}

(2)2个子类:

1)Rectangle表示矩形类,增加两个属性,Width表示长度、height表示宽度,重写getPer、getArea和showAll三个方法,另外又增加一个构造方法(一个是默认的、一个是为高度、宽度、颜色赋值的)。

public class Rectangle extends Shape {

double width;

double height;

Rectangle(){

}

Rectangle(double width, double height,char color){

super(color);

this.width = width;

this.height = height;

}

@Override

public double getArea() {

area = width*height;

return area;

}

@Override

public double getPer() {

per = 2*(width+height);

return per;

}

@Override

public void showAll() {

System.out.println("长:"+width);

System.out.println("宽:"+height);

System.out.println("面积:"+getArea());

System.out.println("周长:"+getPer());

System.out.println("颜色:"+getColor());

}

}

2)Circle表示圆类,增加1个属性,radius表示半径,重写getPer、getArea和showAll三个方法,另外又增加两个构造方法(为半径、颜色赋值的)。

public class Circle extends Shape {

final double pi = 3.14;

double radius;

Circle(){

}

Circle(double radius,char color){

super(color);

this.radius = radius;

}

@Override

public double getArea() {

area = pi*radius*radius;

return area;

}

@Override

public double getPer() {

per = 2*pi*radius;

return per;

}

@Override

public void showAll() {

System.out.println("半径:"+radius);

System.out.println("面积:"+getArea());

System.out.println("周长:"+getPer());

System.out.println("颜色:"+getColor());

}

}

(3)一个测试类PolyDemo,在main方法中,声明创建每个子类的对象,并调用2个子类的showAll方法。

public class PolyDemo {

public static void main(String[] args) {

Rectangle r = new Rectangle(1,2,'蓝');

Circle c = new Circle(1.2,'红');

r.showAll();

System.out.println("-----------------");

c.showAll();

System.out.println("-----------------");

}

}

Cola公司的雇员分为以下若干类:

(1) ColaEmployee :这是所有员工总的父类,属性:员工的姓名,员工的生日月份。

方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100 元。

(2) SalariedEmployee : ColaEmployee 的子类,拿固定工资的员工。

属性:月薪

(3) HourlyEmployee :ColaEmployee 的子类,按小时拿工资的员工,每月工作超出160 小时的部分按照1.5 倍工资发放。

属性:每小时的工资、每月工作的小时数

(4) SalesEmployee :ColaEmployee 的子类,销售人员,工资由月销售额和提成率决定。

属性:月销售额、提成率

(5) 定义一个类Company,在该类中写一个方法,调用该方法可以打印出某月某个员工的工资数额,写一个测试类TestCompany,在main方法,把若干各种类型的员工放在一个ColaEmployee 数组里,并单元出数组中每个员工当月的工资。

public abstract class ColaEmployee {

String name;

int year;

int month;

int day;

ColaEmployee(){

}

ColaEmployee(String name,int year,int month,int day){

this.name = name;

this.day = day;

this.month = month;

this.year = year;

}

abstract double getSalary(int month);

}

public class SalariedEmployee extends ColaEmployee {

double salary;

SalariedEmployee(){

}

SalariedEmployee(String name,int year,int month,int day,double salary){

super(name, year, month, day);

this.salary =salary;

}

@Override

double getSalary(int month) {

if(month == this.month){

salary +=100;

}

return salary;

}

}

public class SalesEmployee extends ColaEmployee{

double monthSalary;

double rate;

SalesEmployee(){

}

public class HourlyEmployee extends ColaEmployee{

double hourSalary;

int hour;

HourlyEmployee(){

}

HourlyEmployee(String name,int year,int month,int day,double hourSalary,int hour){

super(name, year, month, day);

this.hourSalary =hourSalary;

this.hour = hour;

}

@Override

double getSalary(int month) {

double salary = 0;

if(hour<=160){

salary = hour * hourSalary;

}else{

salary = 160 * hourSalary + (hour - 160 )*hourSalary*1.5;

}

if(month == this.month){

salary +=100;

}

return salary;

}

}

SalesEmployee(String name,int year,int month,int day,double monthSalary,double rate){

super(name, year, month, day);

this.monthSalary =monthSalary;

this.rate = rate;

}

@Override

double getSalary(int month) {

double salary=monthSalary * rate;

if(month == this.month){

salary +=100;

}

return salary;

}

}

public class Company {

static void getSalary(int month,ColaEmployee c){

System.out.println(month+"月"+c.name+"的工资:"+c.getSalary(month));

}

}

public class TestCompany {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

ColaEmployee[] a = new ColaEmployee[3];

a[0]=new SalariedEmployee("大川",1988,2,29,3500);

a[1]=new HourlyEmployee("海鸥",1988,2,29,20,200);

a[2]=new SalesEmployee("abc",1988,5,10,30000,0.1);

for(ColaEmployee c:a){

Company.getSalary(2, c);

}

}

}

利用接口实现动态的创建对象:

(1)创建4个类

1苹果

2香蕉

3葡萄

4园丁

(2)在三种水果的构造方法中打印一句话.

以苹果类为例

class apple

{

public apple()

{

System.out.println(“创建了一个苹果类的对象”);

}

}

(3)类图如下:

(4)要求从控制台输入一个字符串,根据字符串的值来判断创建三种水果中哪个类的对象。

运行结果如图:

public abstract interface Fruit {

}

public class Apple implements Fruit{

Apple(){

System.out.println("创建了一个苹果类的对象");

}

}

public class Banana implements Fruit{

Banana(){

System.out.println("创建了一个香蕉类的对象");

}

}

public class Putao implements Fruit{

Putao(){

System.out.println("创建了一个葡萄类的对象");

}

}

public class Gardener {

public Fruit creat(){

Fruit f =null;

Scanner input =new Scanner(System.in);

String name = input.next();

if(name.equals("苹果")){

f = new Apple();

}else if(name.equals("香蕉")){

f = new Banana();

}else if(name.equals("葡萄")){

f =new Putao();

}else{

System.out.println("不会种");

}

return f;

}

}

编写三个系别的学生类:英语系,计算机系,文学系(要求通过继承学生类)各系有以下成绩:

英语系: 演讲,期末考试,期中考试;

计算机系:操作能力,英语写作,期中考试,期末考试;

文学系: 演讲,作品,期末考试,期中考试;

各系总分评测标准:

英语系: 演讲 50%

期末考试 25%

期中考试 25%

计算机系: 操作能力 40%

英语写作 20%

期末考试 20%

期中考试 20%

文学系: 演讲 35%

作品 35%

期末考试 15%

期中考试 15%

定义一个可容纳5个学生的学生类数组,使用随机数给该数组装入各系学生的对象,然后按如下格式输出数组中的信息:

学号:XXXXXXXX 姓名:XXX 性别:X 年龄:XX 综合成绩:XX

public abstract class Student {

String name;

String id;

String sex;

int age;

double lastScore; // 期末成绩

double minScore; //期中成绩

Student(String name,String id,String sex,int age,double lastScore,double minScore){

this.name = name;

this.age =age;

this.id = id;

this.sex = sex;

this.lastScore = lastScore;

this.minScore = minScore;

}

Student(){

}

public abstract double getScore(); //获取最终成绩

public void show(){

System.out.println("学号:"+id+"姓名:"+name+" 性别:"+sex+" 年龄:"+age+" 综合成绩:"+getScore());

}

}

public class English extends Student{

double speekScore;

English(){

}

English(String name,String id,String sex,int age,double lastScore,double minScore,double speekScore){

super(name, id, sex, age, lastScore, minScore);

this.speekScore = speekScore;

}

public double getScore(){

return lastScore*0.25+minScore*0.25+speekScore*0.5;

}

}

public class Computer extends Student{

double makeScore; //操作成绩

double engScore; //英语写作成绩

Computer(){

}

Computer(String name,String id,String sex,int age,double lastScore,double minScore,double makeScore,double engScore){

super(name, id, sex, age, lastScore, minScore);

this.makeScore = makeScore;

this.engScore = engScore;

}

@Override

public double getScore() {

// TODO Auto-generated method stub

return lastScore*0.2+minScore*0.2+engScore*0.2+makeScore*0.4;

}

}

public class Literature extends Student{

double speekScore;

double composition;

Literature(){

}

Literature(String name,String id,String sex,int age,double lastScore,double minScore,double speekScore,double composition){

super(name, id, sex, age, lastScore, minScore);

this.composition =composition;

this.speekScore = speekScore;

}

@Override

public double getScore() {

// TODO Auto-generated method stub

return lastScore*0.15+minScore*0.15+speekScore*0.35+composition*0.35;

}

}

public class Test {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

String sex;

Student[] a = new Student[5];

for(int i=0;i

sex ="男";

if(Math.random()<0.5){

sex = "女";

}

if(Math.random()*3 >2){

a[i] = new English((int)(Math.random()*1000)+"",(int)(Math.random()*1000000)+"",sex,(int)((Math.random()+0.1)*100),(Math.random()+1)*100,(Math.random()+1)*100,(Math.random()+1)*100);

}else if(Math.random()*3 >1){

a[i] = new Computer((int)(Math.random()*1000)+"",(int)(Math.random()*1000000)+"",sex,(int)((Math.random()+0.1)*100),(Math.random()+1)*100,(Math.random()+1)*100,(Math.random()+1)*100,(Math.random()+1)*100);

}else{

a[i] = new Literature((int)(Math.random()*1000)+"",(int)(Math.random()*1000000)+"",sex,(int)((Math.random()+0.1)*100),(Math.random()+1)*100,(Math.random()+1)*100,(Math.random()+1)*100,(Math.random()+1)*100);

}

}

for(Student s:a){

s.show();

}

}

}