• 第七章:面向对象编程(中级部分)


    目录

    一、idea的使用

    1.创建项目:

    2.setting设置:

    3.快捷键:

    二、包

    1.创建包:

    2.包的命名规则:

    3.java中常用的包使用与导入:

    三、访问修饰符

    1.定义:

    四、封装

    1.封装步骤:

    2.案例:

    案例2:名字2-5,余额大于20,密码=6位;不符合谈提示设置默认值:

    五、继承

    1.定义:

    2.案例:大学生和小学生:

    3.继承的细节:

    4.继承的本质:

    六、super关键字 

    1.定义:

    七、方法的重写/覆盖

    1.定义:

    2.细节:

    3.重载(overload)和重写(override)的区别:

    4.案例

    八、多态

    1.定义:

    2.向上转型:

    3.向下转型:

    4.属性重写的问题

    5.java动态绑定机制:

    九、多态数组

    十、多态参数

    十一、Object的详解

    1.==运算符:        

    2.equals:

    3.重写equals方法:

    4.hashCode()方法:

    5.toString()方法:

    6.finalize()

    十二、断点调试(debug)

    1.快捷键 :

    十三、零钱通

    1.使用其他方法实现:

    2.使用opp面向对象实现:

    本章太多了课后练习放在下一章


    一、idea的使用

    1.创建项目:

    1. new project-->java选sdk包选完下一个
    2. 一直下一步找到地址弄好就OK
    3. 新建类,右键src 

    2.setting设置:

    • appearance:设置外观

    • Color Scheme:设置外观

    • File Encodings:设置字体编码 

    3.快捷键:

    • pswm:生成主方法
    • setting-->keymap
    • setting-->Editor--->auto import
    • alt+/ :补全代码
    • ctrl+alt+l:格式化代码
    • alt+insert:生成构造器
    • ctrl+H:查看一个类的层级关系
    • ctrl+B可以定位到方法
    • 自动分配变量名:.var (超级流批好吧)
    • file-->setting-->editor-->Live template - > 查看有哪些模板快捷键/可以自己添加模板

    二、包

    1.创建包:

            src右键-->new -->package->输入名字com.xiaoming

            同一个包不能有相同类名

    2.包的命名规则:

    • 只能由数字、字母、下划线、小圆点,但不能用数字开头,不能是关键字或保留字
    • com.12a错误,12a数字开头
    • 一般命名规则:com.公司名.项目名.业务模块名

    3.java中常用的包使用与导入:

    java.lang.*  //lang包是基本包,默认引入,不需要引入

    java.util.*   //util包系统提供的工具包,工具类,使用Scanner

    java.awt.*  //是Java的界面开发,GUI

    java.net.*  //网络包,网络开发

    导入包:import  java.lang.*  建议使用什么,导入什么  import java.util.Arrays;

    三、访问修饰符

    1.定义:

    1. 公开级别:用public修饰,对外公开
    2. 受保护级别:用protect修饰,对子类和同一个包中的类公开
    3. 默认级别:没有修饰符号,向同一个包的类公开。
    4. 私有级别:用private修饰,只有类本身可以访问,不对外公开。

    修饰符可以修饰类,但是只有默认和public可以,其他的不行。

    成员方法和成员方法的规则是一样的,

    四、封装

    1.封装步骤:

    1. 把属性私有化
    2. 提供一个公共的(public)set方法,用于对属性判断并赋值
    3. 提供一个公共的(public)get方法,用于对属性的读取

    2.案例:

            构造器搭配封装使用

            年龄,必须在1-120,年龄,工资不能直接查看,name的长度在2-6字符之间

    1. package com.user;
    2. public class User {
    3. public static void main(String[] args) {
    4. Person person = new Person();
    5. person.setAge(19);
    6. person.setName("法外狂徒张三");
    7. person.job="律师";
    8. person.setSalary(12300);
    9. System.out.println(person.toString());
    10. }
    11. }
    12. class Person {
    13. private String name;
    14. private int age;
    15. public String job;
    16. private double salary;
    17. public Person(String name, int age, String job, double salary) {
    18. // this.name = name;
    19. // this.age = age;
    20. this.job = job;
    21. // this.salary = salary;
    22. setName(name);
    23. setAge(age);
    24. setSalary(salary);
    25. }
    26. public String getName() {
    27. return name;
    28. }
    29. public void setName(String name) {
    30. if (name.length() >=1&&name.length()<=6){
    31. this.name = name;
    32. }else {
    33. System.out.println("名字太长了");
    34. this.name = "无名人";
    35. }
    36. }
    37. public int getAge() {
    38. return age;
    39. }
    40. public void setAge(int age) {
    41. if (age >= 1 && age <= 120) {
    42. this.age = age;
    43. }else {
    44. System.out.println("年林不对我给你一个默认的18");
    45. this.age = 18;
    46. }
    47. }
    48. public double getSalary() {
    49. return salary;
    50. }
    51. public void setSalary(double salary) {
    52. this.salary = salary;
    53. }
    54. @Override
    55. public String toString() {
    56. return "Person{" +
    57. "name='" + name + '\'' +
    58. ", age=" + age +
    59. ", job='" + job + '\'' +
    60. ", salary=" + salary +
    61. '}';
    62. }
    63. }

    案例2:名字2-5,余额大于20,密码=6位;不符合谈提示设置默认值:

    1. package com.user;
    2. public class User {
    3. public static void main(String[] args) {
    4. Account account = new Account("张三",10,"2123");
    5. System.out.println(account.toString());
    6. }
    7. }
    8. class Account {
    9. private String name;
    10. private String password;
    11. private double balance;
    12. public Account(){
    13. }
    14. public Account(String name,double balance,String password){
    15. this.setBalance(balance);
    16. this.setName(name);
    17. this.setPassword(password);
    18. }
    19. public String getName() {
    20. return name;
    21. }
    22. public void setName(String name) {
    23. if (name.length() < 5 && name.length() >= 2) {
    24. this.name = name;
    25. } else {
    26. System.out.println("姓名长度2-5");
    27. this.name = "无名";
    28. }
    29. }
    30. public String getPassword() {
    31. return password;
    32. }
    33. public void setPassword(String password) {
    34. if (name.length() == 6) {
    35. this.password = password;
    36. } else {
    37. System.out.println("密码长度6");
    38. this.password = "000000";
    39. }
    40. }
    41. public double getBalance() {
    42. return balance;
    43. }
    44. public void setBalance(double balance) {
    45. if (balance > 20) {
    46. this.balance = balance;
    47. } else {
    48. System.out.println("余额大于20");
    49. }
    50. }
    51. @Override
    52. public String toString() {
    53. return "Account{" +
    54. "name='" + name + '\'' +
    55. ", password='" + password + '\'' +
    56. ", balance=" + balance +
    57. '}';
    58. }
    59. }

    五、继承

    1.定义:

            方便代码的复用性;把子类的共有属性抽离为一个接口

            class 子类 extends 父类{}

    2.案例:大学生和小学生:

    1. package com.user;
    2. public class User {
    3. public static void main(String[] args) {
    4. Pupil pupil = new Pupil();
    5. pupil.name ="银角大王";
    6. pupil.age = 11;
    7. pupil.setScore(60);
    8. pupil.showInfo();
    9. Graduate graduate = new Graduate();
    10. graduate.name ="金角大王";
    11. graduate.age = 20;
    12. graduate.setScore(70);
    13. graduate.showInfo();
    14. }
    15. }
    16. //是Pupil 和 Graduate的父类
    17. class Student{
    18. public String name;
    19. public int age;
    20. private double score;
    21. public void setScore(double score){
    22. this.score = score;
    23. }
    24. public void showInfo(){
    25. System.out.println("学生名"+name+"年龄"+age+"成绩"+score);
    26. }
    27. }
    28. class Pupil extends Student{
    29. public void testing(){
    30. System.out.println("小学生"+name+"正在考小学数学");
    31. }
    32. }
    33. class Graduate extends Student{
    34. public void testing(){
    35. System.out.println("大学生"+name+"正在考小学数学");
    36. }
    37. }

    3.继承的细节:

    • 子类继承父类的所有属性和方法,但是私有属性和方法不能再子类直接访问,要通过公共的方法访问。
    1. package com.user;
    2. public class User {
    3. public static void main(String[] args) {
    4. Student student = new Student();
    5. student.showInfo();
    6. student.callTest();
    7. }
    8. }
    9. class Person{
    10. private String name;
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. private void test(){
    18. System.out.println("私有方法你来调用我");
    19. }
    20. public void callTest(){
    21. this.test();
    22. }
    23. }
    24. class Student extends Person{
    25. public void showInfo(){
    26. setName("张三");
    27. System.out.println(getName());
    28. }
    29. }
    • 子类必须调用父类的构造器,完成父类的初始化   //子类调用构造器,会自动调用父类的构造器(super)
    • 当子类创建对象时,不管使用子类哪个构造器,默认都会调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中使用super去指定使用父类的构造器完成对父类的初始化工作,否则编译不通过。
    1. package com.user;
    2. public class User {
    3. public static void main(String[] args) {
    4. Student student = new Student("张三");
    5. System.out.println(student.name);
    6. }
    7. }
    8. class Person{
    9. public String name;
    10. public Person(String name) {
    11. this.name = name;
    12. }
    13. }
    14. class Student extends Person{
    15. public Student(String name) {
    16. super(name);
    17. }
    18. }
    • super()调用构造器的时候必须放在第一行
    • 调用父类的构造器使用super,只能在构造器中使用super
    • java的所有类的父类都是Object
    • 父类构造器的调用不限于直接父类!将一直往上追溯到Object,由最上面的父类的构造器往下执行
    • 子类最多只能继承一个父类,java是单继承机制
    • 不能滥用继承需要满足is a的关系:例如 cat is  a  animal

    4.继承的本质:

     如果子类有这个属性就返回子类的,没有往上找,找到最上面都没有就报错。private定义属性肯定继承,就是访问不了,就近原则

            案例1:看看输出什么。默认调用super

    1. public class User {
    2. public static void main(String[] args) {
    3. B b = new B();
    4. }
    5. }
    6. class A{
    7. A(){
    8. System.out.println("a");
    9. }
    10. A(String name){
    11. System.out.println("a name");
    12. }
    13. }
    14. class B extends A{
    15. B(){
    16. this("abc");
    17. System.out.println("b");
    18. }
    19. B(String name){
    20. System.out.println("b name");
    21. }
    22. }

    六、super关键字 

    1.定义:

            用于访问父类的属性、方法、构造器。但不能访问私有的属性

    1. package com.user;
    2. public class User {
    3. public static void main(String[] args) {
    4. new B().h1();
    5. }
    6. }
    7. class A{
    8. String name = "张三";
    9. private int age = 10;
    10. public A(String name, int age) {
    11. this.name = name;
    12. this.age = age;
    13. }
    14. public void show(){
    15. System.out.println("来展示");
    16. }
    17. }
    18. class B extends A{
    19. public B() {
    20. super("李四", 19);
    21. }
    22. public void h1(){
    23. System.out.println(super.name);
    24. super.show();
    25. }
    26. }

    super的访问适用于就近原则A->B->C.属性的覆盖

    this与super的区别,this从子类开始找,super从父类开始找,this调用本类,super调用父类。this调用本类构造器,必须放在第一行。super调用父类构造器,必须放在第一行。

    七、方法的重写/覆盖

    1.定义:

            简单的来说:方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称,返回类型,参数一样,那么我么就说子类的方法覆盖了父类的方法。

    2.细节:

    • 子类的方法的参数、方法名称,要和父类方法的参数,方法名称完全一样
    • 子类方法的返回类型和父类方法的返回类型一样,或者父类返回类型的子类:比如父类是返回值Object,子类返回值可以是String
    • 子类方法不能缩小父类方法的访问权限
    1. public class User {
    2. public static void main(String[] args) {
    3. new Dog().cry();
    4. }
    5. }
    6. class Animal{
    7. protected void cry(){ //父类访问权限,比子类小或者一样
    8. System.out.println("动物叫唤");
    9. }
    10. public Object bb(){
    11. return null;
    12. }
    13. }
    14. class Dog extends Animal{
    15. public void cry(){ //public->protected->默认->private
    16. System.out.println("小狗汪汪叫");
    17. }
    18. public String bb(){//子类的返回参数,是父类返回参数的子类或者相同
    19. return null;
    20. }
    21. }

    3.重载(overload)和重写(override)的区别:

    重载        本类        方法名:必须一样        参数:个数,顺序至少一个不同包        返回类型:无要求        修饰符:无要求

    重写        子父类        必须一样                   相同                                              父类返回值相同,或父类子类        子类方法

    4.案例

            编写一个person类,包括属性/private(name,age),构造器,方法say(返回自我介绍的字符串)。编写一个Student类,继承Person类,增加id,score属性/private,以及构造器,定义say方法(返回自我介绍的信息)。在main中分别创建Person和Student对象,调用say方法输出自我介绍。

    1. package com.user;
    2. public class User {
    3. public static void main(String[] args) {
    4. Person person = new Person("jack",10);
    5. System.out.println(person.say());
    6. Student student = new Student("smith",20,123456,89);
    7. System.out.println(student.say());
    8. }
    9. }
    10. class Person {
    11. private String name;
    12. private int age;
    13. public Person(String name, int age) {
    14. this.name = name;
    15. this.age = age;
    16. }
    17. public String say() {
    18. return "姓名" + name + "年龄" + age;
    19. }
    20. public String getName() {
    21. return name;
    22. }
    23. public void setName(String name) {
    24. this.name = name;
    25. }
    26. public int getAge() {
    27. return age;
    28. }
    29. public void setAge(int age) {
    30. this.age = age;
    31. }
    32. }
    33. class Student extends Person {
    34. private int id;
    35. private double score;
    36. public Student(String name, int age, int id, double score) {
    37. super(name, age);
    38. this.id = id;
    39. this.score = score;
    40. }
    41. public String say() {
    42. return super.say() + "id=" + id + "score=" + score;
    43. }
    44. }

    八、多态

    1.定义:

            一个对象的编译理性和运行类型可以不一致。编译类型在定义对象时,就确定了,不能改变。运行类型是可以变化。编译类型看定义时 = 号的左边,运行类型看 = 号的 右边

    2.向上转型

            多态的前提是:两个对象(类)存在继承关系。多态的向上转型

            本质:父类的引用指向了子类的对象    语法: 父类类型  引用名  = new 子类类型();

            特点:编译类型看左边,运行类型看右边。可以调用父类中的所有成员(但是要遵守访问权限),不能调用子类的特有成员。

    1. public class User {
    2. public static void main(String[] args) {
    3. Person person = new Student();
    4. person.hi();//向上转型只能访问父类有的方法与属性
    5. }
    6. }
    7. class Person{
    8. public void hi(){
    9. System.out.println("你好");
    10. }
    11. }
    12. class Student extends Person{
    13. public void hah(){
    14. System.out.println("hah");
    15. }
    16. }

    3.向下转型:

            语法:子类类型 引用名 = (子类类型)  父类引用。只能强转父类的引用,不能强转父类的对象。要求父类的引用指向的是当前目标类型的对象,可以调用子类类型中所有的成员。

    1. public class User {
    2. public static void main(String[] args) {
    3. Person person = new Student();
    4. person.hi();//向上转型只能访问父类有的方法与属性
    5. Student student = (Student) person;
    6. student.hah(); //向下转型就可以访问子类的方法与属性
    7. }
    8. }
    9. class Person {
    10. public void hi() {
    11. System.out.println("你好");
    12. }
    13. }
    14. class Student extends Person {
    15. public void hah() {
    16. System.out.println("hah");
    17. }
    18. }

    4.属性重写的问题

    定义:属性没有重写之说,属性看编译类型

    instanceof比较操作符,用于判断莫某类型是不是某某类型或者是他的子类

    1. public class User {
    2. public static void main(String[] args) {
    3. //属性编译看左边哦
    4. Person person = new Student();
    5. System.out.println(person.count);
    6. }
    7. }
    8. class Person {
    9. int count = 10;
    10. }
    11. class Student extends Person {
    12. int count = 20;
    13. }

    5.java动态绑定机制:

    定义:当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定。当调用对象属性时,没有动态绑定机制,哪里声明,那里使用

    九、多态数组

    应用实例:现有一个继承结构如下 Teacher(name,int,say())  Teacher-->teach()  Student-->study()  遍历Teacher

    使用:getClass()查看类
    主要练习向上向下转型

    1. public class User {
    2. public static void main(String[] args) {
    3. Person[] people = new Person[5];
    4. people[0] = new Person("jack",20);
    5. people[1] = new Student("mary",21,99);
    6. people[2] = new Student("smith",19,66.5);
    7. people[3] = new Teacher("jan",80,20000);
    8. people[4] = new Teacher("wan",60,10000);
    9. for (int i = 0; i < people.length; i++) {
    10. System.out.println(people[i].toString());
    11. if (people[i] instanceof Student) ((Student) people[i]).study();
    12. if (people[i] instanceof Teacher) ((Teacher) people[i]).teacher();
    13. }
    14. }
    15. }
    16. class Person {
    17. public String name;
    18. public int age;
    19. public Person(String name, int age) {
    20. this.name = name;
    21. this.age = age;
    22. }
    23. @Override
    24. public String toString() {
    25. return "Person{" +
    26. "name='" + name + '\'' +
    27. ", age=" + age +
    28. '}';
    29. }
    30. }
    31. class Student extends Person {
    32. double score;
    33. public Student(String name, int age, double score) {
    34. super(name, age);
    35. this.score = score;
    36. }
    37. public void study(){
    38. System.out.println("好好学习");
    39. }
    40. @Override
    41. public String toString() {
    42. return super.toString() + "学生成绩为" + score;
    43. }
    44. }
    45. class Teacher extends Person {
    46. double salary;
    47. public Teacher(String name, int age, double salary) {
    48. super(name, age);
    49. this.salary = salary;
    50. }
    51. public void teacher(){
    52. System.out.println("我要教学生");
    53. }
    54. @Override
    55. public String toString() {
    56. return super.toString()+"老师工资为17000";
    57. }
    58. }

    十、多态参数

    1.定义:传递多态参数,就是传递父类的参数

    1. package com.user;
    2. public class User {
    3. public static void main(String[] args) {
    4. new Tools().show(new Person("张三",19));
    5. Person person = new Student("张三",19,10);
    6. new Tools().show(person);
    7. }
    8. }
    9. class Person{
    10. String name;
    11. int age;
    12. public Person(String name, int age) {
    13. this.name = name;
    14. this.age = age;
    15. }
    16. }
    17. class Student extends Person{
    18. int id;
    19. public Student(String name, int age,int id) {
    20. super(name, age);
    21. this.id = id;
    22. }
    23. }
    24. class Tools{
    25. public void show(Person p){
    26. if (p instanceof Person) System.out.println(p.name+p.age);
    27. if (p instanceof Student) System.out.println(p.name+p.age+((Student) p).id);
    28. }
    29. }

    十一、Object的详解

    1.==运算符:        

                    既可以判断基本类型,可以判断应用类型。如果判断基本类型,就是判断值是否相等。引用类型,判断的是地址是否相等

    2.equals:

                     只能判断引用类型,默认是判断地址是否相等,子类中往往重写该方法,用于判断内容是否相等。

    3.重写equals方法:

    1. package com.user;
    2. import java.util.Objects;
    3. public class User {
    4. public static void main(String[] args) {
    5. Person person1 = new Person("jack",10,'男');
    6. Person person2 = new Person("jack",10,'男');
    7. System.out.println(person2.equals(person1));
    8. }
    9. }
    10. class Person{
    11. String name;
    12. int age;
    13. char gender;
    14. public Person(String name, int age, char gender) {
    15. this.name = name;
    16. this.age = age;
    17. this.gender = gender;
    18. }
    19. //重写equals方法
    20. @Override
    21. public boolean equals(Object o) {
    22. if (this == o) return true;
    23. if (o == null || getClass() != o.getClass()) return false;
    24. Person person = (Person) o;
    25. return age == person.age && gender == person.gender && Objects.equals(name, person.name);
    26. }
    27. }

    4.hashCode()方法:

    1. 提高具有哈希结构的容器效率!

    2. 两个引用,如果指向同一个对象,则哈希值肯定是一样的!

    3. 两个引用,如果指向的是不同对象,则哈希值是不一样的

    4. 哈希值主要是根据地址号的!,不能完全将hash值等价于地址

    5. object.hashCode()。后面在集合中hashCode如果需要也会重写

    5.toString()方法:

    1.默认返回全类名+@+hash值,所以一般我们也是重写哦

    1. public class User { public static void main(String[] args) {
    2. Person person = new Person();
    3. person.name ="张三";
    4. person.age = 10;
    5. System.out.println(person.toString());
    6. }
    7. }
    8. class Person{
    9. String name;
    10. int age;
    11. @Override
    12. public String toString() {
    13. return "Person{" +
    14. "name='" + name + '\'' +
    15. ", age=" + age +
    16. '}';
    17. }
    18. }

    6.finalize()

    1.定义:这个是垃圾回收器,系统会自动回收,如果程序员需要可以自己重写  System.gc()主动调用垃圾回收,

    finalize几乎不用只是为了面试

    十二、断点调试(debug)

    1.快捷键 :

            F7(跳入)        F8(跳出)        shift+F8(跳出)        F9(resume,执行到下一个断点)

    右键运行有个debug运行那个就可以看效果

    1. public class User {
    2. public static void main(String[] args) {
    3. //debug 演示
    4. int sum = 0;
    5. for (int i = 0; i < 10; i++) {
    6. sum += i;
    7. System.out.println("i = " + i);
    8. System.out.println("sum = " + sum);
    9. }
    10. System.out.println("end...");
    11. int[] arr = new int[3];
    12. for (int i = 0; i < 4; i++) {
    13. arr[i] =1;
    14. }
    15. }
    16. }

    十三、零钱通

    1.使用其他方法实现:

    1. import java.text.SimpleDateFormat;
    2. import java.util.Date;
    3. import java.util.Scanner;
    4. public class SmallChangeSys {
    5. //化繁为简
    6. // 1.先完成菜单,并可以选择菜单,给出对应提示信息
    7. // 2.完成零钱通明细 思路字符串
    8. public static void main(String[] args) {
    9. //定义相关变量
    10. Scanner scanner = new Scanner(System.in);
    11. boolean loop = true;
    12. String key = "";
    13. //2.完成零钱通
    14. String details = "---------零钱通明细--------", note, choice;
    15. //3.收益入账
    16. //定义新的变量
    17. double money, balance = 0;
    18. Date date = null;
    19. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm"); //格式化时间的格式
    20. do {
    21. System.out.println("========零钱通菜单========");
    22. System.out.println("\t\t\t1 零钱通明细");
    23. System.out.println("\t\t\t2 收益入账");
    24. System.out.println("\t\t\t3 消费");
    25. System.out.println("\t\t\t4 退 出");
    26. System.out.print("请选择(1-4): \t");
    27. key = scanner.next();
    28. switch (key) {
    29. case "1":
    30. System.out.println(details);
    31. break;
    32. case "2":
    33. System.out.println("收益入账金额:");
    34. money = scanner.nextDouble();
    35. //金额校验等下写
    36. balance += money;
    37. date = new Date(); //获取到当前的日期
    38. details += "\n收益入账\t" + money + "\t" + sdf.format(date) + "\t" + balance;
    39. break;
    40. case "3":
    41. System.out.print("消费金额:\t");
    42. money = scanner.nextDouble();
    43. System.out.print("消费理由:\t");
    44. note = scanner.next();//消费理由
    45. //金额校验等下写
    46. balance -= money;
    47. date = new Date(); //获取到当前的日期
    48. details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
    49. break;
    50. case "4":
    51. System.out.print("你确定要退出吗?(y/n): \t");
    52. choice = scanner.next();
    53. if (choice.equals("n")) break;
    54. loop = false;
    55. break;
    56. default:
    57. System.out.println("选择有误,请重新选择");
    58. }
    59. } while (loop);
    60. System.out.println("退出了零钱通项目");
    61. }
    62. }

    2.使用opp面向对象实现:

    1. package com.smallchange;
    2. import java.text.SimpleDateFormat;
    3. import java.util.Date;
    4. import java.util.Scanner;
    5. public class SmallChangeSys {
    6. public static void main(String[] args) {
    7. new SmallChangeSysOOP().meau();
    8. }
    9. }
    10. class SmallChangeSysOOP{
    11. boolean loop = true;
    12. String key = "";
    13. String details = "---------零钱通明细--------", note, choice;
    14. double money, balance = 0;
    15. Date date = null;
    16. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm");
    17. Scanner scanner = new Scanner(System.in);
    18. public void meau(){
    19. do {
    20. System.out.println("========零钱通菜单========");
    21. System.out.println("\t\t\t1 零钱通明细");
    22. System.out.println("\t\t\t2 收益入账");
    23. System.out.println("\t\t\t3 消费");
    24. System.out.println("\t\t\t4 退 出");
    25. System.out.print("请选择(1-4): \t");
    26. key = scanner.next();
    27. switch (key) {
    28. case "1":
    29. this.show();
    30. break;
    31. case "2":
    32. this.income();
    33. break;
    34. case "3":
    35. this.pay();
    36. break;
    37. case "4":
    38. this.exit();
    39. break;
    40. default:
    41. System.out.println("选择有误,请重新选择");
    42. }
    43. } while (loop);
    44. }
    45. public void show(){
    46. System.out.println(details);
    47. }
    48. public void income(){
    49. System.out.println("收益入账金额:");
    50. money = scanner.nextDouble();
    51. //金额校验等下写
    52. balance += money;
    53. date = new Date(); //获取到当前的日期
    54. details += "\n收益入账\t" + money + "\t" + sdf.format(date) + "\t" + balance;
    55. }
    56. public void pay() {
    57. System.out.print("消费金额:\t");
    58. money = scanner.nextDouble();
    59. System.out.print("消费理由:\t");
    60. note = scanner.next();//消费理由
    61. //金额校验等下写
    62. balance -= money;
    63. date = new Date(); //获取到当前的日期
    64. details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
    65. }
    66. public void exit(){
    67. System.out.print("你确定要退出吗?(y/n): \t");
    68. choice = scanner.next();
    69. if (choice.equals("y"))loop = false;
    70. }
    71. }

    本章太多了课后练习放在下一章

  • 相关阅读:
    面试突击:Bean 作用域是啥?它有几种类型?
    ActiViz中的纹理映射
    计算机毕业设计Java超市会员积分管理系统(源码+系统+mysql数据库+lw文档)
    Heap (mathematics)
    Jenkins测试报告样式优化
    基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章
    Python毕业设计-基于Python实现的深圳链家租房可视化系统源码+文档说明+条形图+数据库sql+界面截图
    编程小白如何学习RPA,0基础学习RPA攻略!
    Redis笔记
    2022年Web前端开发流程和学习路线(详尽版)
  • 原文地址:https://blog.csdn.net/m0_61927991/article/details/126905540