JAVA基础总结
一.数据类型
1.引用数据类型
2.基础数据类型:
四类八种:
整数:
byte:1字节(-128~127),默认值是0
shot:2字节,默认值是0
int:4字节,默认值是0,包装类Integer
long:8字节,默认值0
小数:
folat:4字节,默认值是0.0(定义后面要加F)
double:8字节,默认值是0.0
字符
char:2字节(0~65535),默认值是''(空字符)
布尔
boolean:true/false,默认值是false
注:整数字节数记1、2、4、8
二.关键字
关键字不能用来做标识符(变量名,方法名等)
1.static关键字
特点:随着类的加载而加载
修饰类:一般作为内部类
修饰变量:静态变量,在方法区中,被多个当前类的对象共享。有线程安全问题。可以直接通过类名访问,也可以通过对象访问但是不建议。
修饰方法:静态方法,在方法区中,可以直接通过类名访问,只能访问静态变量
修饰代码块:静态代码块,先于构造器之前执行,且只会执行一次
注:静态优先于非静态之前,静态修饰的方法不能被重写
2.final关键字
修饰类:最终类,不能被继承。(String类就是被final修饰的)
修饰变量:常量,只能初始化一次(常量建议要求都大写),初始化时机可以说变量进行初始化或构造器中初始化。
修饰方法:最终方法,不能被重写
final、finally、finalize 的区别:
finally一般用于try...catch块中华,表示一定会执行的方法(如果try中有return语句,也会在return之前先执行finally里的语句,但是如果try中有System.exit(0);语句就会直接关掉jvm虚拟机,就不会执行finally里的语句了)
finalize方法:Object类的方法,GC时会调用,JDK9之后,方法过时了
三.Java特性
封装
优点:提高内聚性,封装方法和类
三部曲:属性私有化,公开getter/setter方法,setter编写合理逻辑
继承
本质:子类is a 父类
复用性:公有内容抽取到父类中
子类可以继承父类的非私有方法(有争议)
构造子类对象:会先调用父类的构造器,用super实现,super必须出现在构造器的第一行,this和super只能出现一个
抽象类:抽象类不能直接创建对象,其中的抽象方法由子类去继承重写。(抽象类可以没有抽象方法,但是由抽象方法的类必须是抽象类)
方法重写:前提是继承,父类方法无法满足子类需求时,就需要重写父类的方法(被重写的方法一般会定义为抽象方法)
重写和重载:
重写是在继承的情况下,子类重写父类的方法,声明和父类方法一样,方法体不一样
重载是在同一个类中,方法名相同,方法参数的个数或种类不同。
多态
优点:提高了扩展性
父类引用指向子类实例
编译看父类,运行看子类
条件:要有继承或实现,由方法的重写
注:多态不能直接调用子类的特有方法和属性,必须通过强制类型转换,可以用instanceof 判断对象的实际类型。如下
对象名 instanceof 类名 //是该类型返回true,否则返回false
接口
本质:类has a接口
方法重写:需要重写接口类里的抽象方法
注:java8之后接口里可以放公开抽象方法、默认方法和静态方法,能放公开静态常量
四.异常
体系:
在项目中的使用:
自定义异常:继承RuntimeException方法,定义方法,有参构造器(String message)。在业务中如果愮抛出异常,一定是抛出自定义异常。
全部局异常处理器:定义多个处理异常的方法,对不同的异常给出不同的处理。同时会声明一个专门处理Exception异常的方法作为兜底方案
声明式事务:@Transactional(rollbackFor=Exception.class)
面试题:
1.说说你常见的运行时异常?
至少说出上面六种异常
2.项目中对异常是怎么控制的?
通过throws向上声明异常,由最高层try...catch处理异常
五.Object方法
toString:转为字符串
equals:比较传入的对象和当前对象是否相等,底层使用的是==
hashCode:获取Hash值
getClass:获取字节码(类.class 或 对象.getClass)
wait:在同步代码块中,用于让当前线程处于等待状态,会释放锁。等待其他线程调用 notify 或 notifyAll 唤醒,再执行。于sleep的区别是,sleep是线程的静态方法,用于指定线程的休眠时间,不会释放锁。
notify: 用于唤醒在该对象上调用 wait() 而进入等待状态的某一个线程
notifyAll:唤醒所有在该对象上调用 wait() 进入等待状态的线程。
clone:克隆对象,只有实现了 Cloneable 接口才能克隆,该接口无任务内容(标记型接口),起到标记作用。告知JVM,这个对象是可克隆。分为深克隆和浅克隆。
六.String
常量类(最终类),是一个对象
String str =new String("abc"); 这里早了两个对象:"abc"在常量池中,newnew String(指向常量池中abc的地址):在堆中
JDK8后对String做了优化:String str =new String("abc"); 只有一个对象了。由存储的char数组 改为 byte数组,字节存储操作,性能提升
String:常量类
StringBuilder:用来操作String、提升性能的类库,线程非安全
StringBuffer:用来操作String、提升性能的类库,线程安全
StringJoiner:用于更好的拼接字符串,可以选择声明开头什么结尾还有用什么分隔
String的常用方法:
length:获取字符串长度
trim:去除前后空格
getBytes:获取byte型数组
subString:前包后不包,从字符串中取一段
indexOf、lastIndexOf: 查找元素第一次出现的位置 , 查找元素最后一次出现的位置
split:分割,返回字符串数组
equals:重写了Object类的方法,用于比较两个字符串的内容是否一致
toUpperCase:全转为大写
toLowerCase:全转为小写
valueOf:转为String型
七.== 和 equlas的区别
== 是关系运算符,比较两个对象是否相等:
用于基本数据类型,比较值
用于引用数据类型:比较地址
equlas底层默认使用的是==
但是重写了equlas和hashCode方法,可以比较对象是否完全相一样