11月27日报告

1.final修饰符

修饰变量:     final修饰的变量是无法重新赋值的

并且用final修饰的成员变量定义时必须赋值

package com.langsin.finalDemo;

public class finalDemo {
    public final int value=100;
    public void run(){
        final int num=100;
    }
}

修饰方法: final修饰的方法是不能被子类重写的

publid final void study(){

System.out.println("每天学习4个小时");

}

修饰类: 是无法被继承的

public final class Test(){}

如果在父类构造方法中调用子类重写过的方法,

则在子类创建对象后,进行父类初始化时,

调用的是子类重写过的方法

2.用代码展示订单信息

(1)订单所包含的产品

package com.langsin.Product;

public class Product {
    //定义一个产品类
    private String id;      //每种产品ID
    private String name;    //每种产品名称
    private int price;      //每种产品价格
    private int num;        //每种产品数量
    private int count;      //每种产品总金额


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public int getCount() {
        return count;
    }

    public void setCount() {
        //计算每种产品总金额
        this.count = this.num * this.num;
    }

    @Override
    public String toString() {
        return "Order{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", num=" + num +
                ", count=" + count +
                '}';
    }
}

(2)订单信息

package com.langsin.Product;

public class Order {
    //定义一个订单类
    private String id;          //订单ID
    private String date;        //订单日期
    private int total;          //订单总金额
    private Product[] products; //订单所包含的商品对象,接收产品引用数据类型的变量

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal() {
        //计算总金额
        int total = 0;
        for (Product product : products) {
            total = total + product.getCount();
        }
        this.total = total;
    }

    public Product[] getProducts() {
        return products;
    }

    public void setProducts(Product[] products) {
        this.products = products;
    }

    public void showMessage() {
        //一个展示订单信息的方法,代替了toString方法
        System.out.println("订单编号:" + this.id);
        System.out.println("订单日期:" + this.date);
        System.out.println("订单总金额:" + this.total);
        System.out.println("订单列表:");
        for (Product product : products) {
            //产品类型已经重写过了toString方法,可以直接输出对象得到产品信息
            System.out.println(product);
        }

    }
}

 (3)测试类

package com.langsin.Product;

public class OrderDemo {
    public static void main(String[] args) {
        Order order1 = new Order();
        order1.setDate("2021.01.09");
        order1.setId("6426125d5a553fa12");

        //放着3个null
        //第一种产品
        Product pro1 = new Product();
        Product[] product1 = new Product[3];
        pro1.setName("吮指原味鸡");
        pro1.setId("ad32165342");
        pro1.setNum(15);
        pro1.setPrice(14);
        pro1.setCount();

        //第二种产品
        Product pro2 = new Product();
        pro2.setName("巧克力圣代");
        pro2.setId("2313e342s");
        pro2.setNum(10);
        pro2.setPrice(30);
        pro2.setCount();
        
        //第三种产品
        Product pro3 = new Product();
        pro3.setName("香辣鸡腿堡");
        pro3.setId("349385727y");
        pro3.setNum(20);
        pro3.setPrice(25);
        pro3.setCount();

        product1[0]=pro1;
        product1[1]=pro2;
        product1[2]=pro3;

        //把产品对象放入订单中
        order1.setProducts(product1);
        order1.setTotal();
        order1.showMessage();
    }
}

(4)运行结果 

11月27日报告

3.初始化块

同构造方法一样,可以完成对象初始化

初始化块是顺序执行的

[修饰符]{                     } 

修饰符只能是static

先把所有初始化块执行完,再执行构造方法

每创建一个对象,他对应的类都会进行一次初始化,

也就是调用一次初始化块和构造方法

package com.langsin.oop1;

public class Demo {
    int value=100;
    {
        System.out.println("初始化块1");
        System.out.println(value);
    }

    public Demo(){
        System.out.println("构造方法");
    }

}

当类中同时有变量定义和初始化块时,

他们是从上到下依次进行编译的

如果初始化块要用到他下方定义的变量,则系统会报错

如果变量用static修饰,则可以直接调用

因为用static修饰后,在加载类文件时(创建对象之前)就已经完成了编译,

package com.langsin.oop1;

public class Demo1 {
    public Demo1(){
        System.out.println("构造方法");
    }
    
    static int value=100;
    static {
        //Non-static field 'value' cannot be referenced from a static context
        System.out.println(value);
    }

}

加了static修饰的初始化块不能调用没有static修饰的变量

如果value在这个初始化块下方定义,则同样不能调用

在创建多个对象时,类成员(static修饰的初始化块)只需要加载一次,

实例成员(如构造方法)需要多次加载

Demo1 demo1=null;

没有创建对象,不会调用构造方法,

如果不在Demo1类中,则类初始化块不会加载,

如果在Demo1类中,则会加载一次类初始化块.

一个父类

package com.langsin.oop1;

public class Mu {
    static {
        System.out.println("静态初始化块Mother");
    }

    {
        System.out.println("普通初始化块Mother");
    }
    public Mu(){
        System.out.println("构造方法Mother");
    }


}

一个子类

package com.langsin.oop1;

public class Nv extends Mu{
    static {
        System.out.println("静态初始化块daughter");
    }
    {
        System.out.println("普通初始化块daughter");
    }
    public Nv(){
        System.out.println("构造方法daughter");
    }
}

创建一个子类对象,执行结果---

11月27日报告

4.题目

package com.langsin.oop1;

public class Test {
 public int a=10;           //(1)
 public static int b=20;    //(2)
 a=15;                      //(3)
 public static void f1(){   
     int a=10;              //(4)
     a=15;                  //(5)
     b=20;                  //(6)
     if (true){             //(7)
         int c=20;          //(8)
     }
     if (true)              //(9) 
         int d=10;          //(10)
 }
}

 其中第(3)行和第(9)(10)行出错

第(3)行对变量进行赋值,为可执行语句

在类体中只能执行定义变量

5.模拟ATM机进行操作

(1)能输入账号密码,实现登录操作

一共有3次机会,机会用完,账号冻结

(2)可以查询余额

(3)可以取款,取款金额不能比已有金额多

(4)可以进行存款

(5)可以更改密码,更改密码后需要重新登录账户

(6)退出操作

①用户类

package com.langsin.atm;

public class User {
    //定义用户类,存放用户名,密码,初始余额
    private String username;
    private String password;
    private int money;

    public User(String username, String password, int money) {
        this.username = username;
        this.password = password;
        this.money = money;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

}

②登录类

package com.langsin.atm;

import java.util.Scanner;

public class Login {
    //登录类
    static int num=0;
public static Boolean login(User user){
    System.out.println("请输入账号:");
    Scanner scanner=new Scanner(System.in);
    String string1=scanner.next();
    System.out.println("请输入密码:");
    String string2=scanner.next();
    if (string1.equals(user.getUsername())&&string2.equals(user.getPassword()))
    {return true;}
    else if (num!=2){
        num++;
        System.out.println("账号或密码错误,请重新输入");
        System.out.println("剩余"+(3-num)+"次机会");
        Login.login(user);
        return false;
    }
     else {
        System.out.println("机会已耗尽,账号已冻结");
        System.exit(0);
        return false;
    }
}

}

③ATM机主界面

package com.langsin.atm;

import java.util.Scanner;

public class ATM {

    static Scanner scanner = new Scanner(System.in);

    public static void main(User user) {
        //ATM机主菜单
        Boolean login = Login.login(user);
        while (login) {
            //选择功能界面
            System.out.println("请选择功能:  ");
            System.out.println("1.查看余额");
            System.out.println("2.存款");
            System.out.println("3.取款");
            System.out.println("4.更改密码");
            System.out.println("5.退出");
            String choice = scanner.next();
            switch (choice) {
                case "1":
                    viewBalance(user);
                    break;
                case "2":
                    deposit(user);
                    break;
                case "3":
                    withdraw(user);
                    break;
                case "4":
                    changePassword(user);
                    break;
                case "5":
                    Quit();
                    break;
            }

        }

    }

    private static void viewBalance(User user) {
        //查看余额操作
        System.out.println("余额:"+user.getMoney() + "元");
    }

    private static void deposit(User user) {
        //存款操作
        System.out.println("请输入要存入金额:");
        int money = scanner.nextInt();
        user.setMoney(money + user.getMoney());
        System.out.println("存款成功");
    }

    private static void withdraw(User user) {
        //取款操作
        System.out.println("请输入要取出金额:");
        int money = scanner.nextInt();
        if (money <= user.getMoney()) {
            user.setMoney(user.getMoney()-money);
            System.out.println("取款金额"+money);
            System.out.println("账号余额为:"+user.getMoney());
        } else {
            System.out.println("余额不足,请选择:");
            System.out.println("1.重新输入金额");
            System.out.println("2.退出");
            String string = scanner.next();
            switch (string) {
                case "1":
                    withdraw(user);
                    break;
                case "2":
                    main(user);
            }
        }

    }

    private static void changePassword(User user) {
        //更改密码操作
        System.out.println("请输入原密码:");
        String string1 = scanner.next();
        if (string1.equals(user.getPassword())) {
            System.out.println("请输入新密码:");
            String string2 = scanner.next();
            user.setPassword(string2);
            System.out.println("更改密码成功,请重新登录");
            ATM.main(user);
        } else {
            System.out.println("原密码错误,请选择:");
            System.out.println("1.重新输入");
            System.out.println("2.退出");
            String string2 = scanner.next();
            if (string2.equals("1")) {
                withdraw(user);
            }
        }
    }
    private static void Quit() {
        //退出操作
        System.exit(0);
    }
}

④测试类

package com.langsin.atm;

public class run {
    public static void main(String[] args) {
        //测试类
        User user=new User("root","rootroot",100000);
        ATM.main(user);
    }
}

上一篇:javaScript12-Date日期对象


下一篇:27. 移除元素