java基础概念
Java语言
一种面向对象的语言
public class Hello{
public static void main(String[] args){
System.out.println("Hello world!");
}
}
一种平台无关的语言,必须程序运行的解释环境
- javac Hello.java-----Hello.class
一种健壮的语言,吸收了C/C++语言的优点,但是去掉了影响程序健壮性的部分,例如指针、内存
的申请与释放等 - 不能讨论指针
Java主要技术分支
- JavaSE:Java标准版,适合于开发桌面系统和低端商务应用系统
- JavaEE:Java企业版,为企业提供电子商务构架及Web服务的解决方案
- JavaME:Java微型版,是移动商务最佳的应用典范
Java应用场景
Java编程语言是一种广泛应用于互联网应用的高级计算机语言,主要应用于网络编程和互联网电子商务
应用,特别适合于Internet应用程序开发
JVM、JRE和JDK的区别
- JVM -java virtual machine在真实机器中用软件模拟实现的一种想象机器 ,java虚拟机负责解释执行字
节码文件,是可以运行Java字节码文件的虚拟计算机。JVM可以保证java的跨平台的特性。java语言是跨
平台,jvm不是跨平台的 - JRE - java 运行环境。JRE 是由JVM 和 java platform 核心类以及相关支撑文件组成
Java的开发平台JDK是开发人员用来构建Java应用程序的软件包,它包括:Java虚拟机JVM、Java编译器 - javac、Java归档jar实用程序、Java文档javadoc实用程序等
所谓的Java运行环境JRE是JDK的子集,包括JVM、运行时类库和执行Java字节码所需要的Java应用程序启
动器,但省略了Java编译器等开发工具。如果只需要运行Java而不需要开发Java程序,则不需要完全安
装JDK,只选择安装JRE即可
Java的三种核心机制
Java虚拟机(Java Virtual Machine)
虚拟机就是在真实机器中用软件模拟实现的一种虚拟机器。Java虚拟机代码被存储在 .class文件中;每
个文件都包含最多一个public类。
Java虚拟机可以理解成一个以字节码为机器指令的CPU。对于不同的运行平台,有不同的虚拟机。Java
虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”
垃圾收集机制Garbage Collection
Java编程语言解除了程序员取消分配存储器的责任,它可提供一种系统级线程以跟踪每一存储器的分配
情况。在Java虚拟机的空闲周期,垃圾收集线程检查并释放那些可被释放的存储器
不再使用内存空间回收——垃圾回收
在C/C++等语言中,由程序员负责回收无用内存。Java语言消除了程序员回收无用内存空间的责任,它
提供了一种系统级线程跟踪存储空间的分配情况,并在JVM的空闲时检查并释放哪些可被释放的存储空
间。
垃圾收集在Java程序原型过程中自动运行,程序员无法精确控制和干预
代码安全性检测Code Security
在运行时,执行机器只是将.class类文件通过交互后使用,一般情况下是看不到它的源代码.Java,如果
想要看到.Java源程序,就要通过专用反编译工具,才能够看到。这就体现了Java在运行环境中相对其它
语言来说,加强了代码的安全性
Hello Java
- 1、一般考虑开发效率的情况下可以使用IDE集成开发环境工具,目前练习一天采用的是记事本之类的文
- 本编辑工具,Centos下使用的是vi/vim
- 2、创建一个文本文件修改名称为Hello.java
- 3、Java是一个面向对象的编程语言,所以编写程序的开始就是定义类的开始,如果类是public类型的类,
则类名称必须和文件名称一致(不包括后缀,包括大小写) - 4、在命令行下执行编译,编译操作可以将程序.java转换为后缀为.class的二进制文件(字节码文件)
- 5、执行程序,语法为java 类名称。例如java Hello,注意这里是类名称,不是文件名称,所以没有后
缀.class
java.exe就是解释器
Java虚拟机中类加载的过程
- 系统会通过加载、连接、初始化三步来实现这个类进行初始化。
链接包括验证、准备以及解析三个阶段。(1)验证阶段。主要的目的是确保被加载的类满足Java虚拟机
规范,不会造成安全错误。(2)准备阶段。负责为类的静态成员分配内存,并设置默认初始值。(3)
解析阶段。将类的二进制数据中的符号引用替换为直接引用。
javadoc用法
-
Javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类、方法、成员等注释形成一个和源代码配
套的API帮助文档 -
javadoc -d 目标文件夹abc
-
Hello.java文件名
@author指定程序的作者
@version指定源文件的版本
@param方法的参数说明信息
@return方法的返回值说明信息
@see用于指定参考的内容
@exception抛出异常的类型
@throws抛出的异常,和@exception同义
1 /**
2 文档注释,使用javadoc命令可以生成html格式的说明文件
3 *@author 闫峻
4 *@version 1.0.0
5 */
6 public class Hello{//定义一个java类程序
7 /**
8 * 主方法
9 * @param args数组用于接受命令行参数
10 * @return 没有返回值
11 */
12 /*
13 多行注释
14 可以添加多行的说明信息
15 */
16 public static void main(String[] args){System.out.println("Hello Java!");}
17 }
Java中注释
- 一般要求编写程序必须有合理的注释说明,注释一般建议控制在20%-30%代码量上。但是具体实践中一
般不会写这么多的注释,但是不写注释是不合理的
// 单行注释
/*
多行注释
*/
/**
文档注释,可以通过使用javadoc工具生成对应的说明文档*/
IDE工具的安装
- 集成开发环境IDE是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用
户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。IDE
即集成开发环境。IDE提供了一个可视化的编程的窗口,实现代码的可视化管理。如:代码的提示、调试
代码等。
Eclipse
- 如果使用文本编辑工具编写代码,问题在于没有任何提示,编码效率低;而且不停的需要进行切换【编
辑发现问题–修改源代码】。所以需要使用IDE工具(集成开发环境),在工具中可以直接编写代码,编
译源程序并执行 - Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。该软件是IBM使用java开发出来的并开源
的。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse
附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。官方下载网站
eclipse.org - 经常用到的是前五个版本:
Eclipse IDE for Java EE Developers:是为J2EE开发的版本
Eclipse Classic:是Eclipse的经典版本,没有安装任何插件,纯净版,需要什么插件可以自己安
装,Java初学者建议使用该版本
Eclipse IDE for Java Developers:适用于Java开发
Eclipse IDE for C/C++ Developers:适用于C/C++开发
Eclipse for Mobile Developers:适用于Java手机开发
Eclipse for RCP/Plug-in Developers:用于RCP和插件开发
可以直接下载zip后缀的文件,这实际就是一个绿色版的Eclipse,解压缩后可以直接使用
熟悉Eclipse基本使用
- 如果大家感觉启动比较慢的话大家可以修改该软件安装的配置文件eclispe.ini中的堆内存大小。
该软件是以工作区的形式管理所有的项目的,因此大家在启动的时候需要指定一个工作区的目录。注
意:该目录中不要包含中文或空格。
常用快捷键
- Alt+/ 内容提示
- Ctrl+Alt+↓ 快速的复制当前行
- Ctrl+Shift+F 格式化
- Ctrl+/ 单行注释,再次使用取消注释
- Ctrl+shift+/ 多行注释,取消注释Ctrl+shift+\
- Ctrl+shift+O 导包语句,该快捷键一次性可以导入多个包
- Ctrl+1 快速修复错误,但是该快捷键只能修复小错误
语法基础
Java语言的源程序代码由一个或多个编译单元组成,每个编译单元可包含三个要素:
- 1、一个包声明(可选)。
package com.yan;
名空间 - 2、任意数量引入语句。
import java.util.*;
- 3、类的声明和接口声明
public class A{}
该三要素必须以上述顺序出现。也就是说任何引入语句出现在所有类定义之前;如果使用包声明,则包
声明必须出现在类和引入语句之前。每个Java的编译单元可包含多个类或接口,但是每个编译单元最多
只能有一个类或者接口是公共的
一个文件中可以定义多个class,但是最多只能由一个public class,因为文件名称必须和public class类
名称一致(大小写在内);当然在一个文件中的class名称不能重复【实际上在一个包中的类名称不能重
复】,如果文件中没有public class,则文件名称没有约束
- Java是一种自由格式的语言,可以用任意个空格、制表符、换行符隔开每个词
1 System.
2 out.
3 println
4 ( "Counted " + count + " chars." );
同时也允许将多行代码写在一行上,注意使用分号隔开。所有的语句末尾以分号;收尾
常见的编程错误:
- 目前的要求:将所有的程序都必须写在方法内部,不能写在方法外
- 使用临时变量,Java要求必须是先定义后使用,必须是先赋初值后使用
Java标识符
在Java编程语言中,标识符是赋予变量、类或方法的名称。变量、函数、类和对象的名称都是标识符,
程序员需要标识和使用的东西都需要标识符。
标识符可从一个字母(Unicode编码字符集)、下划线_或美元符号$开始,随后也可跟数字、字母、下划线
或美元符号。
标识符是区分大小写,没有长度限制,可以为标识符取任意长度的名字
1public class A {
2public static void main(String[] args) {
3int kk = 100;
4System.out.println(Kk);//报错的原因是Java中严格区分大小写,所以kk和Kk是两
个不同的东西
}
}
标识符不允许使用保留字。关键字对Java编译器有特殊的含义,它们可标识数据类型名或程序构造
construct名, java语言中的保留字均用小写字母表示
48个关键字
abstract do case private throw boolean double imp protected try break else instanceof public transient byte extends int return true implements false interface sho throws catch final long native super volatile clas static void char finally float new switch whi continue for null if synchronized default package this
注意:true、false和null为小写,严格地讲,它们不是关键字,而是文字。然而,这种区别是理论上
的。无sizeof运算符;所有类型的长度和表示是固定的,不依赖执行。
编码规范
- 类名首字母大写,大写字母分词 建议名词
- 方法名称首字母小写,大写字母分词
- 变量名称首字母小写,大写字母分词
- 包名称全小写,使用域名反转的方式定义
变量
变量是Java程序中的基本存储单元,它的定义包括变量名、变量类型和作用域几个部分。其中数据类型
指明变量或表达式的状态和行为,数据类型决定了数的取值范围和运算符号
变量是Java程序中的基本存储单元,它的定义包括变量名、变量类型和作用域几个部分
- Java属于强类型编程语言,变量类型一旦声明,则不能进行修改
public class B {
public static void main(String[] args) {
// int是数据类型,其中定义了存储空间大小4B,k是名称,用于指代具体的存储位
置【地址】
int k = 100;
k = 12.34;// 报错因为类型不匹配,12.34是double类型,不是int
int k = 123;// 报错是因为系统人为是针对k重新定义类型,类型一旦声明则不允
许修改
}
}
- 数据类型可以决定变量所需要的存储空间大小和对应的处理逻辑
1 int k = 100;
2 System.out.println(k+1); //int中定义了运算符+和/的实现
3 System.out.println(k/33);
4
5 String ss="123";
6 System.out.println(ss+1);
7 System.out.println(ss-1);//报错的原因是String中定义了+计算,但是没有-计算
- 作用域是指变量生效的范围,从定义的位置开始,到所在的{}结束为止
自动垃圾回收,一般来说java在一定程度上避免了内存泄漏问题
1public class B {
2public static void main(String[] args) {
3{
4System.out.println(k);//报错的原因是系统要求变量必须是先定义
后使用,先赋初值后使用
5int k=100;//临时变量,局部变量,有效范围是所在的{}范围内,从定
义的位置开始到所在的{}结束为止,自动垃圾回收
6System.out.println(k);
7 }
8 System.out.println(k);//报错原因是k已经超出了有效范围,这里不存在
变量k
9}
10
JAVA是强类型语言
每个变量有类型,每个表达式有类型,而且每种类型都是严格定义的。Java编译器对所有的表达式和参
数都要进行类型相容性的检查,以保证类型是兼容的。任何类型的不匹配都将被报告为错误而不是警
告。在编译器完成编译以前,错误必须被改正过来
在Java语言数据类型可以分为两大类:基本类型(原生类型primitive type)和引用类型(复合类型
referance type)
4类 整数: byte 1B short 2B int 4B long 8B 默认为int 特殊后缀L/l
浮点数: float 4B double 8B 默认double 特殊后缀 f/F D/d
字符: 单引号 2B unicode[java默认0-65535]
布尔: true、false
引用类型: 复杂类型
class/interface 数组 null
注意:null属于引用类型,所以int k=null;语法错误
基本类型
基本类型是指不能再分解的数据类型,其数据在函数的调用中是以传值方式工作的。
简单数据类型代表单值,而不是复杂的对象Java是完全面向对象的,但简单数据类型却不是,它们类似于其他大多数非面向对象语言中的简单数据
类型。这样做的原因是出于效率方面的考虑。在面向对象中引入简单数据类型不会对执行效率产生太多
的影响。
Java编程语言有八个原始数据类型,可分为4种整型、浮点数、字符型数据和布尔型数据,不会随着计算
机类型而变化的
计算机中的数据存储方式
原码: 最高位为符号位,1表示负数,0为整数
- 123为01111011,-123为11111011
反码:反码跟原码是正数时一样;负数时,反码就是原码符号位除外,其他位按位取反 - 123为01111011,-123为10000100
补码:补码跟原码是正数时一样;负数时,补码就是原码符号位除外,其他位按位取反+1 - 123为01111011,-123为10000101
整数类型
byte,short,int,long 补码存储
byte字节整数 1B -128到127
short短整型 2B -32768到32767
int 整型 4B -2147483648到2147483647
long 长整型 8B -9223372036854775808到9223372036854775807
1 Long.MAX_VALUE //获取对应类型的最值
2 Long.MIN_VALUE
所有Java编程语言中的整数类型都是带符号的数字,不存在无符号整数。整数类型的文字可使用十进
制、八进制和十六进制表示
十进制整数。如123,-456,0
八进制整数。以0开头,如0123表示十进制数83,-011表示十进制数-9。
1 int kk=01234;
2 System.out.println(kk); //按照10进制进行输出
3
4 int kk = 123;// 10进制数据
5 System.out.println(Integer.toOctalString(kk)); // 将10进制数据转换为8进制
十六进制整数。以0x或0X开头,如0x123表示十进制数291,-0X12表示十进制数-18
1 int kk=0x1239;
2 System.out.println(kk); //按照10进制进行输出
3
4 int kk = 123;// 10进制数据
5 System.out.println(Integer.toHexString(kk)); // 将10进制数据转换为16进制
二进制整数,以0b或0B开头,例如0b101100101
int kk=0b1011;
2 System.out.println(kk); //按照10进制进行输出
3
4 int kk = 123;// 10进制数据
5 System.out.println(Integer.toBinaryString(kk)); // 将10进制数据转换为2进制
整数类缺省为int类型,如在其后有一个字母“L”表示一个long值。例如long k=123456789012345678L;
实际上末尾的L或者l都可以,但是一般不建议使用l
浮点数类型
两种浮点类型float和double
- 浮点数无法准确存放,所以浮点数不能进行等值判断
1 double d=0.;
2 for(int i=0;i<10;i++)
3
4
d+=0.1;
System.out.println(d);//输出数据为0.9999999999999999
1 double d = 0.;
2 for (int i = 0; i < 10; i++)
3 d += 0.1;
4 if (1 - d < 1e-6)
5System.out.println("计算结果为1");
6else
7System.out.println(d);
float 4B 单精度浮点数 7-8有效数据 1.4E-45到3.4028235E38
double 8B 双精度浮点数 15-16有效数据 4.9E-324到1.7976931348623157E308
如果一个数包括小数点或指数部分,或者在数字后带有字母F或f(float)、D或d(double),则该数为
浮点数
- 十进制数形式。由数字和小数点组成,且必须有小数点,如0.123, 1.23, 123.0
- 科学计数法形式。如:123e3或123E3,其中e或E之前必须有数字,且e或E后面的指数必须为整数
针对货币的处理方案: - 使用可以精确存储任意位数的类型 BigInteger BigDecimal,缺点计算速度慢
- 使用long类型
字符类型char
使用char类型可表示单个字符,字符是用单引号括起来的一个字符, ‘a’ 等
Java中的字符型数据是16位(2B)无符号型数据,它表示Unicode集,而不仅仅是ASCII集。其范围为0~
655351
char c1='a';//针对char类型使用单引号,双引号是字符串类型
2
3
//单引号中只能包含一个unicode编码的字符。如果'a1'语法错误
char c2='中';
4
5 //字符类型可以等价于一个整数进行使用
6 System.out.println(c2+1);//输出20014
Unicode所定义的国际化字符集能表示迄今为止人类语言的所有字符集,它要求使用16位的宽度表示。
没有负数的char
Unicode字符的使用对于英语、德语、西班牙语或法语的语言是有些低效,因为这些语言能够被包含在8
位内。但是为了程序的的可移植性和通用性,付出代价是很有必要的
计算机处理字符类型时,是把这些字符当成不同的整数来看待。因此。严格说,字符类型也算是整数类
型的一种
数字(48-57)<大写字母(65)<小写字母(97)
Java也提供转义字符,以反斜杠()开头,将其后的字符转变为另外的含义
1 char c1='\u4e00';
2 System.out.println(c1);
3 System.out.println((char)(c1+1));
注意:用双引号引用的文字,就是平时所说的字符串类型不是原始类型,而是一个类(class)String,
它被用来表示字符序列。注意String理论上说最大上限应该为4G长,但是实际上最多存储65534个字符
字符本身符合Unicode标准,且上述char类型的转义字符适用于String
\n \r \t
可以把char当作整数数据来操作
逻辑类型boolean
boolean数据类型有两种文字值:true和false,只有1位
在Java编程语言中boolean类型只允许使用boolean值,在整数类型和boolean类型之间无转换计算
1 boolean bb=true;//false,没有其他可能
2 System.out.println(bb+1);//语法报错的原因是:java中的boolean类型和其它类型之间没有
关系
3System.out.println(bb);
基本数据类型转换
数据类型按精度取值范围从低到高排列顺序为:byte,short,char,int,long,float,double
当把级别低的变量的值赋给级别高的变量时,系统自动完成数据类型转换
当把级别高的变量的值赋给级别低的变量时,必须使用显示类型转换运算。
1 int kk=100;
2 short bb=kk;//语法报错,因为int>short,所以需要进行强制转换
1 short kk=32767;//整数类型特殊,不需要进行强转
2
3 float f1=3.233;//语法报错,因为系统默认3.233为double类型
4 //解决方案1为
3.233f;方案2:强转(float)3.233
显示转换格式为:(类型名)要转换的值; 在大转小的转换过程中可能损失精度
1 int k1=Integer.MAX_VALUE-1;
2 int k2=10000;
3
4//k1和k2之和已经超出了int可以存储的范围,所以数据溢出,计算结果错误
System.out.println(k1+k2);//-2147473650
5
6
7 int k1=123456789;
8 short k2=(short)k1;
9 System.out.println(k2);//-13035
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
avapublic class A1 {
public static void main(String[] args) {
double d1=12345.678;
int kk=(int)d1;
System.out.println(kk); //计算结果为:12345
}
}