java基础总结
基础语法:
1.注释:
行内注释://
多行注释:/**/
文档注释:/** */
2.标识符:
命名规则:
1.使用字母A-Z、a-z、0-9、下划线_、$
2.不能以数字开头
3.不能包含空格
4.不能使用关键字和保留字
5.遵守驼峰命名
3.数据类型:
java数据类型主要分为两大类:基本数据类型、引用数据类型
基本数据类型:
整数类型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)
小数类型:float(4字节)、double(8字节)
布尔类型:boolean(1字节)
字符类型:char(2字节)
引用数据类型:
类、数组、接口
数据类型之间的转换:
自动转换:低转高
强制转换:高转低(精度丢失)
布尔类型不能与其他数据类型发生转换
4.变量:
在程序运行过程中可以发生改变的量
1.定义:
1.声明变量时赋值 int age = 20;
2.先声明,在赋值 int age; age = 20;
3.定义多个相同数据类型的变量 int a,b;
4.定义多个相同数据类型的变量,并赋值 int a = 1,b = 2;
2.作用域:
按照作用域分:成员变量、局部变量
成员变量:在类中定义。作用域是整个类
局部变量:在一个方法或者方法内代码块中定义。局部变量在方法或者代码块被执行时创建,在方法或者代码块结束时销毁
5.常量:
在java程序中固定不变的数据
被final修饰,全部大写,中间用_分割
6.运算符:
算数运算符:+ - * / % ++ –
赋值运算符:=
关系运算符:> < >= <= == !=
逻辑运算符:&& || ! & | ^
位运算符:>> << >>>
条件运算符:? :
扩展运算符:+= -= *= /=
i++与++i的区别:++在前先自增在运算,++在后先运算在自增
7.流程控制语句:
判断语句:
单分支判断:if(){}
双分支判断:if(){}else{}
多分支判断:if(){}else if(){}
switch:
switch(变量){
case 判断值1:方法体;break;
case 判断值2:方法体;break;
case 判断值3:方法体;break;
......
default:条件都不成立执行的代码
}
switch与if判断的区别:
1.switch适合精准判断,if适合范围判断
2.switch执行效率高于if判断
循环语句:
while循环:
设置初始值;
while(循环条件){
循环体;
步长++;
}
do while循环:
设置初始值;
do{
循环体;
步长++;
}while(循环条件);
for循环:
for(初始值;循环条件;步长){
循环体;
}
while和do while的区别:
1.书写格式不同:while先书写循环条件,在书写循环体和步长;do while先书写循环体和步长,再书写循环条件
2.执行顺序不同:while先执行循环条件,在执行循环体和步长;do while先执行循环体和步长,再执行循环条件
3.执行结果不同:当循环条件都为true时,结果无区别;当循环条件为false,do while至少执行一次
for循环和while和do while的区别:
1.书写格式不同:for循环初始值定义在for循环之内,while和do while的初始值定义在方法中或成员变量
2.初始值的作用域与生命周期:while和do while结束循环后,初始值的作用域和生命周期依然存在
for循环初始值的作用域只在for循环中有效,循环结束,初始值生命周期结束
关于break、continue、return:
break(结束循环) continue(跳出本次循环) return(结束函数执行)
8.方法:
定义:修饰符 返回类型 方法名 (参数){方法体}
方法定义在类中,主方法(main)之外。方法中不可以定义方法,但可以调用方法。
方法的调用:类名.方法名、对象.方法名
方法的重载:发生在同一类中,方法名相同,参数列表不同,与方法体、返回值、修饰符无关,具体调用由实际参数决定
9.数组:
1.定义:
1.定义数组并赋值:数据类型[] 数组名 = {变量1,变量2,变量3,变量4,…}
2.定义数组不赋值:数据类型[] 数组名 = new 数据类型[长度]
2.数组的使用:
通过下标获取、使用forEach遍历获取
注意:数组下标越界异常(超出定义数组的最大长度)
工具类:Arrays
面向对象:
类与对象的关系:
类:类是具有相同特性事务的抽象描述
对象:符合类描述特性的具体实现
一个类可以有多个对象,每个对象之间都是相互独立的
每new一个对象,都会在堆内存中开辟一个空间,用来存储对象中的属性和方法。
面向对象与面向过程:
面向过程:指的是解决或处理事务的步骤
面向对象:考虑的是拥有具体功能的对象,不考虑解决问题的过程,但是过程依旧存在。面向对象基于面向过程。
构造函数/构造方法:
1.构造函数是在实例化对象是调用的
2.当对象没有无参有参构造函数时,系统默认提供无参构造。
3.构造函数没有返回值
4.有参构造函数可以再实例化对象时直接给赋值
5.封装实体类,需要同时提供有参无参构造函数
面向对象的三大特性:
1.封装
给属性添加私有化访问权限修饰符 private
提供get、set方法
提供有参无参构造函数
2.继承
关键字:extends
书写格式:public class 子类 extends 父类 {}
当继承关系发生后:
1.一个父类可以有多个子类,但是一个子类只可以有一个父类。单继承
2.子类继承父类后,拥有父类的部分特性
3.子类不能继承到父类使用private修饰的属性和方法
4.实例化子类时,默认先调用父类的构造方法
super关键字:
用在子类中指代父类,用来调用父类的普通方法和构造方法
调用普通方法:super.方法名();
调用构造方法:super(); 调用无参构造
super(参数列表); 调用有参构造
注意:当调用父类的构造方法时,super关键字必须在第一行
方法的重写:
1.发生在继承关系中,当父类的方法无法满足子类需求,需要重写
2.子类重写父类方法,子类的返回值、方法名、参数列表必须完全一致
3.子类不能重写父类中private、static修饰的方法
4.子类的访问权限不能小于父类
5.子类不能声明比父类更大的异常
3.多态
继承关系发生后:
父类的引用指向子类对象:父类 对象名 = new 子类;
父类的引用指向父类对象:父类 对象名 = new 父类;
子类的引用指向子类对象:子类 对象名 = new 子类;
抽象:abstract
abstract可以用来修饰类和方法
抽象类:
不能被实例化
只可以通过被继承的方式来实现
当抽象类被继承后,可以通过实例化子类来调用
抽象方法:
抽象方法没有方法体
抽象方法必须出现在抽象类中
如果一个类继承了抽象类,必须重写抽象类中的所有抽象方法
接口:interface
接口的特性:
接口不能被实例化,只能通过被类实现 implements
接口中的方法都是抽象方法,接口中的变量都是常量
如果一个类实现了接口,必须重写接口中的所有抽象方法
接口与类是可以多实现的
接口与接口之间是多继承
接口不是用来实现功能的,而是用来规范标准的
集合框架:
collection(单列集合):
List:
ArrayList、LinkedList、vector
set:
HashSet、TreeSet
Map(双列集合):
HashMap、HashTable、TreeMap
List接口:
继承了collection接口,List的实现类有ArrayList、LinkedList、vector。
List中的元素有序、可重复、有下标。
ArrayList和Vector底层采用的数组实现。由于数组长度固定,所以当集合中元素被装满就需要扩容。
ArrayList调用无参构造实例化的空数组没有长度,调用增加方法时,会开辟10个长度,被装满后会以1.5倍长度扩容
LinkedList底层是node节点,是一个双向链表,没有初始化大小,没有扩容机制。
List集合可以使用for、forEach、迭代器Iterator遍历。
ArrayList、LinkedList、Vector区别:
1.类结构上:都是List的实现类,实例化对象以及方法的操作基本相同
2.底层存储:ArrayList和Vector底层是数组形式存储;LinkedList是基于链式存储
3.执行效率:数组形式存储查询效率高,增删改效率低;链式存储查询效率低,增删改效率高
4.线程安全:Vector中的方法被Synchronize修饰,线程安全
Set接口:
继承了collection接口,Set的实现类有HashSet、TreeSet。
Set中的元素无序、不可重复、无下标
Set集合底层存储方式是Map集合的key。
由于Set集合中的元素无下标,只能使用forEach或者迭代器遍历
Map接口:
Map是所有双列集合的接口,所有以键值对形式存储的类活接口都实现或继承了Map接口
Map的实现类有HashMap、HashTable、TreeMap
Map的存储方式是以key、value形式存储的
Map中的key是不可重复的,value可重复。
Map底层是以数组加链表的形式实现。
Map在每一次增加一个键值对都会遍历整个集合,找出是否有相同的key,如果有就修改value,没有就新增,以保证key唯一。
HashMap、HashTable、TreeMap、ConcurrentHashMap区别:
1.类结构上,HashMap、HashTable、TreeMap三者都实现了Map接口,ConcurrentHashMap实现了ConcurrentMap接口
2.对于null值的处理:HashMap是Map的非同步实现,允许存在null值。
HashTable是Map的同步实现,不允许存在null值,否则会报空指针异常
ConcurrentHashMap不允许存在null值
3.执行效率上:HashMap>ConcurrentHashMap>HashTable
4.线程安全:HashTable中的方法被Synchronize修饰,线程安全
ConcurrentHashMap采用分段锁
java常用工具类:
Object类:
是一个超级类,所有类都直接或间接继承Object类
常用方法:
toString()、getClass()、getName()、hashCode()、equals()、clone()
==与equals()的区别:
==:基本数据类型 比较值; 引用数据类型 比较内存地址
equals:重写 比较值; 不重写 与==相同
Exception异常类:
异常就是在程序中可能出现的错误或者是不正常代码导致程序无法执行或中断执行
-----Throwable
-----Error
-----Exception
-----运行时异常 可通过编译,运行时出现异常
-----编译异常 书写过程中的异常
-----自定义异常 任何普通类继承异常类,
异常处理:
1.try catch finally
2.throws
3.throw
Math数学类:
被final修饰,不能被继承。
构造方法被private修饰,不能实例化。
方法是静态方法,直接类名.方法名调用
常用方法:
Math.ceil() 向上取整
Math.floor() 向下取整
Math.abs() 绝对值
Math.round() 四舍五入
Random随机数
Date日期:
获取当前时间 new Date();
格式化时间:new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”)
获取毫秒值:getTime()
String:
被final修饰的类,不能被继承,没有任何子类。
String底层是一个final修饰的char类型的数组
String一旦被创建就是固定不变的。
String可以通过常量赋值,也可以通过实例化对象赋值。
String、StringBuffer、StringBuilder的区别:
1.类结构上:三者都是被final修饰的,都不能被继承
2.赋值:String可以通过常量赋值,也可以通过实例化对象赋值。
StringBuffer、StringBuilder只能通过实例化对象赋值。
3.字符串拼接:String可以通过+或者concat()方式拼接,每次拼接会产生新的字符串,开辟新的内存空间。
StringBuffer、StringBuilder采用append()方式追加,不会产生新的字符串,不开辟新的内存空间。
4.操作效率:StringBuilder>StringBuffer>String
5.线程安全:StringBuffer中的方法被Synchronize修饰,线程安全