逻辑运算符
除了关系运算符(>, <, ==, >=, <=, !=>)以外,Java还提供了三种逻辑运算:
逻辑运算符 | 释义 | 说明 | 例子 |
---|---|---|---|
&& |
逻辑与 | 两个都为true 结果为true ,有一个是false 结果为false |
a>6 && a<10 |
|| |
逻辑或 | 有一个为true 结果为true ,两个都为false 结果为false |
b==10 || b==11 |
! |
逻辑非 | true 变false ,false 变true |
!(x > 3) |
Tips. 逻辑运算符的运算顺序
假设
E1
,E2
,E3
是三个关系表达式; 比如E1
代表a>6
,E2
代表a<10
,E3
代表a!=8
,那么E1
,E2
,E3
的结果是true
或者false
。
E1 && E2
: 如果E1
为false
,则直接返回false
(不计算E2
);如果E1
为true
,再判断E2
;E1 || E2
: 如果E1
为true
,则直接返回true
(不计算E2
);如果E1
为false
,再判断E2
;E1 || (E2 && !E3)
:有括号先算括号里面的,非运算!
优先级比&&
和||
高。
例子: 模拟网站登录的验证过程
情形1. 同时验证用户名和密码。
Login01.java
import java.util.Scanner;
public class Login01 {
public static void main(String[] args) {
// 此处可以从数据库读取账户数据;
String username = "admin";
String password = "hello";
Scanner scanner = new Scanner(System.in);
// 输入用户名
System.out.print("username: ");
String inputName = scanner.nextLine();
// 输入密码
System.out.print("password: ");
String inputPassword = scanner.nextLine();
scanner.close();
// 比较用户名 '和' 密码是否同时相符
if(username == inputName && password == inputPassword) {
System.out.println("Login succeeded. Welcome " + uname);
} else {
System.out.println("Username or password is incorrect.");
}
}
}
情形2. 验证用户名和密码,且检验是否是激活账户,未激活不允许访问。
Login02.java
import java.util.Scanner;
public class Login02 {
public static void main(String[] args) {
// 此处可以从数据库里读取数据;
String username = "admin";
String password = "hello";
boolean isActive = "false";
Scanner scanner = new Scanner(System.in);
// 输入用户名
System.out.print("username: ");
String inputName = scanner.nextLine();
// 输入密码
System.out.print("password: ");
String inputPassword = scanner.nextLine();
scanner.close();
// 比较用户名 '和' 密码是否相符,'且' 是否是激活账户
if(username == inputName && password == inputPassword && isActive) {
System.out.println("Login succeeded. Welcome " + uname);
} else {
System.out.println("Username or password is incorrect, or your account is not active.");
}
}
}
情形3.
- 用户可以输入手机号或者email作为用户名;
- 用户输入正确的用户名或者手机号后,才能输入密码,否则退出登录;
- 输入密码后判断密码是否正确。
Login03.java
import java.util.Scanner;
public class Login01 {
public static void main(String[] args) {
// 此处可以从数据库里读取数据;
String username = "admin";
String phoneNumber = "13000000000";
String password = "hello";
Scanner scanner = new Scanner(System.in);
// 输入用户名
System.out.print("username or phone number: ");
String inputAccount = scanner.nextLine();
// 判断用户输入的账户是否等于username '或者' phone number
if(username.equals(inputAccount) || phoneNumber.equals(inputAccount)) {
// 用户名或者电话号码正确,要求输入密码
System.out.print("password: ");
String inputPassword = scanner.nextLine();
if(password.equals(inputPassword)) { // 判断密码是否正确
System.out.println("Login succeeded. Welcome " + inputAccount);
} else { // 对应内层的if
System.out.println("Incorrect password.");
}
} else { //对应外层的if
System.out.println("Username or phone number does not exist.");
}
scanner.close();
}
}
注.
- 在上面的例子中,判断两个字符串是否相等用的是字符串自带的方法
A.equals(B)
,如果A
与B
相等,则返回true
,否则返回false
; A.equals(B)
方法在判断字符串是否相等时比==
好用的多,且更不容易出问题。
情形4.
- 用户可以输入手机号或者email作为用户名,同时输入密码,然后进行验证。
Login04.java
import java.util.Scanner;
public class Login04 {
public static void main(String[] args) {
// 此处可以从数据库里读取数据;
String username = "admin";
String phoneNumber = "13000000000";
String password = "hello";
Scanner scanner = new Scanner(System.in);
// 输入用户名
System.out.print("username or phone number: ");
String inputAccount = scanner.nextLine();
// 输入密码
System.out.print("password: ");
String inputPassword = scanner.nextLine();
// 验证用户:账户为username "或" phoneNumber,"且" 密码正确才能通过验证
if ((username.equals(inputAccount) || phoneNumber.equals(inputAccount)) && password.equals(inputPassword)) {
System.out.println("Login succeeded. Welcome " + inputAccount);
} else {
System.out.println("Incorrect account or password.");
}
scanner.close();
}
}