十、 Java封装练习题
● 定义“人”类,“人”类包括这些属性:姓名、性别、年龄等。使用封装的方式编写程序,要求对年龄进行安全控制,合法的年龄范围为[0~100],其他值表示不合法。
public class People {
private String name;
private boolean sex;
private int age;
public String getName() {
return name;
}
public void setName(String _name) {
name = _name;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean _sex) {
sex = _sex;
}
public int getAge() {
return age;
}
public void setAge(int _age) {
if(_age < 0 || _age > 100){
throw new RuntimeException("年龄不合法!");
}
age = _age;
}
}
public class PeopleTest {
public static void main(String[] args) {
People p = new People();
p.setName("张三");
p.setAge(20);
p.setSex(true);
System.out.println("姓名 = " + p.getName());
System.out.println("性别 = " + (p.isSex() ? "男" : "女"));
System.out.println("年龄 = " + p.getAge());
p.setAge(-100);
}
}
执行结果如下图所示:
● 选择题(B)
public class Test {
static int value = 9;
public static void main(String[] args) throws Exception{
new Test().printValue();
}
public void printValue(){
int value = 69;
System.out.println(this.value);
}
}
A. 编译错误B. 打印9
C. 打印69
D. 运行时抛出异常
● 判断下面代码的输出结果,并说明原因
public class User {
private String name;
public User(){
}
public void setName(String name){
name = name;
}
public String getName(){
return name;
}
}
public class UserTest {
public static void main(String[] args) {
User user = new User();
user.setName("zhangsan");
System.out.println(user.getName());
}
}
最终的输出结果是:null原因:setName方法体当中的name = name是把局部变量name赋值给局部变量name,和实例变量name无关,所以getName()方法获取的实例变量值是null。
● 找出下面代码的错误,并说明为什么错了
public class Test {
int i;
static int j;
public void m1(){
System.out.println(i);
System.out.println(j);
m2();
m3();
}
public void m2(){
}
public static void m3(){
System.out.println(i);
System.out.println(j);
m2();
m4();
}
public static void m4(){
}
}
第13,15行编译报错,因为静态方法中无法直接访问实例变量i和实例方法m2()。● 定义猴子类,猴子有名字和性别等属性,并且定义猴子说话的方法,定义人类,人有名字和性别等属性,并且定义人说话的方法。使用继承,让代码具有复用性。
public class Monkey {
private String name;
private boolean sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public Monkey() {
super();
}
public Monkey(String name, boolean sex) {
super();
this.name = name;
this.sex = sex;
}
public void speak(){
System.out.println(name + "咿咿呀呀!");
}
}
public class People extends Monkey{
public void speak(){
System.out.println(this.getName() + ",呦,小伙会说话了!");
}
}
● 定义动物类,动物有名字属性,并且定义动物移动的方法,定义鱼类,鱼有名字属性,有颜色属性,并且定义鱼移动的方法。使用继承,让代码具有复用性。
public class Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Animal() {
super();
}
public Animal(String name) {
super();
this.name = name;
}
public void move(){
System.out.println(name + " is moving!");
}
}
public class Fish extends Animal{
public void move(){
System.out.println(this.getName() + "正在水里欢快的游来游去!");
}
}
十三、 Java方法覆盖和多态练习题● 实现愤怒的小鸟
我们有很多种小鸟,每种小鸟都有飞的行为,还有一个弹弓,弹弓有一个弹射的行为,弹射时把小鸟弹出去,之后小鸟使用自己飞行的行为飞向小猪(不要求编写小猪的代码)。不同种类的小鸟有不同飞行的方式:
红火:红色小鸟,飞行方式:正常
蓝冰:蓝色小鸟,飞行方式:分成3个
黄风:黄色小鸟,飞行方式:加速。
//小鸟
public class Bird {
//飞
public void fly(){
}
}
public class RedBird extends Bird{
public void fly(){
System.out.println("正常的飞翔");
}
}
public class BlueBird extends Bird{
public void fly(){
System.out.println("变成了3只小鸟一起飞");
}
}
public class YellowBird extends Bird{
public void fly(){
System.out.println("加速飞翔");
}
}
//弹弓
public class Slingshot {
//射
public void shot(Bird bird){
//鸟儿飞
bird.fly();
}
}
public class Test {
public static void main(String[] args) {
Bird redBird = new RedBird();
Bird blueBird = new BlueBird();
Bird yellowBird = new YellowBird();
Slingshot ss = new Slingshot();
ss.shot(redBird);
ss.shot(blueBird);
ss.shot(yellowBird);
}
}
执行结果如下图所示:
● 计算不同类型的员工薪资
定义员工类Employee,员工包含姓名name、出生月份birthMonth两个属性,员工有获取指定月份工资的方法(getSalary(int month)),如果该月员工生日,公司补助250元。
定义有固定工资的员工类SalariedEmployee,有月薪monthlySalary属性。
定义小时工类HourlyEmployee,包含工作小时数hours和每小时的工资hourlySalary属性,如果每月工作超过160小时,超过的部分按1.5倍工资发放。
定义销售人员类SalesEmployee,包含月销售额sales和提成比例comm属性。
public class Employee {
private String name;
private int birthMonth;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBirthMonth() {
return birthMonth;
}
public void setBirthMonth(int birthMonth) {
this.birthMonth = birthMonth;
}
public double getSalary(int month){
return 0.0;
}
}
public class SalariedEmployee extends Employee {
private double monthlySalary;
public double getMonthlySalary() {
return monthlySalary;
}
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
public double getSalary(int month){
if(month == this.getBirthMonth()){
return monthlySalary + 250;
}
return monthlySalary;
}
}
public class HourlyEmployee extends Employee {
private int hours;
private double hourlySalary;
public int getHours() {
return hours;
}
public void setHours(int hours) {
this.hours = hours;
}
public double getHourlySalary() {
return hourlySalary;
}
public void setHourlySalary(double hourlySalary) {
this.hourlySalary = hourlySalary;
}
public double getSalary(int month){
double money = 0.0;
if(hours <= 160){
money = hourlySalary * hours;
}else{
money = hourlySalary * 160 + hourlySalary * (hours - 160) * 1.5;
}
if(month == this.getBirthMonth()){
money += 250;
}
return money;
}
}
public class SalesEmployee extends Employee {
private double sales;
private double comm;
public double getSales() {
return sales;
}
public void setSales(double sales) {
this.sales = sales;
}
public double getComm() {
return comm;
}
public void setComm(double comm) {
this.comm = comm;
}
public double getSalary(int month){
if(month == this.getBirthMonth()){
return sales * comm + 250;
}
return sales * comm;
}
}
public class Test {
public static void main(String[] args) {
SalariedEmployee e1 = new SalariedEmployee();
e1.setName("张三");
e1.setBirthMonth(2);
e1.setMonthlySalary(5000.0);
System.out.println(e1.getName() + "的2月份工资是" + e1.getSalary(2));
HourlyEmployee e2 = new HourlyEmployee();
e2.setName("李四");
e2.setBirthMonth(2);
e2.setHourlySalary(50);
e2.setHours(170);
System.out.println(e2.getName() + "的2月份工资是" + e2.getSalary(2));
SalesEmployee e3 = new SalesEmployee();
e3.setName("王五");
e3.setBirthMonth(2);
e3.setSales(10000.0);
e3.setComm(0.5);
System.out.println(e3.getName() + "的2月份工资是" + e3.getSalary(2));
}
}
执行结果如下图所示:
● 某汽车租赁公司有多种汽车可以出租,计算汽车租金
Vehicle是所有车的父类,属性:品牌、车牌号,有返回总租金的方法:public double getSumRent(int days){}
小轿车类Car是Vehicle的子类,属性:车型(两厢、三厢、越野),两厢每天300,三厢每天350,越野每天500。
多座汽车类Bus是Vehicle的子类,属性:座位数,座位数<=16的每天400,座位数>16的每天600。
编写测试类,根据用户选择不同的汽车,计算总租金。
public class Vehicle {
private String brand;
private String licensePlateNumber;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getLicensePlateNumber() {
return licensePlateNumber;
}
public void setLicensePlateNumber(String licensePlateNumber) {
this.licensePlateNumber = licensePlateNumber;
}
public Vehicle() {
super();
}
public double getSumRent(int days){
return 0.0;
}
}
public class Car extends Vehicle {
//车型:两厢(300/天)、三厢(350/天)、越野(500/天)
private String models;
public String getModels() {
return models;
}
public void setModels(String models) {
this.models = models;
}
public Car() {
super();
}
public double getSumRent(int days){
if("两厢".equals(models)){
return 300 * days;
}else if("三厢".equals(models)){
return 350 * days;
}else{
return 500 * days;
}
}
}
public class Bus extends Vehicle {
//座位数
private int seats;
public int getSeats() {
return seats;
}
public void setSeats(int seats) {
this.seats = seats;
}
public Bus() {
super();
}
public double getSumRent(int days){
if(seats <= 16){
return 400 * days;
}else{
return 600 * days;
}
}
}
public class Test {
public static void main(String[] args) {
Car c = new Car();
c.setBrand("宝马");
c.setLicensePlateNumber("京A 88888");
c.setModels("三厢");
System.out.println("品牌:" + c.getBrand() + ",车牌号:" + c.getLicensePlateNumber() + ",10天总租金:" + c.getSumRent(10));
Bus b = new Bus();
b.setBrand("海格");
b.setLicensePlateNumber("京B 88888");
b.setSeats(60);
System.out.println("品牌:" + b.getBrand() + ",车牌号:" + b.getLicensePlateNumber() + ",10天总租金:" + b.getSumRent(10));
}
}
执行结果如下图所示:
● 请判断以下代码的输出结果
public class Text {
public static int k = 0;
public static Text t1 = new Text("t1");
public static Text t2 = new Text("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
static {
print("静态块");
}
public Text(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String args[]) {
new Text("init");
}
}