Java基础1,入门基础知识

本文知识点(目录):

    1、java简介
    2、环境的搭建
    3、关键字
    4、标识符
    5、注释
    6、常量
    7、进制的转换
    8、变量
    9、数据类型的转换
    10、运算符



1、Java简介

语言起源

JavaSUN ( Stanford University Network 斯坦福大学网络公司 ) 1995年推出的一门高级编程语言。Java名称的来源Java最初被命名为Oak,目标在于家用电器等小型系统的编程语言,随着市场的变化,SUN公司着眼于网络应用的开发。Java的名字的来源:Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。 

1995523日,JAVA语言诞生  (雏形)

1996年,1997分别推出JDK1.0JDK1.1

1999年,JAVA被分成J2SE,J2EE,J2ME

2000年,JDK1.4发布

200493018:00PMJ2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0

2005年,JAVA版本正式更名为JAVAEE,JAVASE, JAVAME

200612月,SUN公司发布JRE6.0   

20090420日,Oracle74亿美元收购Sun。取得java的版权。

20109月,JDK7.0已经发布,增加了简单闭包功能。   

20117月,甲骨文公司发布java7的正式版。

1.1、常见的dos命令

盘符: 进入指定的盘符下。

dir : 列出当前目录下的文件以及文件夹

md : 创建目录 

rd : 删除目录    注意:rd不能删除非空的文件夹,而且只能用于删除文件夹。

cd : 进入指定目录

cd.. : 退回到上一级目录

cd \ : 退回到根目录

echo "hello java">a.txt  写入文本到指定文件  

type a.txt 显示文件内容命令

del : 删除文件    注意:不能删除文件夹,只能删除文件。

exit : 推出dos命令行

cls : 通知计算机将当前的命令清空

* :  是通配符。

tab : 命令补全。

方向键:上下键是找回上次你写过的命令。

1.2、java语言重要特性之跨平台 

1.2.1 跨平台

什么是跨平台(计算机系统),跨平台概念是软件开发中一个重要的概念,即不依赖于操作系统,也不信赖硬件环境。一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。

1.2.2 Java的跨平台

“write once run anywhere”

Java的跨平台是相对于其他编程语言而言的,通过Java语言编写的应用程序在不同的系统平台上都可以运行。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。在windows编译的c语言程序,在linux下是不能运行的。当然在linux下编译的c语言程序在windows下也是不能运行的。而Java语言在不同平台上运行时不需要重新编译。

Java跨平台的原理:Java的跨平台是通过Java虚拟机(JVM)来实现的。

1.2.3 Java虚拟机(JVM

Java Virtual Machine 一个软件模拟的计算机。Java源程序想象成我们的C源程序,Java源程序编译后生成的字节码(.class)就相当于C源程序编译后的二进制可执行文件。JVM虚拟机相当于计算机系统(操作系统+硬件环境),Java解释器相当于CPU。

.exe文件直接在windows操作系统下运行,在CPU上运行的是机器码(.exe文件)

.class字节码文件是运行在JVM虚拟机下的,在Java解释器上运行的是Java字节码。

Java解释器相当于运行Java字节码的“CPU”,但该“CPU”不是通过硬件实现的,而是用软件实现的。Java解释器实际上就是特定的平台下的一 个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当前,并不是在所有的平台 下都有相应Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。

 

 

1.3、Java的三大平台

JavaSE

   Java SEJava PlatformStandard EditionJava SE 以前称为J2SE。它允许开发和部署在桌面服务器、嵌入式环境和实时环境中使用的Java 应用程序Java SE 包含了支持Java Web 服务开发的类,并为Java PlatformEnterprise EditionJava EE)提供基础。
例子:类似QQ、微信、飞秋、电脑管家这样子的桌面应用。

Java EE

   Java EEJava PlatformEnterprise Edition。这个版本以前称为J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在Java SE 的基础上构建的,它提供Web 服务组件模型、管理和通信API,可以用来实现企业级的面向服务体系结构service-oriented architectureSOA)和Web 2.0 应用程序。 

Java ME

   Java MEJava PlatformMicro Edition。这个版本以前称为J2ME,也叫K-JAVAJava ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

 

2、环境的搭建

2.1、JDK简介:

JDKJava Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDKJDK 是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。JDK是学好Java的第一步。从SUNJDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。

2.2、JDK的安装

网址:http://www.oracle.com/index.html http://www.java.sun.com

2.3JDK目录介绍

  1. bin 目录:存放Java的编译器、解释器等工具(可执行文件)。
  2. db 目录:JDK7附带的一个轻量级的数据库,名字叫做Derby。
  3. include 目录:存放的调用系统资源的接口文件。
  4. jre 目录:存放Java运行环境文件。
  5. lib 目录:存放Java的类库文件。
  6. src.zip文件:JDK提供的类的源代码。

 

附:

 

安装JDK需要注意的事项:

  1. 安装路径中不要包含中文
  2. 安装路径中不要包含空格。

2.4、JRE

JRE  Java Runtime Environment Java运行环境。包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

2.5、配置path环境变量

问题:目前在控制台窗口下只能在jdk安装目录的bin目录下才能使用jdk的开发工具在控,如果想制台窗口下想要在任意目录下都可以使用javacjava或者jdk其他的开发工具那应该怎么做呢?

1.dos窗口敲上javac

我们在随意的一个目录敲javac或者java命令时候,发现dos窗口显示这个不是内部命令,然后我们在上面敲上notepad命令时,打开了一个记事本的程序,但是在当前目录下页没有存在notepad.exe的可执行文件,那么为什么能启动呢?

错误原因:原来在dos窗口上写上一个命令时候,如果在当前目录下找不到指定的可执行文件,那么它会根据path环境变量保存的路径去搜索是否存在这个可执行文件,如果存在则启动该程序,否则就没有这个命令。

2.解决方法:

1、 进入jdk的安装目录的bin目录。

2、 dos命令上敲javac(如果出现了以上的图信息则配置成功)

3.为什么要配置path环境变量

因为在jdkbin文件夹中有很多我们在开发中要使用的工具,如java.exe,javac.exe,jar.ex,那么我们在使用时,想要在电脑的任意位置下使用这些java开发工具,那么我们就需有把这些工具所在的路径配置到系统的环境变量中,当我们使用时,系统可以帮且我们找到这些命令。

4.如何配置path环境变量

我们将jdkbin的路径进行复制

在我们电脑-----à属性-----à高级-----à环境变量---------àpath这项

bin的路径放置到path的最前边,别忘记加分号.

5.JAVA_HOME环境的配置

有时候可能需要更换Jdk的目录,但是经常修改path的值可能会不小心修改其他的路径,解决方法:

1、 创建一个JAVA_HOME的变量。

2、 JAVA_HOME的值为JDK的安装目录。

3、 配置path路径:%JAVA_HOME%/bin

以后需要更换JDK的目录时,只需要更换JAVA_HOME的目录即可。

设置临时变量:

set : 查看所有的环境变量信息。

set  变量名 :查看具体一个环境变量的值。

set  变量名=:清空一个环境变量的值。

set  变量名=具体值 :给指定变量定义具体值。

想要在原有环境变量值基础上添加新值呢?

首先,通过%变量名%操作符获取到原有环境变量的值。

然后加上新值后在定义给该变量名即可

举例:给path环境变量加入新值

set  path=新值;%path%

注意:这种配置方式只在当前dos窗口有效。窗口关闭,配置消失。

2.6、 classpath环境变量

1、classpath的作用作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,一旦配置了classpath路径信息的时候,jvmjava编译器都会根据classpath指定的路径去寻找class文件。

2、如何设置当前目录(.

set classpath=.;设置路径 与 set classpath=设置路径;.有什么区别?

“.”在前面的时候,java虚拟机会先从当前路径去寻找class文件,然后再到指定的路径去需找。如果”.”在后面,java虚拟机则会先寻找指定好的路径,然后再在当前的路径去寻找。

设置classpath的时候要加上 ; 就会在当前目录下查找。

 

3、关键字

3.1 关键字的概述

Java的关键字对java编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名。

3.2 常见的关键字

4标识符

4.1 什么是标识符

就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Demo,就是我们定义的类名。类名就属于标识符的一种。

标识符除了应用在类名上,还可以用在变量、函数名、包名上。

4.2 标识符必须遵循以下规则

  1. 标识符由26个英文字符大小写(a~z,A~Z)、数字(0~9)、下划线(_)和美元符号($)组成。
  2. 不能以数字开头,不能是关键字
  3. 严格区分大小写
  4. 标识符的可以为任意长度

4.3  标识符案例

4.3.1 合法的标识符

ComputeArearadiusarea $itcast   _itcast  gz_itcast

注意:由于Java严格区分大小写,ITCASTitcast是完全不同的标识符

4.3.2 非法标识符

  1. class (关键字)
  2. 100java(不能以数字开头)
  3. Hello java (空格不是组成标识符的元素)
  4. 包名

4.3.3 Java中的标识符命名规范

1、包名

  多个单词组成时所有字母小写(例:package  com.itcast

2、类名和接口

  多个单词组成时所有单词的首字母大写(例:HelloWorld)

3、变量名和函数名

  多个单词组成时第一个单词首字母小写,其他单词首字母大写(例:lastAccessTimegetTime)。

4、常量名

  多个单词组成时,字母全部大写,多个单词之间使用_分隔(例:INTEGER_CACHE

注意只是为了增加规范性、可读性而做的一种约定标识符在定义的时候最好见名知意,提高代码阅读性。

 

5、注释

5.1 注释的作用

通过注释提高程序的可读性,是java程序的条理更加清晰,易于区分代码行与注释行。另外通常在程序开头加入作者,时间,版本,要实现的功能等内容注释,方便后来的维护以及程序员的交流。

5.2 注释的种类

1.单行注释line comment)用//表示,编译器看到//会忽略该行//后的所文本

2.多行注释 (block comment)/**/表示,编译器看到/*时会搜索接下来的*/,忽略掉/**/之间的文本。

3.文档注释/**  */表示,java特有的注释,其中注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。

文档注释(编写软件说明书)

  1、需要使用sum给我们提供的javadoc工具生成一个html的说明文档。

  2、只能抽取public的属性或者方法内容。

格式:

  Javadoc -d 指定存储文档的路径 -version -author(可选) 目标文件

  @author 作者

  @version 版本

  @param 方法的参数

  @return 返回值

注释的使用细节:三种注释可以出现在程序的任何地方,但是不推荐找任意位置。

注意:文档注释只能出现在类、属性、方法的上面。

 

6、常量 

6.1 常量的概述

常量是指在程序运行过程中其值不能改变的量

6.2 常量类型

Java中常量的分类:

    整数常量 所有整数

    小数常量 所有小数

    布尔常量 只有truefalse

    字符常量 :使用’’引起来的单个字符

    字符串常量 :使用“”引起来的字符序列,“”  、“a” 、” ” 

    null常量 : 只有一个值null

6.3 char类型

char类型表示的是单个字符类型,任何数据使用单引号括起来的都是表示字符。字符只能有一个字符。      

    注意:特殊字符的转义序列:转义字符

转义字符的概述:

特殊字符使用”\”把其转化成字符的本身输出,那么使用”\”的字符称作为转移字符。

需求:使用输出语句,打印出带引号的信息例如输出。

System.out.println("teacher said"java is fun""); 编译是无法正常通过的。语法有错误,编译器读到第二个引号就认为是字符串的结束,剩余的不知道怎么处理。如何解决这个问题:java中使用转义字符来表示特殊的字符。一个转义字符以反斜杠(\)开始。

     问题:想要打印带引号的字符串怎么办,就可以使用反斜杠(\)后跟字符,这个反斜杠就是转义字符。

\r 表示接受键盘输入,相当于按下回车。

\n 表示换行。

\t  制表符,相当于Table键(相当于四个空格)

\b 退格键,相当于Back Space

\’  单引号

\’’ 双引号

\\ 表示一个斜跨

上述问问题解决:System.out.println("teacher said\"java is fun\"");

注意:换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符

6.4 boolean 类型

boolean由数学家Geogore Boole 发明

boolean 类型用来存储布尔值,在java中布尔值只有2个,truefalse

boolean flag = true;

flag = false;

 Java中这8种基本数据类型都是小写的。

 

7、进制的转换

进制:进制是一种记数方式 以用有限的数字符号代表所有的数值。由特定的数值组成。

7.1 整型的表现形式

  1. 十进制: 都是以0-9这九个数字组成,不能以0开头。
  2. 二进制: 01两个数字组成。
  3. 八进制: 0-7数字组成,为了区分与其他进制的数字区别,开头都是以0开始(注:数字0,而非字母o)。
  4. 十六进制:由0-9A-F组成。为了区分于其他数字的区别,开头都是以0x开始(注:数字0,而非字母o)。

 十进制转二进制的转换原理:除以2,反向取余数,直到商为0终止。

 二进制转十进制的转换原理:就是用二进制数(从右到左)乘以2n次方,n0开始,每次递增

如:二进制1001,转十进制:1*2^0 + 0*2^1 + 0*2^2 + 1*2^3 = 1+0+0+8 = 9

7.2 八进制的特点

 由数字0-7组成。即使用三个开关表示一个八进制数。

  进制转换进制原理:就是用十进制的数字不断除于8,取余数。

 八进制转十进制原理: 用八进制数(从右到左)不断乘以8n次方,n0开始,每次递增1

如:八进制21,转十进制:1*8^0 + 2*8^1 = 1+16 = 17

二进制转八进制:

八进制转二进制:(比如226)

7.3 十进制与十六进制之间的转换

 十六进制特点:由0~9 a(10) b(11) c(12) d(13) e(14) f(15)组成。

 十进制转十六进制原理:就是不断除以16,取余数。

十六进制转十进制:

如:十六进制100,转十进制:0*16^0 + 0*16^1 + 1*16^2= 0+0+16*16 = 256

二进制转十六进制:

  

 

8、变量

8.1 变量的概述

1.变量的概述

用于存储可变数据的容器。

2.变量存在的意义

计算机主要用于处理生活中的数据,由于生活中存在大量的可变数据,那么计算机就必须具备存储可变数据的能力。

比如:

 1.时间每一秒都在发生变化,根据不同的时间要有不同的处理方式。

 2.气象站会根据温度发布天气预报信号。

3.变量的特点

正常情况下牛奶盒装的都是牛奶,而且会根据牛奶的多少去决定要多大的容量的牛奶盒,AB两位同学同时把牛奶盒放进篮子里面,但是需要区分两个牛奶盒是谁的,都需要在牛奶盒上做一个标志。

特点:

  1. 必须要有大小
  2. 存储一定格式的可变数据
  3. 必须要有名字

8.2 变量的数据类型(四类八种)

1. 整型

byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0

short:短整型,在内存中占2个字节(16 bit),取值范围-32768~32717,默认值0

int:整型,用于存储整数,在内存中占4个字节,取值范围-2147483648~2147483647,默认值0

long:长整型,在内存中占8个字节,取值范围-2^63~2^63-1,默认值0L

如果一个数值没有采取特殊的处理,那么该整数默认的类型是int

可以使用数值后面添加L或小写L改变默认的整数类型。

2. 浮点型

    float  代表四个字节的大小  32bit

    double 代表八个字节的大小  64bit

java程序中所有的小数默认的类型是double类型,所以需要使用特殊的符号改变默认的小数类型。

3. 字符型

    char   代表两个字节的大小  16bit  2(16)

原理:将字符映射为码表中对应的十进制数据加以存储。

4. 布尔型

     boolean  占一个字节。只有truefalse两个值。

8.3 变量的声明

格式: 数据类型 变量名字1 , 变量名字2 ,……变量名字n ,;

案例:

int i 声明了一个整形的变量。

double d 声明了一个double数据类型的变量

float  f 声明了一个float数据类型的变量。

备注:变量名的首字母都一般都是以小写字母开始。

8.4 变量的初始化(方式

初始化方式1: 数据类型 变量名字 数值。

初始化方式2: 数据类型 变量名字 , 变量名字 数值。

案例

  方式1double d = 3.14;

  方式2double d ;  d = 3.14 ;

 

9、 java数据类型的转换

Java中可以进行不同数据类型的加减乘除运算吗?是可以的。在算术运算符中已经体验过如果两个整数(int)相除会去掉小数部分。如果需要保留小数部分,可以让除数或者被除数变为double类型的(5变为5.0)。其实Java是自动的将int的那个数变为了double类型了也就是Java自动的将整数变为了浮点数。例如5/2.0 其实是5.0/2.0

9.1、 自动类型转换(也叫隐式类型转换)

可以将一个数赋值给更大数值范围的变量,例如可以经byte 变量赋值给short变量可以将short变量赋值给int变量可以将int变量赋值给long变量。

Java内部其实做了工作就是自动将数值进行了类型提升,就叫做自动类型转换(也叫隐式类型转换)

    byte b = 1; //00000001
    short s = b;  //00000000 00000001
    int i = s;
    long lon = i;
    double d = lon; //1.0        

自动类型转换(也叫隐式类型转换)

要实现自动类型的转换,需要满足两个条件,第一两种类型彼此兼容,第二目标类型取

值范围必须大于源类型。所有的数字类型,包括整形和浮点型彼此都可以进行转换。

例如:

    byte b=100;
    int x=b;
    System.out.println(x);//程序把b结果自动转换为int类型。

9.2、 强制类型转换(也叫显式类型转换)

不可以将一个数值赋给范围更小数值范围的变量,除非进行类型转换。

    byte b = 100;
    b = b + 2;
    System.out.println(b);

上述例子发生了什么,发生了类型转换。

b+2 遇到了加法运算,2默认是int类型,byte类型b变量存储的值自动类型提升为了int类型。执行完加法运算后的结果就是int类型,想要将int的类型值放入到byte类型变量b中,无法放入,编译报错。

    byte b=1;
    b=(byte)(b+2);

当两种类型彼此不兼容,或者目标类型取值范围小于源类型(目标是byte源是int

无法自动转换,此时就需要进行强制类型转换。

9.3 强制类型转换需要注意: 

损失精度!!!

    int a=128;
    byte b=(byte)a;
    System.out.println(b);//-128
    /*
     * 此时的强转已经造成了数值的不准确
    */

再次分析此行代码

    byte b = 100;
    b = b + 2; 
    System.out.println(b);

编译:提示如下错误。

9.4、类型转换的原理

可以把byte 理解为1两的碗,short 2两的碗,int 4两的碗,long 8两的碗。1两碗的满碗酒可以倒入 248两的碗中。但是 4两碗的酒倒入1两碗的酒就有一些问题。

9.5、 什么时候要用强制类型转换

   比如小数部分只想保留整数部分.

   一定要清楚要转换的数据在转换后数据的范围内否则会损失精度.

public static void main(String[] args) {
        byte b = 100;
        b = (byte) (b + 2); 
        System.out.println(b); // 102
        //舍弃小数部分
        double d=5.5;
        int num=(int)d; 
}

9.6、 表达式的数据类型自动提升

算术表达式,逻辑表达式

所有的byte型、short型和char的值将被提升到int型。

如果一个操作数是long型,计算结果就是long型;

如果一个操作数是float型,计算结果就是float型;

如果一个操作数是double型,计算结果就是double型。

分析 System.out.println(‘a’+1)结果?

自动类型提升

  byte b = 3;
   int x = 4;
   x = x + b;// b会自动提升为int 类型参与运算。
   System.out.println(x);// 7

强制类型转换

    byte b = 2;
    /*
    * 强制类型转换,强制将b+2强制转换为byte类型,再赋值给b
    */
    b = (byte) (b + 2); 
    System.out.println(b);// 4

10 java运算符

10.1.算术运算符

正负号(+,-)

除法

%取模

  求余数

    

  取模的正负取决与被除数:

    

 自增

++)前自增:先自增完毕,再运算整个表达式,语句分号前面的都是运算表达式;

后自增,先运算完整个表达式(分号前面的都是表达式),再进行自增;

结论:

如果运算符在变量的前面,则该变量自增1或者自减1,然后返回的是变量的新值,如

果运算符在变量的后面,则变量也会自增或者自减1,但是返回的是变量原来的值。++在前就是先运算,再取值,++在后就是先取值,再运算。

10.2 赋值运算符

 

a+=b 可以想象成 a=a+b;

变量声明完了之后,可以使用赋值语句(assignment statement)给变量赋一个值,Java中使用等号(=)作为基本的赋值运算符(assignment operator),

格式如下:

variable = expression;
变量     =  表达式;

变量我们已经知道如何声明,表达式具体如何定义?

表达式的定义:

表达式涉及到值(常量),变量和通过运算符计算出的值,以及他们组合在一起计算出的新值。

x =y+1;

例如:

public static void main(String[] args) {
        int x = 1; // 声明int变量x, 赋值1给变量x
        int y = 0; // 声明int变量y, 赋值0给变量y
        double area; // 声明double变量area
        double radius = 1.0; // 声明double变量radius,并赋值1.0给变量radius
        x = 5 * (3 / 2) + 3 * 2; // 将=右半部分表达式的计算结果赋值给变量x
        x = y + 1; // 将变量y和1的求和的值赋值给变量x
        area = radius * radius * 3.14159; // 将计算面积的值赋值给变量area
 }

10.3 比较运算符

如何比较两个值?使用比较运算符 35谁大,在java中如何比较?

比较运算符比较的两边操作数,结果都是boolean的,只有truefalse两种结果。

 

注意的细节:

1.使用比较运算符的时候,要求两种数据类型必须一致。

   byteshortchar 会自动提升至int

10.4 逻辑运算符

什么是逻辑运算符?连接比较运算符的符号称之为逻辑运算符。那么为什么要连接比较运算符? 举例:当你去公司应聘,招聘要求,男性(判断为真),并且开发经验1年(判断为假)那么,我们还适合去面试吗,不能,因为只满足了一项,总体是不满足的(总体结果为假)。

逻辑运算符用于对boolean型结果的表达式进行运算,运算的结果都是boolean型。我们的比较运算符只能进行一次判断,对于对此判断无能为力,那么逻辑运算符就可以经将较运算符连接起来。

逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6

“&”“&&”的区别:单与时,左边无论真假,右边都进行运算;双与时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。

“|”“||”的区别同理,双或时,左边为真右边不参与运算。

“ ^ ”异或与“|”或的不同之处是:当左右都为true时,结果为false

& :与   |: 或   ^: 异或   !:

1&

  true  & true  = true ;
  false & true  = false;
  true  & false = false;
  false & false = false;

总结 & 符号特点

& : 只要两边的boolean 表达式结果,有一个false.那么结果就是false

只有两边都为true ,将结果为true.

2|

 true   |  true   = true;
 true   |  false  = true;
 false  |  true   = true;
 false  |  false  = false;

总结 | : 两边只要有一个为真结果就为真,当两边同为假时结果才为假.

3^  异或

  true   ^  true  = false;
  true   ^  false = true;
  false  ^  true  = true;
  false  ^  false = false;

^ : 两边相同结果是false

两边不同结果是true;

4!

true  = falsefalse = true

5&&  短路

研究发现,&运算只有两边全为真的时候,结果才为真,那么当左边为假的时候就没有必要在进行判断,&&就产生了。

int a =4;

a >3 && a< 6;

a >3 & a< 6 ;

在这种情况下世没有区别的

如果:

a =2

a >3 & a< 6    2大于 3 为假, 接着运算 2 小于6 为真,总的结果为假

a >3 && a< 6;   此时a 不大于3 结果为false 右边不运算了.即短路.所以&& 比& 效率稍微高了一点.

public static void main(String[] args) {
        int x = 0;
        int y = 1;
        if (x == 0 && y == 1) {
            System.out.println(x + y);
        }
}

10.5 位运算符

 

规则:

可以把1当做true 0当做false

只有参与运算的两位都为1&运算的结果才为1,否则就为0

只有参加运算的两位都是0| 运算的结果才是0,否则都是1

只有参加运算的两位不同,^ 运算的结果才为1,否则就为0

1& 与运算

& 参见运算的两位数都为1&运算符结果才为1,否则就为0

2| 或运算

| 参与运算的两位都为0|运算的结果才为0,否则就为1

3^ 异或运算

^只有参加运算的两位不同,^运算的结果才为1,否则就为0

4、 ~ 反码

就是取反,二进制只有10,取反就是如果为1,取反就是0,如果是0,取反就是1

System.out.println(~6);//-7

结论:当参与取反的数值是正数时,把对应的值加上负号,再-1

           当参与取反的数值是负数时,把对应的值加上负号,再-1

   负数的表现形式就是对应的正数取反,再加1。负数的最高位肯定是1

5负数表示

负数对应的正数的二进制-1,然后取反。

6异或特点

一个数异或同一个数两次,结果还是那个数.  用处一个简单的加密思想.

除了这些位运算操作,还可以对数据按二进制位进行移位操作,Java的移位运算符有三种。

10.6 移位操作符

 

案例:

1、左移 (算术移位)

3<< 2 是如何在计算机里是实现的?

首先将3转换为2进制,

结论:左移就相当于乘以2的位移个数次幂.

 2、右移

 

结论:右移就相当于除以2的位移个数次幂.

结论:一个数往左移越移越大,往右边移越来越小.

推论

左移规律

3<<2=12;  3<<1=6 ;  3<<3=24;

3*4=12 ;  3*2=6;    3*8=24;

3*22=12;   3*21=6    3*23 =24;

结论往左移几位就是乘以2的几次幂。

右移规律

6>>2=1  ;6>>1=3 ;

6/4=1   ; 6/2=3 ;

右移两位就是除以 22次方,右移一位就是除以2的一次方。

总结

  >> 是除以2的移动位数次幂

  << 是乘以2的移动位数次幂

用处最快的运算是位运算。

3、无符号右移 (逻辑移位)

通过演示发现右移时高位就空了出来, >> 右移时高位补什么要按照原有 数据的最高位来决定。

1111-1111 1111-1111 1111-1111 1111-1010    -6>>2

1111-1111 1111-1111 1111-1111 1111-0010    

 最高位补什么要看原有最高位是什么

那么使用>> 后原来是最高位1 的那么空出来的最高位还是1 的,是0的还是0

如果使用>>> 无论最高位是0还是1 空余最高位都拿0 ,这就是无符号右移。

1111-1111 1111-1111 1111-1111 1111-1010    -6>>>2

001111-1111 1111-1111 1111-1111 1111-10    

结果是;1073741822

10.7 三元运算符(也叫三目运算符)

格式:(条件表达式)?表达式1:表达式2

解析:

1、如果条件为true,运算后的结果是表达式1

2、如果条件为false,运算后的结果是表达式2

示例:

1获取两个数中大数。

int x = 1;
int y = 2;
int z;
z = x > y ? x : y;
System.out.println(z); //2

10.8 运算符的优先级与结合性

 

 

 

 

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:http://www.cnblogs.com/dshore123/p/8592125.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

 

posted @ 2018-03-17 19:31  DSHORE  阅读(1128)  评论(1编辑  收藏  举报