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)运行结果
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");
}
}
创建一个子类对象,执行结果---
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);
}
}