JAVA入门
java特性和优势
- 简单性
- 面向对象
- 可移植性
- 高性能
- 分布式
- 动态性
- 多线程
- 安全性
- 健壮性
java三大版本
- JavaSE:标准版(桌面程序,控制台开发等)
- JavaME:嵌入式开发(手机、小家电等)
- JavaEE:企业级开发(web端,服务器开发等)
JDK、JRE、JVM
- JDK: Java Development Kit (java开发者工具)
- JRE: Java Runtime Environment (java运行时环境)
- JVM: Java Virtual Machine (java虚拟机)
安装开发环境
卸载JDK
- 删除jdk的安装目录
- 删除环境变量立的JAVA_HOME
- 删除path下关于java 的目录
- cmd中测试是否删除成功:java -version
安装JDK
网上搜索下载JDK8
安装JDK
记住安装路径
-
配置环境变量
- JAVA_HOME设为jdk的安装路径
- 新增path的变量:%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin
测试JDK是否安装成功:cmd中java -version
Hello World
-
新建Hello.java文件
public class Hello{ public static void main (String [] args) { System.out.print("Hello World!"); } }
在cmd中切换到上面文件的目录下,执行编译:javac Hello.java
该文件目录下会自动生成可执行的文件Hello.class
执行该文件:java Hello
注意
- Java是大小写敏感的
- 文件名和类名必须保持一致,并且首字母大写
原理
- javac是调用的java的编译器,将代码编译成.class文件
- java执行.class文件相当于一个解释器去执行,使用的JVM
- 这也是java能够跨平台执行的关键
- java既有编译型的特点又有解释型的特点
JAVA基础
注释
java的注释有三种:
-
单行注释
//这是一行注释
-
多行注释
/* 这是一个多行注释 */
-
文档注释
/** *@Author bGpi */
参数信息
- @author 作者名
- @version 版本号
- @since 指明需要最早使用的jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
标识符
-
关键字
关键字 含义 abstract 表明类或者成员方法具有抽象属性 assert 断言,用来进行程序调试 boolean 基本数据类型之一,声明布尔类型的关键字 break 提前跳出一个块 byte 基本数据类型之一,字节类型 case 用在switch语句之中,表示其中的一个分支 catch 用在异常处理中,用来捕捉异常 char 基本数据类型之一,字符类型 class 声明一个类 const 保留关键字,没有具体含义 continue 回到一个块的开始处 default 默认,例如,用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现 do 用在do-while循环结构中 double 基本数据类型之一,双精度浮点数类型 else 用在条件语句中,表明当条件不成立时的分支 enum 枚举 extends 表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口 final 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量 finally 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块 float 基本数据类型之一,单精度浮点数类型 for 一种循环结构的引导词 goto 保留关键字,没有具体含义 if 条件语句的引导词 implements 表明一个类实现了给定的接口 import 表明要访问指定的类或包 instanceof 用来测试一个对象是否是指定类型的实例对象 int 基本数据类型之一,整数类型 interface 接口 long 基本数据类型之一,长整数类型 native 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的 new 用来创建新实例对象 package 包 private 一种访问控制方式:私用模式 protected 一种访问控制方式:保护模式 public 一种访问控制方式:共用模式 return 从成员方法中返回数据 short 基本数据类型之一,短整数类型 static 表明具有静态属性 strictfp 用来声明FP_strict(单精度或双精度浮点数)表达式遵循[IEEE 754](https://baike.baidu.com/item/IEEE 754)算术规范 super 表明当前对象的父类型的引用或者父类型的构造方法 switch 分支语句结构的引导词 synchronized 表明一段代码需要同步执行 this 指向当前实例对象的引用 throw 抛出一个异常 throws 声明在当前定义的成员方法中所有需要抛出的异常 transient 声明不用序列化的成员域 try 尝试一个可能抛出异常的程序块 void 声明当前成员方法没有返回值 volatile 表明两个或者多个变量必须同步地发生变化 while 用在循环结构中 java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符
表示符注意点
- 所有的标识符都应该以字母(A-Z或者a-z)、美元符($)或者下划线(_)开始
- 首字母之后可以是字母、美元符、下划线或数字的任何字符组合
- 不能使用关键字作为变量名或方法名
- 标识符是大小写敏感的
数据类型
-
Java是一种强类型语言
要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
-
Java的数据类型分为两类
-
基本类型
-
数值类型
-
整数类型
- byte占1个字节范围:-128~127
- short占2个字节范围:-32768~32767
- int占4个字节范围:-21474832147483647
- long占8个字节范围
-
浮点类型
- float占4个字节
- double占8个字节
-
字符类型
char占2个字节
-
-
boolean类型
占1位,其值只有true和false
-
-
引用类型
- 类
- 接口
- 数组
-
什么是字节
- 位(bit):是计算机内部数据存储的最小单位,11001100是一个8位二进制数
- 字节(byte):是计算机数据处理的基本单位,习惯上用大写B来表示
- 1B=8bit
- 字符:是指计算机中使用的字母、数字、字和符号
-
进制
- 二进制(0b开头)
- 十进制
- 八进制(0开头)
- 十六进制(0x开头)
-
常见转义字符
转义字符 意义 ASCII码值(十进制) \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \n 换行(LF) ,将当前位置移到下一行开头 010 \r 回车(CR) ,将当前位置移到本行开头 013 \t 水平制表(HT) (跳到下一个TAB位置) 009 \v 垂直制表(VT) 011 \ 代表一个反斜线字符''' 092 ' 代表一个单引号(撇号)字符 039 " 代表一个双引号字符 034 \0 空字符(NULL) 000 \ddd 1到3位八进制数所代表的任意字符 三位八进制 \uhhhh 1到2位十六进制所代表的任意字符 二位十六进制
类型转换
容量从低到高的类型顺序为
byte,short,char => int =>long => float => double
注意点
- 不能对布尔值进行转换
- 在把高容量转换到低容量的时候,需要强制转换
- 不能把对象类型转换为不相关的类型
- 转换的时候可能内存溢出,或者精度误差
- 操作比较大的数的时候,注意溢出问题
- JDK7新特性,数字之间可以用下划线分割,如1000000 = 100_0000
变量
变量就是可以变的量
每个变量都必须声明其类型
java变量是程序中最基本的存储单元,其要素包括*变量名、变量类型和作用域
-
变量作用域
类变量
实例变量
-
局部变量
public class Variable { static int allClicks = 0; //类变量 String str = "hello world"; //实例变量 public void method () { int i = 0; //局部变量 } }
-
变量的命名规范
- 所有的变量、方法、类名,需见名知意
- 类成员变量:首字母小写和驼峰原则
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线
- 类名:首字母大写和驼峰原则
- 方法名:首字母小写和驼峰原则
运算符
算术运算符
操作符 | 描述 |
---|---|
+ | 加法 - 相加运算符两侧的值 |
- | 减法 - 左操作数减去右操作数 |
* | 乘法 - 相乘操作符两侧的值 |
/ | 除法 - 左操作数除以右操作数 |
% | 取余 - 左操作数除以右操作数的余数 |
++ | 自增: 操作数的值增加1 |
-- | 自减: 操作数的值减少1 |
注意
- 前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算
- 后缀自增自减法(a++,a--): 先进行表达式运算,再进行自增或者自减运算
关系运算符
运算符 | 描述 |
---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 |
位运算符
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
逻辑运算符
操作符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 |
| | | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (A || B)为真。 |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真。 |
赋值运算符
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A,C 与 A 同类型时等价于 C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
条件运算符(?:)
variable x = (expression) ? value if true : value if false
instanceof 运算符
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
instanceof运算符使用格式如下:
( Object reference variable ) instanceof (class/interface type)
Java运算符优先级
类别 | 操作符 | 关联性 |
---|---|---|
后缀 | () [] . (点操作符) | 左到右 |
一元 | expr++ expr-- | 从左到右 |
一元 | ++expr --expr + - ~ ! | 从右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | > >= < <= | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | | | | 左到右 |
条件 | ?: | 从右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
逗号 | , | 左到右 |
包机制
为了更好地组织类,Java提供了包机制,用于区别类名的命名空间
-
包语句的语法格式为:
package pkg1[.pkg2[,pkg3...]]
一般利用公司域名倒置作为包名
Java流程控制
Scanner对象
我们可以通过Scanner类来获取用户的输入
-
基本语法
Scanner s = new Scanner(System.in);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前一般需要使用hasNext()与hasNextLine()判断是否还有数据
while循环和do-while循环
区别
- while是先判断后执行,do-while是先执行后判断
- do-while总是保证循环体会被至少执行一次
增强for循环
主要用于数组或集合的增强型for循环
-
表达式如下
for (声明语句 : 表达式) { //code } //例子 int [] numbers = {1, 2, 3, 4}; for (int x:numbers) { System.out.print(x); }
Java的方法
方法的重载
- 重载就是在一个类中,有相同的函数名称,但是形参不同的函数
- 方法的重载规则:
- 方法名必须相同
- 参数列表必须不同(个数不同或类型不同或参数排列顺序不同)
- 方法的返回类型可以相同也可以不同
- 仅仅返回类型不同不足以成为方法的重载
可变参数
JDK 1.5开始,Java支持传递同类型的可变参数给一个方法
在方法声明中,在指定参数类型后加一个省略号(...)
-
一个方法只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明
public static void fun(int...numbers){}
Java的数组
数组的声明和创建
-
首先必须声明数据变量,才能在程序中使用数组。下面是声明数组变量的语法:
dataType[] arrayName; //首选的方法 //or dataType arrayName[]; //效果相同,推荐上面
-
Java使用new操作符来创建数组,语法如下
dataType[] arrayName = new dataType[arraySize]
获取数组长度: arrayName.length
内存分析
堆
- 存放new的对象和数组
- 可以被所有的线程共享,不会存放别的对象引用
栈
- 存放基本变量类型(包含这个基本类型的具体数值)
- 引用对象的变量(存放这个引用在堆里面的具体地址)
静态区
- 可以被所有的线程共享
- 包含了所有的class和static变量
三种初始化
-
静态初始化
int[] a = {1, 2, 3};
-
动态初始化
int [] a = new int[2]; a[0] = 1; a[1] = 2;
-
数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
面向对象
认识面向对象
面向对象的本质就是:以类的方式组织代码,以对象的方式组织(封装)数据
抽象
-
三大特性
- 封装
- 继承
- 多态
从认识论角度考虑是:先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象。
从代码运行角度考虑是:先有类后有对象。类是对象的模板。
方法的调用
-
静态方法和非静态方法
静态方法是和类一起加载的,非静态方法是需要对象new出来之后才加载。因此不能直接调用一个类中的非静态方法,但可直接调用静态方法
静态方法前面使用static修饰
值传递&引用传递
构造器
和类名相同
没有返回值
-
作用
- new 的本质是在调用构造方法
- 初始化对象的值
-
注意点
定义有参构造之后,如果想要使用无参构造,需要显示的定义一个无参的构造。
Alt+Insert可快速创建构造函数
this 表示当前类
封装
继承
extends
- 子类继承了父类,就会拥有父类的全部方法(私有的无法被继承)。
Super
- super调用父类的构造方法,显示调用时必须在构造方法的第一行
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时调用构造方法
-
和this的区别
- 代表的对象不同
- this:本身调用者这个对象
- super:代表父类对象的引用
- 使用前提不同
- this:没有继承也可以使用
- super:只能在继承条件下才能使用
- 构造方法不同
- this():本类的构造
- super():父类的构造
- 代表的对象不同
重写 Override
需要有继承关系,子类重新父类的方法
注意:
- 方法名必须相同
- 参数列表必须相同
- 修饰符:访问可以扩大但不能缩小。public>protected>default>private
- 抛出的异常:范围可以被缩小,但不能扩大。
- 不能重写的方法:static、final、private
多态
同一个方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型时确定的,但可以指向对象的引用的类型有很多(父类、有关系的类)
-
多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
注意:多态时方法的多态,属性没有多态
子类重写了父类的方法,则执行子类的方法
Static
-
对象中静态代码块是在对象第一次构造时执行,且是第一个执行
public class className { { System.out.println("匿名代码块"); //第2个执行 一般可赋初始值 } static { System.out.println("静态代码块"); //第1个执行,且只执行一次,再new时不执行 } public className () { System.out.println("构造方法"); //第3个执行 } }
抽象类 abstract
- 不能new抽象类,只能靠子类去实现它
- 抽象类中可以写普通方法
- 抽象方法必须写在抽象类中
接口 interface
-
区别
- 普通类:只能具体实现
- 抽象类:具体实现和规范(抽象方法)都有
- 接口:只有规范!自己无法写方法。专业的约束。约束和实现分离:面向接口编程。
接口时OO的精髓,是对对象的抽象,最能体现这一点的就是接口
-
作用
- 是一种约束
- 可以定义一些方法,让不同的人实现
- 所有的方法都是public abstract
- 所有的变量都是public static final
- 接口不能被实例化,接口中没有构造方法
- implements可以实现多个接口
- 必须要重写接口中的方法
异常
try、catch、finally可以进行异常的捕获和处理
throw可在程序类抛出异常,throws则是在方法上抛出异常,让外层去捕获处理
-
异常类的结构
异常类型 说明 Exception 异常层次结构的根类 RuntimeException 运行时异常,多数 java.lang 异常的根类 ArithmeticException 算术谱误异常,如以零做除数 ArraylndexOutOfBoundException 数组大小小于或大于实际的数组大小 NullPointerException 尝试访问 null 对象成员,空指针异常 ClassNotFoundException 不能加载所需的类 NumberF ormatException 数字转化格式异常,比如字符串到 float 型数字的转换无效 IOException I/O 异常的根类 F ileN otF oundException 找不到文件 EOFException 文件结束 InterruptedException 线程中断 IllegalArgumentException 方法接收到非法参数 ClassCastException 类型转换异常 SQLException 操作数据库异常 -
经验总结
- 处理运行时异常时,采用逻辑去合理规避,同时辅助try-catch处理
- 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
- 对于不确定的代码,也可以加上try-catch,处理潜在的异常
- 尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
- 具体如何处理异常,要根据不同的业务需求和异常类型去决定
- 尽量添加finally语句块去释放占用的资源。