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<a.length;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();
      }
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345