JAVA基础
JAVA
跨平台
是指java虚拟机(JVM),在不同的操作系统上安装jvm,然后程序运行在JVM
JRE和JDK
JRE:是JAVA运行时环境,包括其JVM和运行时所需要的核心类库
JDK:是JAVA程序开发工具包,包含JRE和开发人员使用的工具
JAVA
- 编译型
- 解释型
注释
- 单行注释
// - 多行注释
/**/ - 文档注释(javaDoc)
/**
/
标识符&关键字
- 标识符
- 关键字
数据类型
要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
两大分类
- 基本类型
- 引用类型
什么是字节
- 位:是计算机内部存储的最小单位
- 字节:是计算机总数据处理的基本单位,习惯上有大写B表示
- 1B(byte,字节)=8bit(位)
进制
1bit表示1位
1B=8b 表示一个字节
1024B=1KB
1024KB=1M
1024M=1G
浮点数
浮点数是有点的离散,存在舍入误差。接近但不等于。
解决:Bigdecimal 类
字符型
所有的字符本质就是数字,涉及到Uniconde编码表
类型转换
低--------------------------------------------------高
byte->short>char->int>long->float->double(小数优先级高于整数)
在运算中不同的数据类型要先转成统一的数据类型
自动类型转换&强制类型转换
自动类型转换:低->高
int类型以下的运算其结果为int类型
int类型以上存在最高什么类型结果就为什么类型
强制类型转换:高->低
转换问题
- 不能对布尔值进行转换
- 不能把对象类型转换为不想干类型
- 强制转换可能存在内存溢出或者精度丢失问题
变量
变量是什么:就是可以变化的量
Java是一种强类型语言,每个变量都必须声明其类型
Java变量是程序中最进本的存储单元,其要素包括变量名,变量类型和作用域
注意事项:
- 每个变量都有类型,类型可以是基本类型,也可以是引用类型
- 变量名必须是合法的标识符
- 变量声明是一条完整的语句,因此每一个声明都必须以分号结束
常量
常量:初始化之后不可在改变的值。在被设定后,在程序运行中不可在改变。
关键字:final 常量名=值 (常量名为大写字符)
运算符
包机制
为了更好的组织类,Java提供了宝鸡至,用于区别类名的命名空间
一般李永公司域名倒置作为包名
package
为了使用包类的某个成员,我们需要在Java程序中明确导入包
import
顺序结构
Java的基本结构就是顺序结构,除非特别指明,否则就按顺序一句一句执行
顺序结构是最简单的算法结构,它是任何一个算法都离不开的基本算法结构
if选择结构
- if单选择结构
if(布尔表达式){
}
- if 双选择结构
if(布尔表达式){
}else{
}
3. if选择结构
if(布尔表达式){
} else if(布尔表达式){
}else if(布尔表达式){
}else{
}
switch 多选择结构
switch case 语句判断一个变量与一系列值中某个值相等,每个值称为一个分支。
switch 语句中的变量类型可以是:byte、short、int或者char,JavaSE7后switch支持字符串String类型
无break,则会造成case穿透。
switch(expression){
case value:
break;
case value:
break;
default:
}
循环结构
while循环
当表达式为true,循环会一直执行下去;当表达式不成立时,循环停止。
while(布尔表达式){
循环内容
}
do…while循环
至少循环执行一次后进入条件判断
do{
}while(布尔表达式)
for循环
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构
for(初始化;布尔表达式;更新){
循环内容
}
加强for
声明语句:声明新的不变量,该变量的类型必须和数组元素的类型匹配
表达式:表达式要访问的数组名,或者是返回值为数组的方法。
for(声明语句:表达式){
}
for(item:array){
}
方法
方法的本意是功能模块,就是实现某个功能的代码片段。方法包含于类或对象中,
我们设计的方法最好保持方法的原子性,就是一个方法只完成一个功能,这样利于后期的扩展。
修饰符 返回值类型 方法名(参数类型 参数名){
。。。
方法体
。。。
return 返回值;
}
修饰符:定义了该方法的访问类型
返回值类型:方法可能返回值,当无返回值时可使用void
方法名:方法的实际名称
参数类型:参数像是一个占位符。放方法被调用时。传递值给参数,这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含参数;
方法体:方法体包含具体的语句,定义该方法的功能。
值传递&&引用传递
引用传递:引用传递中形参实参指向同一个对象,形参的操作会改变实参对象的改变
值传递:无论是基本类型和是引用类型,在实参传入形参时,都是值传递,也就是说传递的都是一个副本,而不是内容本身
结果:java只有值传递
方法重载
重载就是在一个类中,有相同的函数名称,但形参不同的函数
方法重载的规则:
- 方法名称必须相同
- 参数列表必不相同(个数、类型、顺序不同)
- 方法的返回类型可以相同也可以不相同
- 仅仅返回类型不同不足以成为方法的重载
实现理论:
方法名称相同时,编译器会根据调用方法的个数、参数类型去逐个匹配。以选择对应的方法,如果匹配失败,则编译器报错。
可变参数–
JDK1.5开始,Java支持可变参数。
在方法声明中,在指定参数类型后加一个省略号(…)
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。
本质:数组
testNum(1,2);
public static void testNum(int...i){
System.out.println(i.length);
//2
}
数组
数组:相同数据类型的有序集合
数组描述的是相同类型的若干数据,按照一定的先后次序排列组合而成。
其中,每一个数据称为一个数据元素,每个数组元素可以通过下标来访问他们
创建数组
- int[] arr=new int[size]
- int[]={item,item…}
数组的四个基本特点
- 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 其元素必须是相同类型,不允许出现混合类型
- 数组中的元素可以是任何数据类型,包括基本数据类和应用类型。
- 数据变量属于引用类型,数组可以看成是对象,数组中的每个元素相当于该对象成员。数组本身就是对象,数组对象本身就是在堆中
数组边界
【0,数组.length】
超过边界:ArrayIndexOutOfBoundsException : 数组下标越界异常!
二位数组
Arrays 数组工具类
面向对象
面向对象编程(Object-Oriented Programming ,OOP)
面向对象的本质:以类的方式组织代码,以对象的方式组织数据。
三大特性
封装
核心思想:高内聚,低耦合
属性私有get/set
目的:禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问
优点:
- 提高程序的安全性,保护数据
- 隐藏代码实现细节
- 统一接口
- 系统可维护增加了
举个栗子
eg : private 类型 名字
get/set方法(可操作空间瞬间拉大)
方法的本意是功能模块,就是实现某个功能的代码片段,可以在方法中进行一些其他实现。如参数校验。如果是public int age ,使用只直接对象.age=999,这完全是不合理的存在。使用方法则可以添加校验。
方法就是实现某个功能的代码片段,给对象属性设置值,就是对其数据处理功能。
继承
本质:是对某一批类的抽象,从而实现对现实世界更好的建模
关键字:extends
java类只有单继承,没有多继承。所有的类默认都继承Object
super
- super调用父类的构造方法,必须在构造方法的第一个
- super只能出现在子类的方法或构造方法中
- super和this不能同时调用构造方法
重写
子类重写父类方法
- 方法名相同
- 参数列表相同
- 修饰符只可扩大
- 异常只可扩大
多态
即同一方法可以根据发送对象的不同而采用不同的行为方式
多态存在的条件:
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
创建和初始化对象
- 使用new关键字创建对象
- 使用new关键字创建的时候,除了分配内存空间以外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
构造器
- 必须和类名相同
- 必须没有返回类型、也不能写void
static
static 同类一起加载。只加载一次。
匿名 每次创建类就加载一次。
{} // 匿名代码块
static {} // 静态代码块
静态导入包
可以直接导入到静态方法,程序可直接使用方法名去使用。
import static java.lang.Math.random
抽象类
关键字 abstract
可以用来修改方法(抽象方法)也可以修饰类(抽象类),抽象类中可以没有抽象方法,但是有抽象方法一定是抽象类。
接口
只有规范
关键字 interface
定义的方法默认修饰都是:public abstract
定义的都是常量默认修饰都是:public static final
内部类
就是在一个类的内部定义一个类
- 成员内部类
public class Outer {
private String name;
private int age;
public class Inner{
public void testIn(){
System.out.println("这是一个内部方法");
}
}
}
// 创建
Outer outer=new Outer();
Outer.Inner inner = outer.new Inner();
- 静态内部类
public class Outer {
private String name;
private int age;
public static class Inner{
public void testIn(){
System.out.println("这是一个内部方法");
}
}
}
- 局部内部类
public class Outer {
private String name;
private int age;
public void testMethod(){
class Inner{
public void testIn(){
System.out.println("这是一个内部方法");
}
}
}
}
- 匿名内部类
public interface Runnable {
public abstract void run();
}
new Runnable() {
@Override
public void run() {
}
};
异常
检查性异常
最具代表的检查性异常是用户错误或问题引起的异常,这是程序猿无法预见的。例如要打开一个不存在文件时,一个异常就这样发生了,这些异常在编译时不能简单的忽略。
运行异常
运行异常是可被程序猿避免的异常,与检查性相反,运行时异常可以在编译时被忽略。
错误
错误不是异常,二十脱离程序猿控制的问题。错误在代码中尝尝没忽略。
ERROR
Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
Java虚拟机运行错误,当JVM不再继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机一般会选择线程终止。
还有发生在虚拟机视图执行应用时。如类定义错误、链接错误。这些错误是不可查的。因为它们在应用程序的控制和处理能力之外,而且绝大多是程序运行时不允许出现的状况。
Exception
在Exception分支中有一个重要的子类RuntimeException(运行时异常)
- ArraylndexOutOfBoundsException
- NullPointerException
- ArithmeticException
- MissingResourceException
- ClassNotFoundException
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类服务的发生
Error和Exception的区别
Error通常是灾难性的致命错误,是程序无法控制和处理的。出现这些异常时,Java虚拟机一般会选择终止线程;
Exception通常情况下可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。