黑马程序员-->Java基础-->基础知识小结

来源:互联网 发布:阿里云机房测速 编辑:程序博客网 时间:2024/05/01 00:55

-------android培训java培训、期待与您交流! ----------

一、什么是java

Java是简单的、面向对象的、分布式的、解释型的、健壮的、安全的、结构中立的、可移植的、高性能的、多线程的和动态的。

Java是一门功能完善的通用程序设计语言,可以用来开发可靠的、要求严格的应用程序。它不仅用于Web程序设计,还用于在服务器、台式机和移动设备上开发跨平台的应用程序。Java有三个版本:Java标准版(Java SE)、Java企业版(Java EE)、Java微型版(Java ME)。Java SE可以用来开发客户端应用程序,Java EE可以开发服务器端的应用程序,Java ME可以开发移动设备的应用程序。在Java SE中也有很多版本,我们将要学习的是现在工业上最为流行的Java SE 6。


想要开发Java程序,还有一个很重要的东西叫做JDK。JDK是Java开发工具包的英文缩写。我们可以通过在命令行中调用JDK中的程序来编译和执行Java程序。当然,我们还有一种叫做IDE的神器,IDE的中文名字叫做集成开发环境,它能够让程序的编辑、编译、链接、调试都集成在一个图形界面中,能够帮助我们编写和调试Java程序。

 

二、Hello World

在第1行我们要先定义一个类,每个Java程序都至少应该有一个类。public代表这是一个公共类,类名必须与我们的文件名一致,
同一个文件中当且仅有一个public来修饰类。因此这里的类名是Main。要记住,每一个Java程序都要有一个以文件名命名的公共类
在3行我们定义了程序的主方法。在一个程序中,应该存在一个名为main的方法,作为程序开始执行的入口。
第5行是一条System.out.println语句,这条语句负责打印出”Hello World!”的消息,然后换行。Java中的每一条语句都以英文半角的分号(;)结束,
它也被称为语句结束符。


三、标示符和保留字

标识符由字母、数字、下划线(_)和美元符号($)所构成;标识符必须以字母、下划线或美元符号开头,不能以数字开头;
标识符不能是保留字;标识符不能是true、false或null;标识符可以有任意长度

保留字是在语言中已经被定义过了的字,我们不能将这些字再作为变量名或过程名。Java中有以下50个关键字:

 

四、注释

在Java中,连续的两个斜杠(//)称为注释符,它标注了程序是干什么的,以及它是如何来构建的。注释能够帮助程序员更好的理解程序。由于注释并不是程序设计语句,所以在编译器编译程序时,注释是会被忽略掉的。
在单行上用两个斜杠(//)来引导的叫做行注释,编译器会忽略这一行中“//”后面的文本。
在一行或多行使用“/*”和“*/”括住注释的情况叫做块注释,编译器会从“/*”开始,向后搜索到相应的一个“*/”标记,它们之间的文本就会被忽略。
文档注释:写入中的字符将会可以被Javadoc提取注释的工具提取出来制成文档,便于阅读。

 

五、变量

变量就是用来存储程序中使用到的数据的。
在Java中,变量的类型是非常重要的,因为编译器会根据变量的类型来为变量分配相应的存储空间。在Java中,有8种基本类型:
int:int为整数类型,用4个字节存储,范围为-2,147,483,648到2,147,483,647。在变量初始化的时候,默认值为0。

short:short也属于整数类型,用2个字节存储,范围为-32,768到32,767。在变量初始化的时候,默认值为0。

long:long也是整数类型,用8个字节存储,范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。在变量初始化的时候,默认值为0L或0l。后面的大写或小写L表示这个数据是long型的。

byte:byte也是整数类型,用1个字节存储,范围为-128到127。在变量初始化的时候,默认为0。

float:float属于实数类型,又称为单精度实数,使用4个字节来存储。在变量初始化的时候,默认值为0.0F或0.0f。与long相同,这个大写或小写的F代表这个数据是float类型的。

double:double属于实数类型,又称为双精度实数,使用8个字节存储。在变量初始化的时候,默认为0.0。

char:char属于字符类型,用2个字节存储。在变量初始化的时候,默认为”\0”。

boolean:boolean属于布尔类型,在存储时使用1位(而不是字节)来存储。它只有两个值,分别是true和false。在变量初始化的时候,默认为false。

 

六、基本类型占用内存大小以及类型转换

1、计算机内部是由无数个二进制数构成的,1字节(byte)等于8位(bit)二进制数,
 所以一般情况下,1byte=8bit,1short=2*8bit,1int=4*8bit,1long=8*8bit ,1float=4bit,1double=8bit,1char=2bit。
2、(1)占用内存空间小的基本类型要与占用内存空间大的基本类型作运算,就会自动提升类型;占用内存大的基本变量要转化成占用小的基本类型就需要强制转换类型。
如代码:
class Test5
{
 public static void main(String[] args)
 {
  byte a =1;//声明变量类型并初始化
  float b = 3.14f;//声明变量类型并初始化
  int c =(int)(a+b);//a自动类型提升为float后加上b,再强转为int类型。
  System.out.println(c);
 }
}

结果返回4。
分析结果。首先,byte类型a占用1bit,float类型3.14f占用4bit,做运算时,a自动提升为float类型,要得到4bit的int类型,做完运算后的结果为float类型,但是精度比int大,转化成int类型需要强制转换类型。
  (2)当基本类型作运算(+、-、*、/、%)时,运算符左右两边操作数的数据类型不一致时,遵循如下规则(JVM默认自动转换优先级):
只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型;
否则,只要两个操作数中有一个是float类型的,另一个将会被转换成float类型,并且结果也是float类型;
否则,只要两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型;
否则,两个操作数(包括byte、short、int、char)都将会被转换成int类型,并且结果也是int类型。
如代码:
class Test6
{
 public static void main(String[] args)
 {
  short s=2;//声明变量类型
  s=(short)(s+s);//加法运算,两个变量s都自动提升为int类型求和,再强转为short类型。
  System.out.println(s);
 }
}
输出结果返回4。
分析结果。 首先,两个变量都为short类型,做加法运算,两个变量都将会被转换成int类型,并且结果也是int类型,左右两边类型变量不同,占用空间内存不同,需要强转。
  (3)一个常量转化成double类型和float类型,需要先判断是否为整数,然后就是注意float类型有效位7位,double类型有效位17位。
如代码:
class Test7
{
 public static void main(String[] args)
 {
  double s = (int)4.342323543;//double类型强转int类型后自动提升为double类型。
  System.out.println(s);
 }
}
输出结果返回4.0。
分析结果。因为在一个数强转为double,会先判断,这个数是不是整数,如果是,就在后面加一个零,如果不是,就补足17位有效数字,不足用伪随机数补足。

总结:1、一个整数默认是int类型,如果用来给其它类型初始化,需要看被赋值类型的值域有没有包含该整数值。
 2、不作指定结果类型时,一般都是占用内存空间(字节)小的基础类型自动提升为占用内存空间(字节)大的基础类型。反之,需要强制转换成指定类型。
 3、基础类型优先转换按自然顺序排序,byte<short=char<int<long<float<double。

 

七、赋值语句和赋值表达式

声明变量以后,可以使用赋值语句为它赋一个值。在Java中,我们用一个等号(=)作为赋值运算符。赋值语句的语法是:x = 1;
如果我们在声明一个变量的同时为它赋值,这种行为一般叫做初始化:int x = 1;
我们也可以在一条语句中给多个变量赋值:x = y = z = 1;
在java中存在一些简化的赋值运算符:
 加法赋值运算符:i += 1;  i = i + 1;
 减法赋值运算符:i -= 1;  i = i - 1;
 乘法赋值运算符i *= 1;   i = i * 1;
 除法赋值运算符:i /= 1;   i = i / 1;
 求余运算符:i %= 1;   i = i % 1;
另外,Java还有更复杂一些的自增运算符:
  ++i 前置自增运算符,相当于i = i + 1
 i++ 后置自增运算符,相当于i = i + 1
 --i 前置自减运算符,相当于i = i - 1
 i-- 后置自减运算符,相当于i = i - 1

思考:i=1;i=i++;如果再输出i的值 结果是1 ,按照 i=i;i=i+1的算法不应该是2么??
 针对这个问题,我的理解是,java的编译器的问题。在c\c++中结果是2,因为他们的编译器不同所以编译机制也不同。
 具体是为什么呢?
 可以用java的分解类工具javap看看,i++的情况
 iconst_0 //把int类型的值压入栈顶
 istore_1 //将int类型的值存入局部变量
 iload_1 //从局部变量中装载int类型的值
 iinc 1,1 //把常量值1加到局部变量上
 istore_1//把栈顶的int类型的值存入变量中
 
首先,整数常量1存到栈顶(类似缓存空间),然后把栈顶的值赋给int型变量i ,将“int i =1”加载入栈,
 栈中变量i自增1,此时i=2,(直到这里我们讨论的都是“=”右边的部分)
 最后,把栈顶的1赋值给“=”左边的i,结果i=1还是1.(这里讨论的是“=”左边的部分)
 
总结:i = i++;先看“=”右边再看“=”左边;看右边时是把i初始的值1先保存到一个内存空间里,然后在栈中i的值自增1,最后JVM并没有将1赋给左边,而是将最初放在栈顶的1值赋给左边的i,所以结果还是1。

 

八、Scanner类

在很多情况下,我们需要Java程序能够对我们指定的值进行计算,这样的话就需要我们的Java程序能够读取我们所输入的值。我们可以使用Java自带的Scanner类来从控制台获取输入。
Scanner类在包java.util里。我们一般在程序代码的最开始引入所有需要用到的包和类。
Java使用System.out来表示标准输出设备,用System.in来表示标准输入设备。Java本身并不直接支持控制台输入,我们需要创建Scanner类它的对象,用以读取来自System.in的输入。
Scanner的实例对象,可以用nextInt()、nextByte()、nextShort()、nextLong()、nextFloat()、nextDouble()这些方法来接收数据。
代码如下:

 

 

-------android培训java培训、期待与您交流! ----------

0 0
原创粉丝点击