一、面向对象的特征
封装,继承,多态。
1.封装,也就是把客观事物封装成抽象的类,使用不同的访问权限控制对类的属性的访问。简而言之就是,使类对外部保持整洁,只留有主要的接口进行类业务逻辑的使用。
2.继承
子类拥有父类非 private 的属性、方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
final修饰的类不可被继承。
3.多态
程序中定义的引用类型变量所指向的具体类型和调用的具体方法在程序编译阶段无法确定,而是在运行期才能确定该引用类型变量指向具体哪个对象而调用在哪个类中声明的方法。重写,重载,向上向下转型。
二、final, finally, finalize 的区别
2.1 final
final是一个修饰符也是一个关键字。
被final修饰的类无法被继承
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。但是它指向的对象的内容是可变的。
被final修饰的方法将无法被重写,但允许重载
注意:类的private方法会隐式地被指定为final方法。
2.2 finally
finally是一个关键字。
finally在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出或者捕获,finally块都会执行,通常用于释放资源。
finally块正常情况下一定会被执行。但是有至少两个极端情况:
如果对应的try块没有执行,则这个try块的finally块并不会被执行
如果在try块中jvm关机,例如system.exit(n),则finally块也不会执行
finally块中如果有return语句,则会覆盖try或者catch中的return语句,导致二者无法return,所以强烈建议finally块中不要存在return关键字
2.3 finalize
finalize()是Object类的protected方法,子类可以覆盖该方法以实现资源清理工作。
GC在回收对象之前都会调用该方法
finalize()方法是存在很多问题的:
java语言规范并不保证finalize方法会被及时地执行,更根本不会保证它们一定会被执行
finalize()方法可能带来性能问题,因为JVM通常在单独的低优先级线程中完成finalize的执行
finalize()方法中,可将待回收对象赋值给GC Roots可达的对象引用,从而达到对象再生的目的
finalize方法最多由GC执行一次(但可以手动调用对象的finalize方法)
三、基本类型和包装类型的区别
包装类型可以为 null,而基本类型不可以
包装类型可用于泛型,而基本类型不可以
基本类型比包装类型更高效,基本类型在栈中直接存储的具体数值,而包装类型则存储的是堆中的引用
基本类型可以用'=='比较,包装类型不可以,(Integer 值范围在-127到128之间可以用'==',因为用的缓存)
四、
1.重写(Override)
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。
2.重载(Overload)
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
重载规则:
被重载的方法必须改变参数列表(参数个数或类型不一样);
被重载的方法可以改变返回类型;
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异常;
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载函数的区分标准。
五、抽象类和接口有什么区别
1.相同点:
1)都是抽象类型;
2)都可以有实现方法(以前接口不行);
3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)
2.不同点:
1)抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);
2)抽象类和接口所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系;
3)接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
六、反射的用途及实现
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法(通过反射设置可以调用 private)
在运行时调用人一个对象的方法
七、说说自定义注解的场景及实现
定义一个自定义注解,与定义一个接口类似,只不过在interface前加是哪个@。其内部可以添加属性值,其属性值的定义为
修饰符 返回值类型 属性名() [default value],元注解:@Retention和@Target。
注解一般使用在类,属性,方法上;
自定义注解的使用场景:
权限验证,日志处理,特定拦截处理,类的扫描等等。
八、HTTP 请求的 GET 与 POST 方式的区别
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
首先是语义区别,GET 为获取,POST 为提交数据;
其次是 GET 请求只请求服务器一次,但 POST 会请求两次,第一次是 OPTIONS 方式请求为了确定服务器是否能够接收数据,第二次才是真的 POST 请求,将数据提交到服务器;
九、session 与 cookie 区别
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中。
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
十、session共享
通过地三方存储session,如数据库。
通过nigix的url hash实现对同一用户的请求发送到相同的server。
通过web服务器的session共享功能实现session共享。
十一、JDBC流程
1.加载JDBC驱动程序 Class.forName("com.mysql.jdbc.Driver");
2.创建链接 Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称","用户名称","密码");
3.发送SQL语句(对数据库发出请求)
String sql="select * from user where id=?";
PrepareStatement ps=conn.prepareStatement(sql);
ps.setObject(1, 2); //1表示第一个"问号",2表示把id等于2的记录取出来
rs=ps.executeQuery();
4.返回查询结果
5.关闭链接
十二、MVC设计思想
MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。