Java基本介绍
The Java™ Programming Language is a general-purpose, concurrent, strongly typed, class-based object-oriented language. It is normally compiled to the bytecode instruction set and binary format defined in the Java Virtual Machine Specification.
面向对象向编程的三大特性:
- 封装
- 继承
- 多态
JVM:Javac之后的字节码是一样的,但不同平台下JVM不同,通过各平台的JVM解释之后就可以在相应平台运行,造就了java的跨平台特性,“一次编译,到处运行”。
Java不仅仅是一门编程语言,还有背后博大的开源生态,而且Java本身也在不断进步,尤其在Java 1.5后增加了许多的新特性。
Oracle官网显眼位置的Java往往都是最新的,想下载特定历史版本,参考:
https://jingyan.baidu.com/article/9989c746064d46f648ecfe9a.html。
学习Java**多看源码!多看源码!多看源码!**结合API doc,学习源码的编程风格和设计思想、算法应用!其他框架亦如是!
Java基本概念
标识符
26个英文大小写,数字0~9,符号_及$组成;不能用数字开头,不能与关键字重复。
转义字符:
\n 换行(LF)
\f 换页(FF)
\r 回车(CR)
\t 制表符
\
\’
\”
注释
“//”、“/* */”
同C语言中类似;
“/** */”
javadoc注释;
作用:注解说明&&调试程序;
常量
关键字:final,如Math类中对常量的定义:
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
Java中定义常量的几种方式
小数:单精度、双精度;
布尔型(boolean):true or false;
字符常量:单引号’’;
字符串常量:双引号” ”;
Null型:null
(变量)数据类型
概念:内存中的一个存储区域;有名称(变量名)和类型(数据类型);数据可以在类型允许范围内变化。
Java为强类型(Strongly typed)的语言:
① 变量必须声明后使用;
② 变量赋值必须与类型匹配。
基本类型(primitive)
8种,包括整型(byte/short/int/long)、字符型(char)、浮点型(float/double)、布尔型(boolean)。
- 整型默认值为0,boolean默认为false
- 关于Java中boolean类型的处理:
《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。由此可见, 《Java虚拟机规范》中给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。这其实是运算效率和存储空间之间的博弈。 - 注意不像C/C++,java中没有无符号数,Java中表示的都是有符号数。
- 注意整型表示范围:
Integer.MAX_VALUE = 2147483647
,再大就溢出了,可以用long型,若long型仍然溢出,可以考虑用数组模拟数的运算,这在大数乘法中有应用。 - 八种基本类型都有对应的包装类型,Java中基本类型与对应的包装类型之间可以自动打包(auto-boxing)拆包(unboxing)。关于包装类型,详情可参见:
http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html - 自动类型转换:占内存小的自动转换为占内存大的类型;自动类型提升;
强制类型转换:高位的几个字节丢弃;
引用类型(reference)
引用一个对象的变量; 类(class)、接口(interface)。 若不赋初值,默认为null。
实际上引用类型变量即为一个指针,只是java中不再使用这个说法;可以形象理解为引用类型的变量存储一个对象的遥控器;
注意: 重点关注Java中的String类
众所周知Java只支持单继承,但要想实现多继承也有方法参考: Java实现多继承的方式- Enum类型
jdk1.5引入了枚举类型,
进制
- 二进制
二进制的理解可以类比十进制,思路都是一样的。
Program:Java中任意进制之间的转换。
注意:正数的二进制符号位为0,负数符号位为1。
正数的二进制表示:原码、反码、补码都是一样的;
负数的二进制表示:对应的正数二进制(原码)各位取反(反码)再加一(补码);
参考: http://blog.csdn.net/qq1012421396/article/details/62058673 - 八进制:用0开头;三个二进制;
- 十进制
- 十六进制:0x开头;四个二进制;
运算符
- 比较运算符
- 逻辑运算符:连接两个boolean类型表达式
与&,或|,非!,&&(前后两个操作数都是true才返回true),异或^ - 算术运算符
- 赋值运算符
- 取模运算符 :注意取模与取余的区别
位运算符
&
按位与: 6&3 = 110 & 011 =2|
按位或; 6|3 = 110 & 011=7~
按位非: ~6 = ~110=1
负数的“非”运算过程:负数原码—除符号位外取反—>反码—加1—>补码—取反—>正数;^
按位异或: 异或同一个数两次,结果还是这个数; 3^6=110 ^ 011=<<
左移运算符:左移n位即为乘以2的n次方;
左移时左边n位丢掉,右边补0就可以了;>>
右移运算符:右移n位即为除以2的n次方;
右移时注意: 若为正数,右边n位丢掉,左边补0就可以了;若为负数,右边n为丢掉,左边补要补1。>>>
无符号右移:忽略符号位,高位出现的空位用0补
tips:“==”与“equal”
“==”
比较两个primitive类型变量是否相等,或者引用类型变量是否指向堆中的同一个对象(两个对象的内存地址),也就是说“==”只是用来比较两个变量的字符组合,只要一样即判为相等;
“equals()”
方法在Object类中是比较两个对象的地址是否相等;但在Integer以及String等类中已经将eaqual()方法重写,为比较两个数大小是否相等(内容是否相同);
与eaquls()方法密切相关的还有hashcode()方法,参见:浅谈Java中的hashcode方法。
Object的equals()方法容易抛出空指针异常,推荐使用java.util.Objects#equals(JDK7引入的工具类)。
一些关键字的理解
transient:
final:
this:
super:
类修饰符:private、默认、protected、public访问权限依次升高。一般private和public没问题,friendly和protected可能会有人搞混,其实只要记住默认(friendly)同一个包内是可以访问的,不管是不是子类,而protected主要是为了保护不同包中子类的访问权限。
参考资料: