Java基础知识
基本数据类型
java内8种基本数据类型:
- byte(位) -2^7~2^7-1 ,默认为0
- short(短整数) -2^15~2^15-1 ,默认为0
- int(整数) -2^31~2^31-1 ,默认为0
- long(长整数)-2^63~2^63-1 ,默认为0L
- float(单精度)-2^31~2^31-1 ,默认为0.0f
- double(双精度)-2^63~2^63-1 ,默认为0.0d
- char(字符)0~2^16-1
- boolean(布尔值) true false, 默认为false。
自动类型转换
- 基本数据类型运算中,需要转换成相同类型才能运算
- 转换只能由低到高,不可逆
- byte,short,char—> int —> long—> float —> double
引用类型
引用类型指向一个对象,指向对象的变量是引用变量,所有引用类型的默认值都是null。
装箱和拆箱
装箱:基本数据类型转换为包装类,例如:Integer.valueOf();
拆箱:包装类转换为基本类型,Integer.intValue();
- 基本数据类型的常量池是-128到127之间
- 包装类在缓存范围内的包装类可以自动拆箱
- 基本数据类型在缓存范围外自动装箱
- 当比较大小时,会进行类型转换,进行比较
- 特殊类型:double,float 没有使用常量池缓存,声明和初始化都要装箱
- boolean和Boolean类型一样,都会自动装箱
字符串
面向对象特性
-
继承
- 通过继承,子类可以获得父类的属性和方法,使得子类和父类有相同的行为
- 子类能继承父类的非private方法和属性
- 子类可以拥有自定义的方法和属性,即是对父类的扩展
- 子类可以用自己的方法重写父类的方法;
- java支持单继承,使用extends关键字
- super:指向父类实例, 用于父类属性和方法的访问;this:指向当前应用。
- 优点:提高代码复用性,易于建立模型
- 缺点:增加代码耦合性
-
封装
- 指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法
- 良好的封装能够减少耦合
- 类内部的结构可以自由修改
- 可以对成员变量进行更精确的控制
- 隐藏信息,实现细节
-
多态
-
定义:同一个行为可以表现多种形式和形态
-
同一个接口,不同实例可以执行不同操作
-
多态实现条件:
- 继承
- 重写
- 动态绑定
-
优点:
- 消除类耦合
- 可扩充,可扩展
- 灵活,简化
-
多态实现方式:
- 重写
- 接口
- 抽象类和抽象方法
-
重写和重载
- 方法重载是一个类的多态性表现
- 方法重写是父类和子类之间的多态表现
-
接口
定义:是一种抽象的类型,是一些列抽象方法的集合;通过interface声明,类可以通过实现接口的方式,继承接口的方法;
- 接口不能实例化
- 接口没有构造方法
- 接口所有的方法都是隐式抽象的,默认加上public abstract,除了java8后的default方法
- 接口不能包含成员变量,除了静态变量外;
- 接口支持多实现,接口的方法不能在接口中实现,只能实现的类去实现。
抽象类
定义: 在面向对象中,所有概念都可以用类来描述,有些对象是具体的,确定的,但有些是没有足够的信息来描述一个对象,这类型就是抽象类。
- 抽象类不能被实例化;
- 抽象方法用abstract修饰,只有个方法名称和入参,没有方法体。
- 如果一个类包含抽象方法,则一定是抽象类,反过来,抽象类可以没有抽象方法
- 任何子类都写实现父类的抽象方法,除非子类也是抽象类。
异常体系
java中异常类型都由Throwable派生,分为Error类和Exception两类;
Error: 表示JVM自身运行异常,这里异常无法程序修正
Exception: 代表程序运行中发生了意料之外的事情,这些意外可以被异常处理机制处理;
- RuntimeException(不检查异常): 程序设计错误,数组越界,数值异常等,编码时期不用手动检查;
- 非RuntimeException(检查异常):这一类异常的发生通常由外部因素导致,是不可预知和避免的。例如,IO异常、类型寻找异常等
自定义异常默认会继承 Exception 或者 RuntimeException,继承于 Exception 的异常默认是受查异常,继承于 RuntimeException 的异常默认是非受查异常
常见面试题:
1.int和Integer的区别
- 节本数据类型和包装类,Integer 必须实例化才能使用,默认是null ,int 默认是0
- Integer当变量值在-128~127之间时,非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同;
2.接口和抽象类的区别
- 抽象类不能被实例化只能继承;
- 抽象方法一定是抽象类,抽象类不一定都是抽象方法;
- 抽象类方法只能public和protected;
- 子类继承抽象类,必须实现抽象方法;
- 接口只能定义,不能有方法体,default方法体除外,抽象类可以定义和实现,方法在抽象类中实现;
- 抽象类只能继承一个,接口可以实现多过;
- 接口的成员变量必须是public static final,不能被修改,默认需要初始化,抽象类的成员变量默认是default, 抽象方法不能private、static、synchronized和native修饰.
3.== 和equal的区别?
==比较的值,对于基本类型比较的是其存储的值类型(在缓存范围内),
==对于引用类型比较的引用的地址是否相等;
equal比较的是是否是同一个对象,不能比较基本数据类型