两年没碰了,先从基础的开始捡起来,今天的收获!19-24下次看吧。
1.面向对象的特征
抽象(这个不是)、封装、继承 、多态
抽象:把事物之间的相似和共性之处单独归为一个类,如Person类的name,age属性就可以抽象到一个类中,因为所有人都有这个属性。
封装:要实现“高内聚,低耦合”减少程序之间的相互依赖,把描述一个对象(封装的基本单位)的属性(变量)和行为(方法)放在同一个类中,变量设为私有成员变量,方法可以直接访问该类中的变量。
继承:子类共享父类的数据和方法,在定义和实现一个类的时候,可以先把一个已经存在的类中的内容作为自己的内容,并且加入自己的修改。
多态:不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态。
2.final, finally, finalize 的区别
final是修饰符关键字,用它修饰的类不能作为父类被继承,所以个一个类不能同时被abstract和final声明;用它修饰的变量和方法不能修改和重写,只能读取和使用,所以final修饰的变量要赋予初始值。
finally是在异常处理时使用的块,try块是在没有异常时执行的内容,catch块是在try块内容发生catch块声明的异常时要执行的内容,finally块的内容无论有没有异常被抛出(throw,throws)、捕获(try-catch块),都要被执行,即使在return语句之后也要先在return语句执行完之后返回之前执行finally语句,如果finally和try或catch中都有return,则finally中的return覆盖try或catch中的return直接返回。
finalize是方法名,在object类中定义的,因此所有类都继承了它,finalize()方法是在垃圾收集器将对象从内存中清除出去之前对该对象调用的。
3.抛出异常的三种方式
throw,是语句抛出异常,位于代码块内部,throw new 异常名,程序发生逻辑错误时,程序员主动抛出某种特定类型的异常,执行了该语句则一定发生异常。
Throws,是方法抛出异常,位于声明方法时方法名参数列表之后和方法体之前,当该方法发生异常时,抛出之后,交给调用它的上层方法处理,该方法可能发生异常。
系统自动抛出异常,不做特殊操作。
4.Java 提供两种不同的数据类型:引用数据类型和基本数据类型(或内置类型)
基本数据类型包括boolean、byte、int、char、short、long、float、double;
Java为每个基本数据类型提供了封装类,分别为Boolean、Byte、Integer、Character、Short、Long、Float、Double,Java有自动装箱(Integer num = 9)和拆箱功能(num--)。
引用数据类型包括数组、类、接口。
5.int 和 Integer 有什么区别
Integer是int的包装类,int是基本数据类型;
Integer的默认值是null,int的默认值是0;
Integer变量必须实例化后才能使用,int变量不需要;
Integer是指向new的对象(Integer i = new Integer(100);),int是直接存储数据值;
两个new生成的Integer变量永远不相等(内存地址不同),而两个值相同的int是相等的;
值相同的Integer和int是相等的,因为java在比较时会把Integer自动拆箱为int。
Integer值的缓存范围为-128-127之间。
6.重载和重写的区别
重写是在重写方法上面加@Override,就是在子类继承父类时,在不改变父类中方法名,参数列表,返回类型的情况下,修改方法体的内容,并且子类方法的访问权限不能少于父类。
重载(overload),是在一个类中方法名相同,但是参数列表不同(参数类型,个数,顺序),返回值类型可以相同也可以不同。
二者都是类中多态性的表现,重载是编译时的多态性,重写是运行时的多态性。
7.抽象类和接口有什么区别
二者都不能被实例化,都可以包含抽象方法,实现和继承的普通类都必须实现这些抽象方法。
抽象类(abstract class),实现的关键字是extends;表示的是这个对象是什么,强调所属关系;一个普通类只能继承一个抽象类(单继承,人类);可以有方法的具体实现;成员变量默认为default,可以在子类中重新定义、赋值;抽象类中必须有抽象方法,被abstract修饰,也可以有普通方法。
接口(interface),实现的关键字是implements;表示的是这个对象能做什么,强调特定功能的实现;一个普通类可以实现多个接口(间接多继承,吃饭接口,走路接口);只有定义,不能有方法的实现;成员变量默认为public static final,必须赋初值,不能被修改;成员方法必须被public abstract修饰(必须是抽象方法)。
8.HTTP(超文本传输协议) 请求的 GET 与 POST 方式的区别
二者是浏览器与服务器进行交互的不同方法,还有put(向服务器添加数据),delete(删除服务器的数据),这四种方法分别对应查,改,增,删。
Get是从服务器上获取数据不进行修改;这种交互方式是幂等的(幂等函数就是可以使用相同参数重复执行,并且获得相同的结果);请求的数据会附加在URL(采用ASCII编码)之后,以?分隔,多个参数用&连接;传输数据量不超过2KB;服务器端用Request.QueryString()获取变量的值;传输的数据会被显示在URL中,所以传输的数据安全性低;从对服务器的操作来看,该方式的安全性高。
Post是向服务器提交数据;这种方式的交互必须用表单,但是表单提交的默认方式是get,如果改为post,就需要修改表单的提交Method;将表单内各个字段和内容放置在HTML HEADER中一起传送到Action属性所指定的URL地址,用户看不到整个过程;传送数据量大,一般没有限制;服务器端用Request.From()获取提交的数据;传输的数据安全性高;从对服务器的操作来看,该方式的安全性低。
9.session 与 cookie 区别
HTTP是无状态协议,为了分辨是由谁发起的,不然即使是同一个网站每打开一个页面就要登录一下,session 与 cookie 就是解决这种问题的两种机制。
Cookie访问某些网站后服务器会在本地机器上存储的一些相关信息,下次访问时,跟随每一个请求发送至同一服务器减少一些步骤,是在客户端保持状态;主要内容包括:名字(key),值(value),过期时间,路径,域;如果不设过期时间(会话cookie),会保存在内存中,关闭浏览器,cookie就消失,设置过期时间(以秒为单位),会保存在硬盘中;保存在硬盘中的cookie可以在不同浏览器进程间共享;
Session访问网站时,服务器端自动生成HashTable和Session ID来唯一标识,并将其通过响应发送到浏览器,下次发送请求会将前一次服务器响应中的Session ID放在请求中一并发到服务器,服务器取出Session ID,并与保存的所有Session ID对比,找到对应的HashTable;
10.JDBC 流程
JDBC是java核心技术之一,是使用JDBC驱动程序访问数据库的首选方式,用于运行sql语句并从数据库中获取最新的java API。
- 载入驱动:Class.forName(“com.mysql.jdbc.Driver”)。
- 建立连接:Connection conn=DriverManager.getConnection(url,user,password);url格式如"jdbc:mysql://localhost:3306/test“。
- 创建运行对象:Statement st = connection.createStatement();Statement负责运行SQL语句,Statement还派生出两个接口类PreparedStatement和CallableStatement,前者能对SQL语句进行预编译,PreparedStatement ps = connection.prepareStatement( "update user set id=? where username=?”);通过ps.setObject(1,object)传参 。
- 运行SQL语句:ResultSet rs = statement.executeQuery(String sql)用于运行实现查询功能的SQL语句同理还有int num = executeUpdate(String sql)用于实现增,删,改功能,返回受影响行数。
- 处理运行结果:结果集ResultSet是通过游标操作,游标可以指向随意一条记录的指针,一个结果集中只有一个游标;可以借助ResultSetMetaData rsmd = rs.getMetaData()将数据表的结构信息查出来。
- 关闭连接:rs.close(),statement.close(),connection.close()。
11.MVC 设计思想
MVC(Model View Controller)是一种软件设计思想,将输入,处理,输出按照模型层,视图层,控制层进行分层设计。
View层:用户直接接触,展示model层处理的结果,提供相应的操作界面,方便用户使用。
Controller层:上传下达,view发送请求给控制器,由控制器选择相应的model来处理,model返回的结果给控制器,由控制器选择合适的视图。
Model层:后台操作,包含业务数据的加工与处理,以及相应的各种功能模块。
MVC使用目的:为了实现模型的复用;代码的维护性好;方便测试。
MVC使用:java类实现model,JSP实现view,servlet或filter实现controller。
MVC缺点:增加代码量,增加成本,设计难度增加。
12.equals 与 == 的区别
==比较的是两个引用在内存中是不是同一对象;String str1 = "abc",这种方式是现在栈中创建一个对象引用变量,然后通过引用去字符串常量池里找abc,如果没有,则将abc存进常量池,如果有,则直接将引用指向abc。
equals比较两个对象的内容是否相等,是由Object类提供的,可以由子类重写,由程序员决定是比较数据还是内存地址。
13.Exception、Error、运行时异常与一般异常有何异同
Java中异常对象都是从Throwable类派生的实例,如果内置的异常类不能满足,用户也可以创建自己的异常类。
Error描述了程序运行时系统的内部错误和资源耗尽错误,与程序执行的操作无关,而表示代码运行时JVM出现的问题。Exception包括运行时异常RuntimeException和其它异常。RuntimeException是由程序错误导致;程序本身没问题,但由于I/O错误导致的异常属于其它异常。
14.常见的RuntimeException
IndexOutOfBoundsException(下标越界异常)、NullPointerException(空指针异常)、ArithmeticException(算术运算异常)、SecurityException(安全异常)、NumberFormatException(String转换为指定数字类型异常)、ArrayStoreException(向数组中存放与声明不匹配对象异常)。
其它异常包括IOException(操作输入流与输出流时异常)、EOFException(文件已结束异常)、FileNotFoundException(文件未找到异常)。
Error和RuntimeException属于非检查异常,java编译器不要求进行抛出异常或异常捕获处理。
其它异常属于检查异常,如果不进行抛出异常或捕获处理,编译不能通过。
15.String、StringBuilder、StringBuffer
从运行速度和线程,安全两方面比较:
运行速度排序为StringBuilder>StringBuffer>String,因为String为字符串常量,一旦创建就不可更改,在修改值时实际是在不断创建新对象,JVM将旧对象不断回收的过程,所以速度慢;而StringBuilder和StringBuffer是字符串变量,可以直接更改操作,不进行创建和回收。
线程安全:StringBuffer是线程安全的,StringBuilder线程不安全,因为StringBuffer中很多方法可以带有synchronized关键字,如果一个StringBuffer对象被多个线程使用,可以保证线程安全。但是StringBuilder中没有该关键字。
如果要进行多线程操作就要使用StringBuffer,但是在单线程下建议使用速度更快的StringBuilder。
16.什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用
序列化(Serializable)是将java对象用二进制表示,而且这个二进制可以保存到磁盘也可以进行网络传输,不破坏其结构,序列化是一般文件。反序列化是将二进制还原为java对象,是XML文件。
如果对不满足序列化机制两个要求的类进行序列化, 则会抛出NotSerializableException;如果JVM发现序列化与反序列化的类文件"不相同", 则会抛出InvalidClassException。
实现序列化必须遵守:
- 该类必须直接实现java.io.Serializable接口或者间接从其父类中实现接口;
- 该类的所有无序列化属性必须使用transient修饰;
- 使用JDK提供的序列化和反序列化操作需要借助I/O流(ObjectOutputStream和ObjectInputStream),通过ObjectOutputStream的writeObject(obj)方法可以将对象写入到输出流中,通过ObjectInputStream的readObject()可以从输入流中反序列化该对象;
- 序列化和反序列化可以不在同一个JVM上进行;
- ObjectInputStream.readObject()可以反序列化任何类的对象,返回类型为Object,所以需要强制转换。
Student st = new Student(“1”);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“jason.se”));//实例化输出流oos
oos.ooswriteObject(st);//Student 对象序列化之后写入输出流
oos.close()
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(“jason.se”));
Student st1 = (Student )ois.readObject();//从输入流中读取然后反序列化为Student对象
ois.close()
17.Object类中常见的方法,为什么wait,notify这些操作线程的方法会放在Object里边?
toString()输出一个对象的地址字符串(hashcode),可以重写。
equals()比较两个对象的内容是否相等,可以重写。
Object()默认构造方法。
clone()创建并返回此对象的一个副本。
finalize()当垃圾回收器确定不存在对该对象的引用时,由对象的垃圾回收器调用此方法。
getClass()返回一个对象的运行时类(当前所属类)。
hashCode()返回该对象的哈希值。
wait()导致当前的线程等待,直到其它线程调用此对象的notify()方法或者通过传参直到超过某个时间或者其它线程中断当前线程。释放资源和锁。
Sleep()只释放资源,不释放锁。
notify()唤醒在此对象监视器上等待的单个线程。
notifyAll()唤醒在此对象监视器上等待的所有线程。
因为这些方法存在于同步中,使用时都必须标识synchronize,这把锁可以用于任何对象,所以任何对象都可以调用wait()和notify()方法,所以这两个方法属于Object类。
18.JDK和JRE,JVM的区别
JDK(Java Development Kit)是开发人员使用的开发工具包,包括java的开发环境,运行环境。SDK(Software Development Kit)指软件开发包,包括函数库、编译程序等。
JRE(Java Runtime Enviroment)是java的运行环境,是面向java程序的使用者,而不是开发者。
JVM是整个java实现跨平台的最核心部分,所有java程序首先被编译为可以在JVM上运行的.class文件。
JDK中包含JRE,JDK的安装目录下有个JRE目录,里面有bin和lib文件夹,可以认为bin里面是JVM,lib里是java需要的类库。JDK包括JRE,JRE包括JVM。
19.说说反射的用途及实现
反射:当程序运行时,允许获取自身的信息,并且可以操作类和对象的内部属性。是JVM在运行时才动态加载需要加载的类和对象。
反射框架提供的功能:在运行时判断任意一个对象所属的类;构造任意一个类的对象;判断任意一个类具有的成员变量和方法(包括private);调用任意一个对象的方法。
反射的用途:开发各种通用框架,如Spring,Struts框架。
反射的实现:相关类一般都在java.lang.reflect包里,包括:
- 获得Class对象:使用Class类的静态方法forName(),如加载数据库驱动时,Class.forName(driver);调用某个对象的getClass()方法;直接用.class获取。
- 判断是否为某个类的实例:用instanceof或Class的isInstance()方法。
- 创建实例:使用Class对象的newInstance()创建对象对应类的实例;先通过Class对象的getConstructor()获取指定的Constructor对象,然后调用Constructor对象的newInstance()方法创建实例。
- 获取方法:getDeclaredMethods()。
- 获取构造器信息:getDeclaredMethods(),getMethods(),getMethods()。
- 获取类的成员变量信息:getFiled()访问公有成员变量;getDeclaredFiled()所有已声明的成员变量,但不能得到其父类的成员变量。
- 调用对象的方法:invoke()。
- 利用反射创建数组:Array.newInstance()。
20.自定义注解的场景及实现
21.session 分布式处理
22.hashCode和equals方法的区别与联系
23.Java 8有哪些新特性
24.Java的平台无关性如何体现出来的