Java基础
继承
访问权限修饰符
-
不加修饰符,表示包级可见
-
private
-
protected
- 用于修饰成员,表示在继承体系中成员对于子类可见,这个访问修饰符修饰类没有意义
-
public
抽象类与接口
抽象类
- 抽象类与抽象方法都使用abstract关键字进行声明,抽象类一般会包含抽象方法,抽象方法一定位于抽象类中
- 抽象类不能被实例化,需要继承抽象类才能实例化其子类
接口
- 接口是抽象类的延伸,在Java8之前,可以看成一个完全抽象的类,也就是没有任何方法的实现
- 从Java8开始,接口也可以拥有默认的方法实现
- 接口的字段和方法默认都是public的,并且不允许定义为private或者protected
- 接口的字段默认都是static和final的
两者的比较
- 抽象类提供了IS-A关系,即子类对象必须能够替换掉所有父亲对象
接口更像是一种LIKE-A关系,提供一种方法实现契约,而不要求接口的实现类完全拥有父亲对象 - 抽象类只能单继承,接口可以实现多继承
- 抽象类的字段可以有多种类型,而接口的字段只能是static和final类型的
- 抽象类的的成员可以有多种访问权限,接口的成员只能是public的
重写与重载
重写
- 子类方法的访问权限必须大于等于父类方法
- 子类方法的返回类型必须是父类方法返回类型或其子类型
重载
- 存在同一个类中,方法名相同,但参数类型、个数、顺序至少有一个不同(例子构造方法)
关键字
final
- 修饰数据,声明数据为常量,在运行时被初始化后不能被改变的常量
对于基本类型,final使数值不变;
对于引用类型,final使引用不变,也就不能引用其他对象,但是被引用的对象本身是可以修改的 - 修饰方法,声明的方法不能被子类重写,private方法隐式地指定为final,如果子类中定义的方法和基类中的一个private方法签名相同,此时子类的方法不是重写基类的方法,而是子类中定义了一个新的方法
- 修饰类,声明类不允许被继承
static
- 修饰变量,静态变量,又称为类变量,也就是这个变量是属于类的,类的所有实例都共享静态变量,可以直接通过类名来访问它,静态变量在内存中只存在一份
- 修饰方法,静态方法,在类加载的时候就存在了,不依赖于任何实例,所有静态方法必须有实现,也就是不能是抽象方法
- 修饰代码块,静态语句在类初始化时运行一次
反射
每一个类都有一个class对象,包含了与类有关的信息,当编译一个新类时,会产生一个同名的.class文件,该文件内容保存着class对象
类加载相当于class对象的加载,类在第一次使用时才动态的加载到jvm中,可以使用class.forName()方法来控制类的加载,该方法会返回一个class对象
反射可以提供运行时的类信息,并且这个类可以在运行时才加载进来,甚至在编译时期该类的.class不存在也可以加载进来
class和Java.lang.reflect一起为反射提供了支持,reflect类库主要包含以下三个类
- Field:可以使用get()和set()方法读取和修改Field对象关联的字段
- Method:可以使用invoke()方法调用与Method对象关联的方法
- Constructor:可以用Constructor创建新的对象
异常
Throwable可以用来表示任何可以作为异常抛出的累,分为Error和Exception
-
Error
-
Error用来表示jvm无法处理的错误
-
常见Error
- OutOfMemoryError
- StackOverflowError
-
-
Exception
-
受检异常
- 需要try…catch…语句捕获并处理,并且可以从异常中恢复
-
RuntimeException
-
IIIegalArgumentException
非法参数异常- NumberFormatException
-
IndexOutOfBoundsException
数组越界异常- ArrayIndexOutBoundsException
-
ArithmeticException
算术条件异常,如整数除零 -
NullPointerException
空指针异常 -
ClassNotFoundException
找不到类异常 -
ArrayStoreException
数据存储不兼容值异常 -
SecurityException
安全性异常
-
-
IOException
- FileNotFoundException
文件未找到异常 - SocketException
- EOFException
文件已结束异常
- FileNotFoundException
-
基础常见问题
Java中应该使用什么数据类型来代表价格?
- 不关心内存和性能的话,使用BigDecimal,否则使用double类型
怎么讲byte转换为String?
- 使用String接收byte[]参数的构造器来进行转换
Java中怎么样将bytes转换成long类型?
- String接收bytes的构造器转换成String,在long.parseLong
a=a+b与a+=b的区别
- +=隐式的将加操作的结果类型强制转换为持有结果的类型,如果两个整型相加,如byte,short或者int,首先会将他们提升到int类型,在执行加法操作
反射
类加载
-
类加载机制流程
-
加载
-
连接
- 验证
- 准备
- 解析
-
初始化
-
使用
-
卸载
-
class对象的获取
- 根据类名:类名.class
- 根据对象:对象.getClass()
- 根据全限定类名:Class.forName(全限定类名)