一、基础
1.面向对象的特征
封装、继承、多态、抽象
封装:把复杂的代码包装起来,让使用者可以简单调用
继承:一个类能通过这种方式不必重写,而直接使用被继承类的方法
多态: 指在继承或者实现的过程中,通过重写、实现的动作,相同的父类或者接口表现出来的不同的结果。
比如: 工作人员,有销售员,收银员,会计员等多种形态。
多态的前提:
必须有继承关系/实现关系
必须有方法的重写[如果不重写方法,多态也是可以的,但是是没有意义的!!!]
多态的代码体现:
父类类型的变量 指向 子类类型的对象
比如:
Worker w = new Sales();
Animal a = new Dog();
Person p = new Teacher();
多态调用方法时的特点:
1.编译看父,运行看子
2.多态的好处在于提高代码的扩展性
3.多态状态下(Animal a = new Dog)下,只能实现父子类都有的方法,想要使用子类特有的方法需要向下转型:
Animals a = new Dog();
(Dog)a.eatGuTou(); //用到子类特有方法时,需要向下转型,类似于强制类型转换
2.高内聚、低耦合
高内聚指把复杂的代码封装到类中,别人在调用的时候尽可能的少暴露一些方法
低耦合指代码和代码之间尽可能的减少关联,保证一段代码出现问题后,不会影响到别的代码运行
3.JDK JRE JVM的区别
4.重载和重写的区别
重载:同一个类中,允许出现相同的方法名,但这些方法传入的参数类型或者数量不同
重写:指子类对父类方法的重新定义,但参数列表必须相同,返回值范围和异常范围不能大于父类
5.Java中==和equals的区别
== 比较基本类型的值是否相同
比较引用类型的地址是否相同
Equals 默认情况下,比较的是地址值
但String、Integer、Date这都些类库中的equels被重写,比较的时内容而不是地址
6.String、StringBuffer、StringBuilder 三者之间的区别
String 字符串常量
StringBuffer 字符串变量(线程安全):对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的
StringBuilder 字符串变量(非线程安全):并没有对方法进行加同步锁
7.接口和抽象类的区别是什么?
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符
8.string 常用的方法有哪些?
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
补充:分割和截取的区别
//按“,”截取字符串
String id="123123,234534,453456";
String[] idArry = id.trim().split(",");
for(String nid:idArry){
System.out.println(nid);
}
打印出的值为:123123
234534
453456
//分隔符:substring
String returnResult= "13123123";
String subresult = returnResult.substring(1, returnResult.length() - 1);
subresult的值为“312312”
9.什么是单例模式,有几种?
某个类的被创建出来的对象,在多线程的环境下只能被创建出来一个
单例模式有三种:一种是一开始就创建好一个对象,使用时直接拿着个对象(这种模式是线程安全的)
第二种是使用时再创建(延迟初始化,非线程安全)
双检锁:线程安全,延迟初始化。
10.反射
反射机制指在运行状态中,对任何一个类都能够使用他的属性和方法;
获取Class对象的三种方法:
第一种:调用某个对象的.getClass方法
Person person = new Person;
Class clazz = Person.getClass();
第二种:调用某个类的class属性
Class clazz=Pserson.class;
第三种:使用Class类中的forName静态方法(最安全/性能最好)
Class clazz = Class.forName(“类的全路径”); (最常用)
11.异常
Throwable是Java程序中所有错误处理的父类,有两种类型:Error和Exception
Error 指让虚拟机无法运行的错误
Exception 指可以恢复的例外,可以被捕捉,包括运行时异常和编译异常
运行时异常:都是RuntimeException和它的子类,编译时编译器不会检查,运行时报错的异常,比如NullPointException,IndexOutBoundsExcepion(下标越界异常),一般是由于逻辑问题产生的异常。
编译异常(非运行时异常):是 RuntimeException 以外的异常,类型上都属于 Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
12.Java中三种代码块
静态代码块: 定义类中方法外
static{
静态代码块
}
a.当类加载到内存后,立刻执行静态代码块(只会执行一次)
b.一般用于初始化静态成员变量,或者加载某些资源(驱动,配置文件等...)
构造代码块: 定义类中方法外
{
构造代码块
}
a.当创建对象时构造代码块就会执行,创建一次执行一次
b.把多个构造都需要执行代码块,写到构造代码块中,提高代码的复用性
局部代码块: 定义类中方法内
{
局部代码块
}
a.提前结束局部代码块中变量的生命周期
13.