【面向对象小练习】封装

知识点

面向对象

基础+拓展


1.基础编程题

题目1(训练)

定义手机类,手机有品牌(brand),价格(price)和颜色(color)三个属性,有打电话call()和sendMessage()两个功能。

请定义出手机类,类中要有空参、有参构造方法,set/get方法。

定义测试类,在主方法中使用空参构造创建对象,使用set方法赋值。

调用对象的两个功能,打印效果如下:

//测试类
public class demo3 {
    public static void main(String[] args) {
        Phone phone = new Phone();//使用空参构造创建对象
        phone.setBrand("小米");//使用set方法赋值
        phone.setColor("黑色");
        phone.setPrice(3998);
        phone.call();//调用对象的两个功能
        phone.sendMessage();
    }
}
​
//定义手机类
public class Phone {
    //手机有品牌(brand),价格(price)和颜色(color)三个属性
   private String brand;
    private int price;
    private String color;
    //空参构造方法
    public Phone(){
​
    }
    //有参构造方法
    public Phone(String brand,int price,String color){
        this.brand = brand;
        this.price = price;
        this.color = color;
    }
    //set/get方法
    public void setBrand(String brand) {
        this.brand = brand;
    }
​
    public String getBrand() {
        return brand;
    }
​
    public void setColor(String color) {
        this.color = color;
    }
​
    public String getColor() {
        return color;
    }
​
    public void setPrice(int price) {
        this.price = price;
    }
​
    public int  getPrice() {
        return price;
    }
    //有打电话call()和sendMessage()两个功能
    public void call(){
        System.out.println("正在使用价格为"+price+"元"+color+"的"+brand+"打电话....");
    }
    public  void  sendMessage(){
        System.out.println("正在使用价格为"+price+"元"+color+"的"+brand+"发信息....");
    }
}
正在使用价格为3998元黑色的小米手机打电话....
正在使用价格为3998元黑色的小米手机发短信....

训练提示

  1. 类中的属性就是成员变量,类中的行为功能就是成员方法。

  2. 成员变量要被private修饰。

解题方案

操作步骤

  1. 定义手机类,手机类中定义String类型的品牌,int类型的价格,String类型的颜色,三个成员变量都用privice修饰。

  2. 提供空参构造方法和有参构造方法。

  3. 提供set/get方法。

  4. 编写打电话的成员方法,方法中对成员变量进行使用。

  5. 编写发短信的成员方法,方法中对成员变量进行使用。

  6. 在测试类中创建手机对象,使用set方法赋值,分别调用各个方法。

参考答案

手机类:
public class Phone {
    //定义品牌
    private String brand;
    //定义价格
    private int price;
    //定义颜色
    private String color;
​
    //提供空参构造
    public Phone() {
    }
    //提供有参构造
    public Phone(String brand, int price, String color) {
        this.brand = brand;
        this.price = price;
        this.color = color;
    }
    //提供set/get方法
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    //定义打电话方法
    public void call(){
        System.out.println("正在使用价格为"+price+"元"+color+"的"+brand+"手机打电话....");
    }
    //定义发短信方法
    public void sendMessage(){
        System.out.println("正在使用价格为"+price+"元"+color+"的"+brand+"手机发短信....");
    }
}
​
测试类:
public class Demo1 {
    public static void main(String[] args) {
        //创建手机对象
        Phone p = new Phone();
        //调用set方法赋值
        p.setBrand("小米");
        p.setPrice(3998);
        p.setColor("黑色");
        //调用打电话功能
        p.call();
        //调用发短信功能
        p.sendMessage();
    }
}

题目2(训练)

定义一个女朋友类。女朋友的属性包含:姓名,身高,体重。行为包含:洗衣服wash(),做饭cook()。另外定义一个用于展示三个属性值的show()方法。请在测试类中通过有参构造方法创建对象并赋值,然后分别调用展示方法、洗衣服方法和做饭方法。打印效果如下:

//测试类
public class demo3 {
    public static void main(String[] args) {
        //通过有参构造方法创建对象并赋值
        GirlFriend girlFriend = new GirlFriend("凤姐",155,130);
        //调用展示方法、洗衣服方法和做饭方法
        girlFriend.show();
        girlFriend.wash();
        girlFriend.cook();
    }
}
​
//定义一个女朋友类
public class GirlFriend {
    //女朋友的属性包含:姓名,身高,体重
    private String name;
    private double high;
   private double weight;
    //行为包含:洗衣服wash(),做饭cook()
    public void wash(){
        System.out.println("女朋友帮我洗衣服");
    }
    public void cook(){
        System.out.println("女朋友帮我做饭");
    }
    //定义一个用于展示三个属性值的show()方法
    public void show(){
        System.out.println("我女朋友叫"+name+"身高"+high+"厘米,体重"+weight+"斤");
    }
    //有参构造方法
    public GirlFriend(String name,double high,double weight){
        this.high=high;
        this.name=name;
        this.weight=weight;
    }
       //空参构造
    public Girlfriend() {
    }
}
我女朋友叫凤姐,身高155.0厘米,体重130.0斤
女朋友帮我洗衣服
女朋友给我做饭

训练提示

  1. 类中的属性就是成员变量,类中的行为功能就是成员方法。

  2. 成员变量要被private修饰。

  3. 展示方法的作用就是打印姓名、身高、体重三个成员变量的值。

解题方案

操作步骤

  1. 定义女朋友类,定义String类型姓名,double类型身高和double类型体重三个成员变量,三个成员变量都用privice修饰。

  2. 提供空参构造方法和有参构造方法。

  3. 提供set/get方法。

  4. 编写展示方法show(),方法打印三个成员变量的值。

  5. 编写洗衣服wash()方法,输出洗衣服的语句。

  6. 编写做饭cook()方法,输出做饭的语句。

  7. 在测试类中使用有参构造创建女友对象,分别调用各个方法。

参考答案

女朋友类:
public class Girlfriend {
    //姓名
    private String name;
    //身高
    private double height;
    //体重
    private double weight;
    //空参构造
    public Girlfriend() {
    }
    //有参构造
    public Girlfriend(String name, double height, double weight) {
        this.name = name;
        this.height = height;
        this.weight = weight;
    }
    //set/get方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
    //展示方法
    public void show(){
        System.out.println("我女朋友叫" +name+",身高" +height+"厘米,体重"+weight+"斤");
    }
    //洗衣服方法
    public void wash(){
        System.out.println("女朋友帮我洗衣服");
    }
    //做饭方法
    public void cook(){
        System.out.println("女朋友给我做饭");
    }
}
测试类:
public class Demo2 {
    public static void main(String[] args) {
        //创建女朋友对象
        Girlfriend gf = new Girlfriend("凤姐",155,130);
        //调用展示方法
        gf.show();
        //调用洗衣服方法
        gf.wash();
        //调用做饭方法
        gf.cook();
    }
}

题目3(训练)

定义项目经理类Manager。属性:姓名name,工号id,工资salary,奖金bonus。行为:工作work() 定义程序员类Coder。属性:姓名name,工号id,工资salary。行为:工作work()

要求:

1.按照以上要求定义Manager类和Coder类,属性要私有,生成空参、有参构造,set和get方法 ​ 2.定义测试类,在main方法中创建该类的对象并给属性赋值(set方法或有参构造方法) ​ 3.调用成员方法,打印格式如下:

//测试类
public class demo3 {
    public static void main(String[] args) {
        //通过有参构造方法创建对象并赋值
        Manager manager = new Manager("项目经理",123,15000,6000);
       //通过set方法方法创建对象并赋值
        Coder coder = new Coder();
        coder.setId(135);
        coder.setName("程序员");
        coder.setSalary(10000);
        //调用成员方法
        manager.work();
        coder.work();
    }
}
​
//定义项目经理类Manager
public class  Manager{
    //属性:姓名name,工号id,工资salary,奖金bonus,属性要私有
    private String name;
    private int id;
    private int salary;
    private int bonus;
    //行为:工作work()
    public void work(){
        System.out.println("工号为"+id+"基本工资为"+salary+"奖金为"+bonus+"的"+name+"正在努力的做着管理工作,分配任务,检查员工提交上来的代码.....");
    }
    //空参、有参构造
    public Manager(){
​
    }
    public Manager(String name,int id,int salary,int bonus){
        this.bonus=bonus;
        this.id=id;
        this.salary=salary;
        this.name=name;
    }
//set和get方法
    public void setBonus(int bonus) {
        this.bonus = bonus;
    }
​
    public int getBonus() {
        return bonus;
    }
​
    public void setId(int id) {
        this.id = id;
    }
​
    public int getId() {
        return id;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getName() {
        return name;
    }
​
    public void setSalary(int salary) {
        this.salary = salary;
    }
​
    public int getSalary() {
        return salary;
    }
}
​
//定义程序员类Coder
public class Coder{
    //属性:姓名name,工号id,工资salary,属性要私有
 private String name;
 private int id;
 private int salary;
 //行为:工作work()
    public void work(){
        System.out.println("工号为"+id+"基本工资为"+salary+"的"+name +"正在努力的写着代码......");
    }
 //生成空参、有参构造
    public Coder(){}
    public Coder(String name,int id,int salary){
        this.salary=salary;
        this.id=id;
        this.name=name;
    }
    //set和get方法
​
    public void setSalary(int salary) {
        this.salary = salary;
    }
​
    public int getSalary() {
        return salary;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getName() {
        return name;
    }
​
    public void setId(int id) {
        this.id = id;
    }
​
    public int getId() {
        return id;
    }
}
​
工号为123基本工资为15000奖金为6000的项目经理正在努力的做着管理工作,分配任务,检查员工提交上来的代码.....
工号为135基本工资为10000的程序员正在努力的写着代码......

训练提示

  1. 类中的属性就是成员变量,类中的行为功能就是成员方法。

  2. 成员变量要被private修饰。

  3. 在工作work()方法中调用成员变量,输出成员变量的值。

解题方案

操作步骤

  1. 定义项目经理类,定义成员变量,构造方法,set和get方法,work方法,方法中根据打印格式输出id,salary,bonus的值。

  2. 定义程序猿类,定义成员变量,构造方法,set和get方法,work方法,方法中根据打印格式输出id和salary的值。

  3. 在测试类中使用有参构造创建项目经理对象并赋值,调用工作方法打印结果。

  4. 在测试类中使用有参构造创建程序员对象并赋值,调用工作方法打印结果。

参考答案

经理类:
public class Manager {
    private String name;
    private int id;
    private int salary;
    private int bonus;
    public Manager() {
    }
    public Manager(String name, int id, int salary, int bonus) {
        this.name = name;
        this.id = id;
        this.salary = salary;
        this.bonus = bonus;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getSalary() {
        return salary;
    }
    public void setSalary(int salary) {
        this.salary = salary;
    }
    public int getBonus() {
        return bonus;
    }
    public void setBonus(int bonus) {
        this.bonus = bonus;
    }
    public void work(){
        System.out.println("工号为"+id+"基本工资为"+salary+"奖金为"+bonus+"的项目经理正在努力的做着管理工作,分配任务,检查员工提交上来的代码.....");
    }
}
程序员类:
package com.day07;
​
public class Coder {
    private String name;
    private int id;
    private int salary;
    public Coder() {
    }
    public Coder(String name, int id, int salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getSalary() {
        return salary;
    }
    public void setSalary(int salary) {
        this.salary = salary;
    }
    public void work(){
        System.out.println("工号为"+id+"基本工资为"+salary+"的程序员正在努力的写着代码......");
    }
}
测试类:
public class Demo3 {
    public static void main(String[] args) {
        //创建经理对象
        Manager m = new Manager("老王",123,15000,6000);
        //调用工作方法
        m.work();
        //创建程序员对象
        Coder c = new Coder("小王",135,10000);
        //调用工作方法
        c.work();
    }
}

题目4(训练)

定义猫类Cat。属性:毛的颜色color,品种breed。行为:吃饭eat(),抓老鼠catchMouse() 定义狗类Dog。属性:毛的颜色color,品种breed。行为:吃饭(),看家lookHome() 要求: ​ 1.按照以上要求定义Cat类和Dog类,属性要私有,生成空参、有参构造,set和get方法 ​ 2.定义测试类,在main方法中创建该类的对象并给属性赋值(set方法或有参构造方法) ​ 3.调用成员方法,打印格式如下:

花色的波斯猫正在吃鱼.....
花色的波斯猫正在逮老鼠....
黑色的藏獒正在啃骨头.....
黑色的藏獒正在看家.....

训练提示

  1. 类中的属性就是成员变量,类中的行为功能就是成员方法。

  2. 成员变量要被private修饰。

解题方案

操作步骤

  1. 定义猫类,定义成员变量,构造方法,set和get方法,吃饭方法eat(),抓老鼠方法catchMouse(),方法中根据题目给出的格式输出成员变量的值。

  2. 定义狗类,定义成员变量,构造方法,set和get方法,吃饭方法eat(),看家方法lookHome(),方法中根据题目给出的格式输出成员变量的值。

  3. 在测试类中使用有参构造创建猫类对象,调用eat()方法和catchMouse()方法。

  4. 在测试类中使用有参构造创建狗类对象,调用eat()方法和lookHome()方法。

参考答案

猫类:
public class Cat {
    private String color;
    private String breed;
    public Cat(){}
    public Cat(String color, String breed) {
        this.color = color;
        this.breed = breed;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getBreed() {
        return breed;
    }
    public void setBreed(String breed) {
        this.breed = breed;
    }
    public void eat(){
        System.out.println(color+"的"+breed+"正在吃鱼.....");
    }
    public void catchMouse(){
        System.out.println(color + "的"+ breed +"正在逮老鼠....");
    }
}
狗类:
public class Dog {
    private String color;
    private String breed;
    public Dog(){}
    public Dog(String color, String breed) {
        this.color = color;
        this.breed = breed;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getBreed() {
        return breed;
    }
    public void setBreed(String breed) {
        this.breed = breed;
    }
    public void eat(){
        System.out.println(color + "的"+ breed +"正在啃骨头.....");
    }
    public void lookhome(){
        System.out.println(color + "的"+ breed +"正在看家.....");
    }
}
测试类:
public class Demo4 {
    public static void main(String[] args) {
        //创建猫对象
        Cat c = new Cat("花色","波斯猫");
        //调用猫的方法
        c.eat();
        c.catchMouse();
        //创建狗对象
        Dog d = new Dog("黑色","藏獒");
        d.eat();
        d.lookhome();
    }
}

2.扩展作业:

题目5

编写一个:

属性:课程名;学时;任课老师;

创建五个对象:“c语言”,“java编程”,“php网络编程”,“c++”,“数据结构”

提供无参的构造器和一个有参的构造器

//测试类
public class demo3 {
    public static void main(String[] args) {
        //通过有参构造方法创建对象并赋值
        Course course = new Course("C语言",3,"小红");
        Course course1 = new Course("java编程",3,"小红");
        Course course2 = new Course("php网络编程",3,"小红");
        Course course3 = new Course("c++",3,"小红");
        Course course4 = new Course("数据结构",3,"小红");
       //调用方法输出
        course.show();
        course1.show();
        course2.show();
        course3.show();
        course4.show();
    }
}
​
//定义课程类
public class  Course{
  //属性:课程名;学时;任课老师
    private String course;
    private int period;
    private  String teacer;
    //无参的构造器
   public Course(){}
 //有参的构造器
   public Course(String course,int period,String teacer){
     this.course=course;
     this.period=period;
     this.teacer=teacer;
   }
//set/get方法
    public void setCourse(String course) {
        this.course = course;
    }
​
    public String getCourse() {
        return course;
    }
​
    public void setPeriod(int period) {
        this.period = period;
    }
​
    public int getPeriod() {
        return period;
    }
​
    public void setTeacer(String teacer) {
        this.teacer = teacer;
    }
​
    public String getTeacer() {
        return teacer;
    }
    //show()方法
    public void show(){
        System.out.println(course+",学时为"+period+",任课老师是"+teacer);
    }
}

题目6(训练)

定义一个类,用于描述坐标点

0——————>X

|

|

| P(X,Y)

|

|

Y

(1)具有计算当前点到原点距离的功能

(2)求到任意一点(m,n)的距离

(3)求到任意一点(Point p)的距离

(4)具有坐标点显示功能,显示格式(x,y)

(5)提供无参的构造器和一个有参的构造器

//测试类
public class demo3 {
    public static void main(String[] args) {
        //通过有参构造方法创建对象并赋值
        Coordinate p = new Coordinate(2, 3);
        p.distanceToOrigin();
        p.distanceToArbitraryPoint();
        p.show();
    }
}
​
import java.util.Scanner;
​
//定义类
public class  Coordinate{
 //定义属性
 private double x;
 private double y;
 //无参构造
 public Coordinate(){}
//有参构造
 public Coordinate(double x,double y){
  this.x=x;
  this.y=y;
 }
//set/get方法
 public void setX(double x) {
  this.x = x;
 }
 public double getX() {
  return x;
 }
 public void setY(double y) {
  this.y = y;
 }
 public double getY() {
  return y;
 }
 //show()方法
 public void show(){
  System.out.println("该点与x轴距离为"+Math.abs(y)+",与y轴距离为"+Math.abs(x)+".格式为("+x+","+y+")");
 }
 //计算当前点到原点距离
 public void distanceToOrigin(){
  double distance=Math.sqrt(x*x+y*y);
  System.out.println("该点到原点的距离为:"+distance);
 }
 //任意一点(m,n)的距离
Scanner sc= new Scanner(System.in);
 public void distanceToArbitraryPoint(){
  System.out.println("请输入任意一点横坐标和纵坐标");
  double m=sc.nextDouble();
  double n=sc.nextDouble();
  double M=m>=0?m:(-m);
  double N=n>=0?n:(-n);
  double X=x>=0?x:(-x);
  double Y=y>=0?y:(-y);
  double distance=Math.sqrt((M-X)*(M-X)+(N-Y)*(N-Y));
  System.out.println("任一点("+m+","+n+")到点("+x+","+y+")的距离为"+distance);
 }
}
​

题目7

编程创建一个Box类,在其中定义三个变量表示一个立方体的长、宽和高,定义一个方法求立方体的体积。创建一个对象,求给定尺寸的立方体的体积。

(提供无参的构造器和一个有参的构造器)

//测试类
public class demo3 {
    public static void main(String[] args) {
        //通过有参构造方法创建对象并赋值
        Box box = new Box(3,2,1);
        box.v();
    }
}
​
//定义类
public class Box {
 //定义属性
private  int len;
private  int wid;
private int hig;
//无参的构造器
public Box(){}
//有参的构造器
public Box(int len,int wid,int hig){
    this.hig=hig;
    this.len=len;
    this.wid=wid;
}
//定义一个方法求立方体的体积
public void v(){
    double v=len*wid*hig;
    System.out.println("体积为"+v);
}
//set/get方法
​
    public void setHig(int hig) {
        this.hig = hig;
    }
​
    public int getHig() {
        return hig;
    }
​
    public void setLen(int len) {
        this.len = len;
    }
​
    public int getLen() {
        return len;
    }
​
    public void setWid(int wid) {
        this.wid = wid;
    }
​
    public int getWid() {
        return wid;
    }
}

题目8

写一个汽车类:

属性:品牌;车长;颜色;价格;

创建五个对象:“捷达”,“宝马”,“劳斯莱斯”,“科鲁兹”,“迈锐宝”

提供无参的构造器和一个有参的构造器

题目9

写出以下程序的执行结果

public class Test1 {
​
    public static void main(String[] args) {
        new A(new B());
    }
}
class A{
    public A(){
        System.out.println("A");
    }
    public A(B b){   2.
        this();//?????  ---A
        System.out.println("AB");  AB
    }
}
class B{
    public B(){
        System.out.println("B"); 1. B
    }
}
​
B
A
AB

题目10(选择题)

???写出程序的执行结果()

class Value{
​
  int i = 15;
​
}
​
class Test{
​
public static void main(String argv[]) {
​
Test t = new Test();
​
t.first();
​
}
​
 
​
public void first() {
​
int i = 5;
​
Value v = new Value();
​
v.i = 25;
​
second(v, i);
​
System.out.println(v.i);
​
}
​
 
​
public void second(Value v, int i) {
​
i = 0;
​
v.i = 20;
​
Value val = new Value();
​
v = val;
​
System.out.print(v.i + " " + i); //15  //0 
​
}
​
}

!!! A.15 0 20

B.15 0 15

C.20 0 20

D.0 15 20

题目11(构造器)

//(1)定义Student类,有4个属性:
String name;
int age;
String school;
String major;
//(2)定义Student类的3个构造器:
第一个构造器Student(String n, int a)设置类的name和age属性;
第二个构造器Student(String n, int a, String s)设置类的name, age 和school属性;
第三个构造器Student(String n, int a, String s, String m)设置类的name, age ,school和major属性;
//(3)在main方法中分别调用不同的构造器创建的对象,并输出其属性值。
//测试类
public class demo3 {
    public static void main(String[] args) {
        //通过有参构造方法创建对象并赋值
        Student student = new Student("小王",21,"MBI","ds");
        Student student1= new Student("小王",21,"MBI");
        Student student2= new Student("小王",21);
        student.show();
        student1.show();
        student2.show();
    }
}
​
//定义类
public class Student {
 //定义属性
    String name;
    int age;
    String school;
    String major;
//无参的构造器
public Student(){}
//有参的构造器
public Student(String n, int a){
    name=n;
    age=a;
}
 public Student(String n, int a,String s){
        name=n;
        age=a;
        school=s;
    }
 public Student(String n, int a,String s, String m){
        name=n;
        age=a;
       school=s;
       major=m;
    }
public void show(){
    System.out.println(name+" "+age+" "+school+" "+major);
}
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getName() {
        return name;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setMajor(String major) {
        this.major = major;
    }
​
    public String getMajor() {
        return major;
    }
​
    public void setSchool(String school) {
        this.school = school;
    }
​
    public String getSchool() {
        return school;
    }
}

知识点

String 基础点练习

  1. 画出如下几行代码的内存(堆栈)结构:

    String s1 = "hello";

    String s2 = "hello";

    String s3 = new String("hello");

    s1 += “world”;

  2.  

  1. 如何理解String类的值不可变但可以共享?

    字符串不可变,它们的值在创建后不能被更改

以“ ” 方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,

  1. String s = new String(“hello”);在内存中创建了几个对象?请说明

2个 ​ 第一个:字面量"hello" ​ ---java会创建一个String对象表示字面量"hello",并将其存入常量池 ​ 第二个:new String() ​ ---new String()时会再创建一个字符串对象,并引用hello字符串的内容

  1. “用运算符“==”比较字符串对象时,只要两个字符串包含的是同一个值,结果便为 true。”这句话对吗?

不对,比较基本数据类型:比较的是具体的值

比较引用数据类型:比较的是对象地址值

  1. String的常用方法有哪些?它们分别是什么意思?(至少7个)

    public boolean equals(Object anObject) 比较字符串的内容,严格区分大小写

    public char charAt(int index) 返回指定索引处的 char 值

    public int length() 返回此字符串的长度

    trim():去除字符串两端的空格;

    toLowerCase():将字符串转换为小写字母;

    toUpperCase():将字符串转换为大写字母;

    equalsIgnoreCase(String):忽略大小写比较两个值是否相等

题目1(训练)

现已知工人(Worker)类,属性包含姓名(name)、工龄(year),请编写该类,提供构造方法和get、set方法。在测试类中,请查看键盘录入Scanner类的API,创建工人类对象,属性值由键盘录入,打印对象的属性值。输出效果如下:

请录入工人姓名:
张三
请录入工人工龄:
5
该工人对象的属性信息如下:
姓名:张三
工龄:5
//测试类
public class demo3 {
    public static void main(String[] args) {
        //通过有参构造方法创建对象并赋值
        Worker worker = new Worker();
        worker.setName();
        worker.setYear();
        worker.show();
    }
}
​
​
import java.util.Scanner;
​
//定义类
public class Worker {
    //定义属性
    private String name;
    private int year;
    //无参构造
    public Worker(){}
    //有参构造
    public Worker(String name,int year){
       this.name=name;
       this.year=year;
    }
    //键盘录入
    Scanner sc=new Scanner(System.in);
    public void setName() {
        System.out.println("请录入工人姓名");
        name=sc.next();
        this.name = name;
    }
​
    public String getName() {
        return name;
    }
Scanner sc1=new Scanner(System.in);
​
    public void setYear() {
        System.out.println("请录入工人工龄");
        year=sc1.nextInt();
        this.year = year;
    }
​
    public int getYear() {
        return year;
    }
    public void show(){
        System.out.println("该工人对象的属性信息如下:\n" +
                "姓名:"+name+"\n" +
                "工龄:"+year+"\n");
    }
​
​

训练目标

编写简单的java类,创建对象,查询API。

训练提示

1、怎样编写一个标准的描述工人的类?

2、创建工人对象时需要两个属性信息,由键盘录入,该使用哪个API?

3、创建对象之后,显示对象的属性信息,该调用哪个方法?

参考方案

训练步骤

1、创建Worker类,成员变量私有修饰,提供空参和全参构造方法,提供get和set方法。

2、创建Test01类,在主方法中,创建键盘录入Scanner对象。

2.1、姓名信息为字符串,使用Scanner的nextLine()方法。

2.2、工龄信息为整数,使用Scanner的nextInt()方法。

3、创建Worker类对象,并输出对象的成员变量值。

3.1、可以在创建对象时使用构造方法为成员变量赋值,也可以创建对象后使用set方法赋值。

3.2、获取成员变量的值,使用get方法。

参考答案

public class Worker {
    // 成员变量
    private String name;
    private int year;
​
    // 构造方法
    public Worker() {
​
    }
    public Worker(String name, int age) {
        this.name = name;
        this.year = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getYear() {
        return year;
    }
​
    public void setYear(int year) {
        this.year = year;
    }
}
​
import java.util.Scanner;
public class Test01 {
    public static void main(String[] args) {
        // 创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入工人姓名:");
        String name = sc.nextLine();
        System.out.println("请输入工人工龄:");
        int year = sc.nextInt();
        // 创建对象
        Worker w = new Worker(name, year);
        // 输出信息
        System.out.println("该工人对象的信息如下:");
        System.out.println("姓名:" + w.getName());
        System.out.println("工龄:" + w.getYear());
    }
}

题目2(应用)

在登录注册页面中,除了用户名和密码外,通常也会包含验证码。验证码是用来区分用户是计算机还是人,防止恶意破解密码、刷票、灌水等行为。请查看Random、StringBuilder相关API,定义方法,获取一个包含4个字符的验证码,每一位字符是随机选择的字母和数字,可包含a-z,A-Z,0-9。例如:

import java.util.Random;
public class demo3 {
    public static void main(String[] args) {
        String code = getRandomCode();
        System.out.println("验证码为: " + code);
    }
    public static String getRandomCode() {
        //2.创建StringBuilder 对象 ,将可选择的字符都放入 StringBuilder对象中
        StringBuilder sb = new StringBuilder();
        //3.for循环  定义 a - z  利用StringBuilder#append 方法依次添加所有小写字母
        for (char i = 'a'; i <= 'z'; i++){
            //append 接收
            sb.append(i);}
        //4.for循环  定义A -Z, 利用append方法  一次添加大写字母
        for (char i = 'A'; i <= 'Z'; i++){
            sb.append(i);}
        //5. for 循环  0-9添加
        for (int i = 0; i <= 9; i++){
            sb.append(i);}
        //6.创建Random对象 用来保存验证码
        Random rm = new Random();
        String code = "";   //定义初始为空  用于接收验证码
        for (int i = 0; i < 4; i++) {
            //在循环中,使用Random的nextInt方法
            int index = rm.nextInt(sb.length()); 
            //使用StringBuilder的charAt方法,获取该索引上的字符,将其拼接到验证码字符串中。
            code += sb.charAt(index);
        }
        return code;
    }
}
7Kt5

训练目标

随机数类Random相关API、可变的字符序列StringBuilder相关API

训练提示

1、功能需要定义方法实现,方法的返回值是什么?需要参数列表吗?

2、先将可选择的字符都放到一个StringBuilder对象中。

3、怎样随机获取其中的四个字符呢?如果能随机获取一个,再获取四次,就可以了。那么怎样随机获取一个呢?我们知道,字符串中的字符是有索引的,如果可以随机获取到一个索引,就相当于随机获取到了该索引上的字符。

参考方案

训练步骤

1、定义方法,返回值是String,参数列表为空。

2、定义StringBuilder对象,将可选择的字符都放到StringBuilder对象中。

2.1、定义循环从a-z,使用StringBuilder的append方法依次添加所有小写字母

2.2、定义循环从A-Z,使用StringBuilder的append方法依次添加所有大写字母

2.3、定义循环从0-9,使用StringBuilder的append方法依次添加所有数字字符

3、创建Random对象。定义一个空字符串用于保存验证码。

4、定义一个执行4次的循环,用于获取4个字符。

4.1、在循环中,使用Random的nextInt方法,随机获取一个从索引0(包含)到字符串的长度(不包含)的索引。

4.2、使用StringBuilder的charAt方法,获取该索引上的字符,将其拼接到验证码字符串中。

5、返回结果,并在主方法中调用方法查看结果。

参考答案

import java.util.Random;
​
public class Test02 {
    public static void main(String[] args) {
        String code = getRandomCode();
        System.out.println(code);
    }
    public static String getRandomCode() {
        // 准备数据,将可选择的字符都放入StringBuilder中
        StringBuilder sb = new StringBuilder();
        for (char ch = 'a'; ch <= 'z'; ch++) {
            sb.append(ch);
        }
        for (char ch = 'A'; ch <= 'Z'; ch++) {
            sb.append(ch);
        }
        for (char ch = '0'; ch <= '9'; ch++) {
            sb.append(ch);
        }
        // 随机获取四位
        Random r = new Random();
        String code = "";
        for (int i = 0; i < 4; i++) {
            // 字符串中的字符有索引,随机获取一个索引即相当于随机获取到了该索引的字符
            int index = r.nextInt(sb.length()); // 从索引0(包含)到字符串的长度(不包含)
            code += sb.charAt(index); // 获取该索引上的字符
        }
        // 返回结果
        return code;
    }
}

题目3(应用)

在登录注册页面中,除了用户名和密码外,通常也会包含验证码。验证码是用来区分用户是计算机还是人,防止恶意破解密码、刷票、灌水等行为。在判断验证码时一般不区分大小写。请编写程序模拟验证码的判断过程,如果输入正确,给出提示,结束程序。如果输入错误,给出提示,验证码刷新,重新输入,直至正确为止。

生成4位随机验证码的功能在之前的题目中已经完成,可以直接使用。《定义方法,获取一个包含4个字符的验证码,每一位字符是随机选择的字母和数字,可包含a-z,A-Z,0-9。》

运行效果如下:

生成的验证码为:BkhD
请输入验证码
abcd
输入错误,请重新输入...
生成的验证码为:n1wX
请输入验证码
aaaa
输入错误,请重新输入...
生成的验证码为:Fm1a
请输入验证码
fm1a
输入正确
import java.util.Random;
import java.util.Scanner;
​
public class demo3 {
    public static void main(String[] args) {
        String code = getRandomCode();
        System.out.println("验证码为: " + code);
        System.out.println("请输入验证码");
        do {
            Scanner sc=new Scanner(System.in);
            String line=sc.nextLine();
            if(code.equalsIgnoreCase(line)){
                System.out.println("输入正确");
                break;
            }else {
                System.out.println("输入错误,请重新输入");
            }
        }while(true);
    }
    public static String getRandomCode() {      
        StringBuilder sb = new StringBuilder();  
        for (char i = 'a'; i <= 'z'; i++){
            sb.append(i);}        
        for (char i = 'A'; i <= 'Z'; i++){
            sb.append(i);} 
        for (int i = 0; i <= 9; i++){
            sb.append(i);}
        Random rm = new Random();
        String code = "";   //定义初始为空  用于接收验证码
        for (int i = 0; i < 4; i++) {
​
            int index = rm.nextInt(sb.length());
​
            code += sb.charAt(index);
        }
        return code;
    }}

训练目标

字符串的判断功能

训练提示

1、先定义获取验证码的方法,完成获取验证码的功能。

2、根据题目要求,判断需要一直到输入正确为止,所以需要使用循环。

3、用户输入由键盘录入,需要创建键盘录入对象。

4、判断是否正确需要将用户输入的字符串与生成的验证码比较,但不区分大小写,所以该使用哪个方法呢?

5、判断相等,给出提示,结束循环。判断不相等,给出提示,进入下一次循环。

参考方案

训练步骤

1、定义方法,实现获取包含4个字符的随机验证码。(参考以前的练习)

2、创建键盘录入Scanner对象。

3、定义while循环,循环条件为true。

4、在循环内,获取程序生成的验证码,提示用户输入,调用Scanner对象的nextLine方法获取用户输入。

5、使用String的equalsIgnoreCase方法比较生成的验证码和用户输入,因为不区分大小写。

5.1、如果相等,给出输入正确的提示,使用break语句跳出循环。

5.2、如果不相等,给出输入错误的提示,继续下一次循环。

参考答案

import java.util.Random;
import java.util.Scanner;

public class Test03 {
    public static void main(String[] args) {
        // 键盘录入对象
        Scanner sc = new Scanner(System.in);
        while (true) { // 不清楚输入多少次,定义死循环,输入正确时跳出即可。
            String code = getRandomCode();
            System.out.println("生成的验证码为:" + code);
            System.out.println("请输入验证码");
            String line = sc.nextLine();
            // 不区分大小写比较是否相等
            if (code.equalsIgnoreCase(line)) {
                System.out.println("输入正确");
                break; // 跳出循环,结束程序
            } else {
                System.out.println("输入错误,请重新输入...");
            }
        }
    }
    public static String getRandomCode() {
        // 准备数据
        StringBuilder sb = new StringBuilder();
        for (char ch = 'a'; ch <= 'z'; ch++) {
            sb.append(ch);
        }
        for (char ch = 'A'; ch <= 'Z'; ch++) {
            sb.append(ch);
        }
        for (char ch = '0'; ch <= '9'; ch++) {
            sb.append(ch);
        }
        // 随机获取四位
        Random r = new Random();
        String code = "";
        for (int i = 0; i < 4; i++) {
            // 字符串中的字符有索引,随机获取一个索引即相当于随机获取到了该索引的字符
            int index = r.nextInt(sb.length()); // 从索引0(包含)到字符串的长度(不包含)
            code += sb.charAt(index); // 获取该索引上的字符
        }
        // 返回结果
        return code;
    }
}

题目4(训练)

请编写程序,由键盘录入一个字符串,统计字符串中英文字母和数字分别有多少个。比如:Hello12345World中字母:10个,数字:5个。

import java.util.Scanner;

public class demo3 {
    public static void main(String[] args) {
        System.out.println("输入字符串");
        Scanner sc = new Scanner(System.in);
        String line =sc.nextLine();
        line= line.toLowerCase();
        int b=0;int c=0;
        for (int i=0;i<line.length();i++){
            char a =line.charAt(i);
            if(a>='a'&&a<='z'){
                b++;
            }else if (a<='9'&&a>='0'){
                c++;
            }
        }
        System.out.println("英文字母"+b);
        System.out.println("数字"+c);
    }
}

训练目标

字符串遍历

训练提示

1、键盘录入一个字符串,用 Scanner 实现 2、要统计两种类型的字符个数,需定义两个统计变量,初始值都为0 3、遍历字符串,得到每一个字符 4、判断该字符属于哪种类型,然后对应类型的统计变量+1,判断字母时需要考虑大小写,条件比较复杂,怎样做才能使判断更简单呢?

参考方案

为方便判断并统计,可将字符串中的字符都转为大写或者都转为小写。

训练步骤

1、创建键盘录入Scanner对象,使用nextLine方法接收输入的字符串。

2、为方便后续判断,使用String的toLowerCase方法,将字符串中的字符都转为小写。

3、需定义两个统计变量,初始值都为0

4、遍历字符串,得到每一个字符

5、判断该字符属于哪种类型,然后对应类型的统计变量+1,次数判断英文字母时只需判断小写即可。

参考答案

import java.util.Scanner;

public class Test07 {
    public static void main(String[] args) {
        //键盘录入一个字符串,用 Scanner 实现
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String line = sc.nextLine();
        // 为方便统计,将字符串中的字母都转为小写
        line = line.toLowerCase();
        //要统计两种类型的字符个数,需定义两个统计变量,初始值都为0
        int letterCount = 0;
        int numberCount = 0;
        // 遍历字符串,得到每一个字符
        for(int i=0; i<line.length(); i++) {
            char ch = line.charAt(i);
            // 判断该字符属于哪种类型,然后对应类型的统计变量+1
            if (ch >= 'a' && ch <= 'z') {
                letterCount++;
            } else if (ch >= '0' && ch <= '9') {
                numberCount++;
            }
        }
        //输出两种类型的字符个数
        System.out.println("英文字母:" + letterCount + "个");
        System.out.println("数字:" + numberCount + "个");
    }
}

题目5(应用)

请定义一个方法用于判断一个字符串是否是对称的字符串,并在主方法中测试方法。例如:"abcba"、"上海自来水来自海上"均为对称字符串。

import java.util.Scanner;

public class demo3 {
    public static void main(String[] args) {
        System.out.println("输入字符串");
        Scanner sc = new Scanner(System.in);
        String line =sc.nextLine();
        boolean result=compareStr(line);
        System.out.println(result);
    }
    public static boolean compareStr(String line){
        StringBuilder sb=new StringBuilder(line);
        String reLine=sb.reverse().toString();
        if(line==null){
            return false;
        }
        boolean a=reLine.equals(line);
        return a;
    }
}

训练目标

字符串的反转功能,判断是否相等功能

训练提示

1、判断是否对称,方法的返回值是什么类型?参数列表是什么?

2、怎样判断对称呢?如果可以将字符串反转,反转后发现跟原来的字符串完全一样,不就可以判断出来了吗,那么哪个类有字符串的反转功能呢?

参考方案

训练步骤

1、定义方法,返回值类型为boolean,参数列表为String类型的一个参数。

2、将字符串转换为StringBuilder类型,调用StringBuilder的reverse()方法将字符串反转。

3、将反转后的字符串再转回String类型,并与原字符串比较,如果相等,返回true,否则返回false

4、在主方法中,定义一个字符串,调用方法测试结果。

参考答案

public class Test05 {
    public static void main(String[] args) {
        String str = "上海自来水来自海上";
        System.out.println(isSym(str));
    }

    public static boolean isSym(String str) {
        // 为了程序的健壮,如果传递的是空值,返回false
        if (str == null) {
            return false;
        }
        // 转换为StringBuilder
        StringBuilder sb = new StringBuilder(str);
        // 反转,再转成String
        String reStr = sb.reverse().toString();
        // 比较与原字符串是否相等
        // 相等返回true,不相等返回false,正好与equals的返回值一致,直接返回即可。
        return reStr.equals(str);
    }
}

题目6(应用)

我国的居民身份证号码,由由十七位数字本体码和一位数字校验码组成。请定义方法判断用户输入的身份证号码是否合法,并在主方法中调用方法测试结果。规则为:号码为18位,不能以数字0开头,前17位只可以是数字,最后一位可以是数字或者大写字母X。

训练目标

字符串的遍历、判断

训练提示

1、要判断字符串是否符合规则,方法的返回值类型是什么?参数列表是什么?

2、使用String的API,对每种不符合条件的情况作出判断,一旦发现不符合条件就可以结束方法的执行,返回结果了。

3、在主方法中创建键盘录入,调用方法,输入各种数据测试结果。

参考方案

针对每种不符合条件的情况作出判断

训练步骤

1、定义方法,返回值类型为boolean表示是否合法,参数列表为String类型的id,表示要判断的数据。

2、对每种不符合条件的情况作出判断

2.1、如果字符串长度不是18,返回false。

2.2、如果字符串以数字"0"开头,返回false。

2.3、遍历字符串,获取每一位字符,判断前17位,如果不是数字,返回false,判断最后一位如果不是数字或者X,返回false

2.4、所以的不符合条件都筛选完成,返回true

3、在主方法中创建键盘录入Scanner对象,调用nextLine()方法,获取用户输入,调用方法,传递参数,查看结果。要多运行几次,判断各种不符合条件的数据。

参考答案

import java.util.Scanner;
public class Test06 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入身份证号:");
        String id = sc.nextLine();
        System.out.println(check(id));
    }

    // 返回值boolean类型,表示是否符合规则。参数列表:需要判断的字符串
    public static boolean check(String id) {
        // 如果传递了空参数,返回false
        if (id == null) {
            return false;
        }
        // 如果是数字0开头,返回false
        if (id.startsWith("0")) {
            return false;
        }
        // 如果不是18位,返回false
        if (id.length() != 18) {
            return false;
        }
        // 遍历判断每一位
        for (int i = 0; i < id.length(); i++) {
            char ch = id.charAt(i);
            // 前17位都是数字,最后一位可以是数字或者大写字母X
            if (i == id.length() - 1) { // 最后一位
                if (ch < '0' || ch > '9' && ch != 'X') { // 不是数字或者X
                    return false;
                }
            } else { // 其他位
                if (ch < '0' || ch > '9') { // 不是数字
                    return false;
                }
            }
        }
        // 所有的规则都符合,返回true
        return true;
    }
}

题目7(练习)

定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。

要求:

1、如果传递的参数为空,返回null

2、如果传递的数组元素个数为0,返回[]

3、如果数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]

训练目标

字符串的拼接

训练提示

1、定义方法的返回值是什么?参数列表是什么?

2、如果不做判断就对数组进行遍历,那么如果数组对象为空,会报出异常,怎样避免空指针异常呢?

3、拼接字符串必然涉及到频繁改变,该采用可变的字符序列StringBuilder比较好

4、遍历数组,按照题目格式拼接数组中的元素。

5、将字符串返回

6、在主方法中定义数组,并调用方法,打印结果

参考方案

使用StringBuilder拼接字符串

训练步骤

1、定义方法返回值类型:String,参数:int[] arr

2、判断对象如果为null,直接返回null

3、创建StringBuilder对象

4、遍历数组,按照要求进行拼接数组元素,如果是不是最后一个元素,还要拼接逗号和空格

5、将StringBuilder转为String返回

6、在主方法中定义数组,并调用方法,打印结果

参考答案

public class Test07 {
    public static void main(String[] args) {
        // 定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
        int[] arr = {1, 2, 3};
        // 调用方法,输出结果
        System.out.println(arrayToString(arr));
    }

    /*定义一个方法,用于把 int 数组中的数据按照指定格式拼接成一个字符串返回
		返回值类型:String
		参数:int[] arr
     */
    public static String arrayToString(int[] arr) {
        // 健壮性判断
        if (arr == null) {
            return null;
        }
        //在方法中用 StringBuilder 按照要求进行拼接,并把结果转成 String 返回
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            // 拼接元素
            sb.append(arr[i]);
            // 如果不是最后一个元素,再拼接逗号和空格
            if (i != arr.length - 1) {
                sb.append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }
}

题目8(扩展)

在String类的API中,有如下两个方法:

// 查找参数字符串str在调用方法的字符串中第一次出现的索引,如果不存在,返回-1
public int indexOf(String str)

// 截取字符串,从索引beginIndex(包含)开始到字符串的结尾
public String substring(int beginIndex)

请仔细阅读API中这两个方法的解释,完成如下需求。

现有如下文本:"Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的"。请编写程序,统计该文本中"Java"一词出现的次数。

训练目标

String类API的灵活使用

训练提示

1、要找的子串是否存在,如果存在获取其出现的位置。这个可以使用indexOf完成。 2、如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串,而剩余字符串的起始位是出现位置再加上子串的长度。

3、以此类推,通过循环完成查找,如果找不到就是-1,每次找到用计数器记录次数。

参考方案

从左至右依次查找,将已查找的部分截取掉。

训练步骤

1、定义方法,返回值int表示次数,参数列表两个字符串,第一个表示在哪个字符串中查找,第二个表示要查找的目标子串

2、定义统计变量表示次数。

3、定义索引变量,表示每次找到子串出现的索引。

4、定义循环,判断条件为在字符串中找到了目标子串,使用indexOf实现。

5、如果找到的索引不是-1,在循环中,统计变量累加。

6、把查找过的部分剪切掉,从找到的索引+子串长度的位置开始截取,使用substring实现。

7、将次数返回

8、在主方法中,定义字符串表示题目中的文本,定义字符串表示要查找的子串,调用方法,获取结果。

参考答案

public class Test08 {
    public static void main(String[] args) {
        String str = "Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的";
        String tar = "Java";
        // 调用方法并输出
        System.out.println(search(str, tar));

    }
    // 返回值int表示次数,参数列表str表示在哪个字符串中查找,tar表示要查找的目标子串
    public static int search(String str, String tar) {
        // 定义统计变量表示次数
        int count = 0;
        // 定义索引变量,表示每次找到子串出现的索引
        int index = -1;
        // 定义循环,判断条件为在字符串中找到了目标子串
        while ((index = str.indexOf(tar)) != -1) { // 将找到的索引赋值给变量并判断
            // 次数累加
            count++;
            // 把查找过的部分剪切掉,从找到的索引+子串长度的位置开始截取。
            str = str.substring(index + tar.length());
        }
        return count;
    }
}

###

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值