逻辑运算符

除了关系运算符(>, <, ==, >=, <=, !=>)以外,Java还提供了三种逻辑运算:

逻辑运算符 释义 说明 例子
&& 逻辑 两个都为true结果为true,有一个是false结果为false a>6 && a<10
|| 逻辑 有一个为true结果为true,两个都为false结果为false b==10 || b==11
! 逻辑 truefalsefalsetrue !(x > 3)

Tips. 逻辑运算符的运算顺序

假设E1E2E3是三个关系表达式; 比如E1代表a>6, E2代表a<10E3代表a!=8,那么E1, E2, E3的结果是true或者false

  • E1 && E2: 如果E1false,则直接返回false(不计算E2);如果E1true,再判断E2
  • E1 || E2: 如果E1true,则直接返回true(不计算E2);如果E1false,再判断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),如果AB相等,则返回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();
	}
}