简述static和final的用法 static修饰属性、方法、代码块 final修饰变量、类、方法 abstract class和interface的异同 相同 1.两者都是抽象类,都不能实例化 2.interface实现类及abstract class子类都必须实现已经声明的抽象方法 不同 1.interface需要通过implements实现,abstract class需要通过extends继承 2.一个类单实现多继承 3.interface强调特定功能的实现,abstract class强调所属关系 4.interface中的方法都是抽象方法,实现类必须都予以实现;abstract class子类可以有选项的实现 类的基本特性及优点 封装:类的封装性为类成员提供共有、缺省、保护和私有的访问权限,隐藏私有变量及方法实现细节 继承:类的继承性允许子类直接继承父类的部分或所有特性,还可以创建特有个性 多态:类的多态性指子类继承后可以具有不同数据类型或表现行为:重载和覆盖 error与exception的区别 error为系统级错误,程序不必处理 exception为需要程序处理的异常,常见RuntimeException有: java.lang.NullPointerException 空指针异常 调用了未经初始化或不存在的对象 ClassNoFoundException 未找到指定类异常 类名和路径加载错误,通常是试图通过字符串来加载某个类时可能引发异常 NumberFormatException 数据格式转换异常 字符串数据中包含非数字型字符 ArrayIndexOutOfBoundsException 数组下标越界异常 IllegalArgumentException 方法传递参数异常 ClassCastException 数据类型转换异常 NoClassDefFounfException 未找到类定义错误 SQLException sql异常 InstantiationException 实例化异常 NoSuchMethodException 方法不存在异常 Java内存泄漏 内存泄漏是指系统中存在无法回收的内存,不一定会表现出来,有时会造成内存不足或系统崩溃 自己实现堆栈数据结构时可能出现内存泄漏 多线程的实现方法 继承Thread类 实现Runnable接口 同步的实现方法 同步方法:在方法返回类型前加上synchronized关键字 同步代码块:synchronized(同步对象){…} sleep()和wait()的区别 sleep()属于Thread类,wait()属于Object方法 sleep()没有释放同步锁,wait()释放同步锁使其它线程可以使用同步控制块或方法 wait()只能在同步控制方法或同步控制代码块中使用,sleep()可以在任何地方使用 sleep()必须捕获异常,wait()不需要 Java语言优点 跨平台、面向对象、程序设计语言 功能强大、分支众多、代码安全 面向对象 将程序模块化、对象化 Java跨平台 Java源文件(.java)通过编译器编译成字节码文件(.class),.class文件基于字节码,是描述程序运行的虚指令集合,与平台无关 包装类型 基本类型不具备对象性质,包装后才能具备对象属性并为其添加属性、方法,丰富了操作 “==”与equals的区别 “==”:基本类型/String引用/包装类型 值是否相等 equals:地址值是否相等 Java集合 set:集,继承collection接口,元素无序且不可重复 list:列表,继承collection接口,元素有序且可以重复 ArrayList 实现动态数组数据结构,方便查询 LinkList 链表数据结构,方便增删 map:映射,hashmap为key-value结构 线程的实现方式 extends Thread:重写run方法 implements Runnable:实现编写run方法 implements Callable:实现编写run方法,可得到带返回值的线程 Java中的流 字节流、字符流 抽象类:InputStream、OutputStream、Reader、Writer &和&&的异同 相同 逻辑运算符–与 前后表达式均为true时结果为true,否则为false 不同 &&还有短路功能,前一个表达式为false时直接产生结果false length与length() length:数组属性,表示数组长度 length():String方法,表示字符串长度 构造器Constructor 构造器Constructor不能被继承:不能重写override,可以重载overload 构造实例: 分配对象空间并初始化成员为0或空 执行属性值的显式初始化 执行构造器 将变量关联到堆中对象 super与this的异同 不同 super主要是对父类构造函数的调用,this是对重载构造函数的调用 super主要是在继承父类的子类构造函数中使用(不同类),this主要是在同一类的不同构造函数中使用 相同 都必须在构造函数的第一行进行调用 接口、抽象类、实现类 接口可以继承接口 抽象类可以实现接口 抽象类可以继承实体类,前提是实体类必须有明确的构造函数 栈(stack)、堆(heap)、静态区(static area) 通常定义基本类型变量、对象引用、函数调用的现场保存均使用内存的栈空间 操作最快但空间小 通过new关键字和构造器创建的对象存放在堆空间 存放大量对象,理论上空闲的内存及硬盘虚拟内存都可以作为堆空间 程序中的字面量如直接书写100、“hello”和常量都存放在静态区 equals与hashcode 两个对象x、y的值相等(x.equals(y) == true),hashcode必须相等 两个对象x、y的hashcode值相等, x.equals(y) 未必为 true Anonymous Inner Class(匿名内部类) 可以访问创建其外部类对象的成员,包括私有成员 可以继承其它类 可以实现其它接口 final、finally、finalize final:关键字;修饰符 类:不能被继承 变量:声明时给定值,使用中不被改变 方法:可使用,不能被重写 finally: 通常放在try…catch…的后面,构造总是执行的代码块 只要JVM不关闭,可以将释放外资源的代码写在finally中 finalize:Object类中定义的方法 可以在垃圾收集器将对象从内存中清除出去前做必要的清理工作 Collection、Collections Collection:Set、List等容器的父接口 Collections:工具类,提供静态方法辅助容器操作如搜索、排序、线程安全化 线程同步及调度 wait():使一个线程处于等待/阻塞状态,并释放所持有的对象的锁 sleep():静态方法,使一个正在运行的线程处于睡眠状态,调用时要解决InterruptedException异常 notify():调用时由JVM确定唤醒某一个处于等待状态的线程,这与优先级无关 notifyAll():唤醒所有处于等待状态的线程,只有竞争拿到对象锁的线程才能进入就绪状态 Java序列化 序列化:一种用来处理对象流–将对象内容进行流化–的机制 解决对象流读写操作时可能引发的问题(若不进行序列化可能会存在数据乱序问题) 实现:让一个类实现Serializable接口使之可被序列化 使用输出流构造一个对象输出流并通过writeObject(Object)方法将对象写出–即保持状态 反序列化:用一个输入流建立对象输入流,通过readObject方法从流中读取对象 通过反射创建对象 1.通过类对象调用newInstance()方法,如:String.class.newInstance() 2.通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象 并调用其newInstance()方法创建对象,如:String.class.getConstructor(String.class).newInstance(“Hello”) JVM内存结构及分配 内存结构 方法区–Method Area 静态分配,编译器将变量绑定在某个存储位置上,且运行时不改变 保存:常数池,源代码中的命名常量、String常量、static变量 Java Stack–栈 逻辑概念,后进先出;空间可连续可不连续 存储的数据在运行时确定 Java heap allocation–堆分配 以随意顺序,在运行时进行存储空间分配和收回的内存管理模式 Java对象的内存总在heap中分配 内存分配 1.基础数据类型直接在栈空间分配 2.方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收 3.引用数据类型需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 4.方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收 5.局部变量new出来,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收 6.方法调用时传入的实际参数,先在栈空间分配,在方法调用完成后从栈空间释放 7.字符串常量在DATA区域分配,this在堆空间分配 8.数组既在栈空间分配数组名称,又在堆空间分配数组实际大小 双亲委派机制 若一个类加载器收到了类加载请求,并不会自己先去加载,而是把请求委托给父类的加载器去执行;若父类加载器还有其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器 若父类加载器可以完成类加载任务,则成功返回 若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载 Instanceof Instanceof可以判断一个引用类型的变量所指向的对象是否是一个类的实例 不可变类 指当创建该类的实例后就不允许修改其值,即:一个对象一旦被创建出来后,在其整个生命周期中,其成员变量就不能被修改 值传递、引用传递 值传递:方法调用中,实参会将值传递给形参,形参只是用实参的值初始化的一个临时存储单元,对形参的改变不会影响实参的值 引用传递:方法调用中,传递的是对象(可看作是对象的地址),此时形参与实参指向同一个存储单元(对象),修改形参将影响实参的值 强转类型 Java在涉及byte、short、char类型运算时,先将各类型的变量值强制转换为int类型,然后使用int类型的值进行计算,结果得到一个int类型的值 若需要得到byte、short、char类型的结果,需要显示地把运算结果转换为目标类型 ++i与i++的区别 ++i 先运算再赋值 i++ 先赋值再运算 字符串的存储机制 存储在常量池中 给字符串赋值时JVM会检查常量池中是否已经存在该字符串: 若存在则直接引用其地址 否则会在常量池中创建该字符串然后引用其地址