java基础:
一、面向对象的特征:封装,继承和多态
1、封装:防止该类的代码和数据被外部类定义的代码随机访问。
优点:修改自己的实现代码,而不用修改哪些调用我们代码的程序片断。
2、继承(extends ):继承就是子类从父类继承方法,使得子类具有父类相同的特征和行为。
特点:
1).子类拥有父类非private的属性、方法
2).子类可以拥有自己的属性和方法,即子类可以对父类进行扩展
3).子类可以用自己的方式实现父类的方法
4).Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类
注: final关键字
final关键字声明类可以把类定义为不能继承的,即最终类,用于修饰方法,该方法不能被子类重写。
3、多态:多态体现为父类引用变量可以指向子类对象。
多态存在的三个必要条件:
继承、重写、父类引用指向子类对象
特点:Fu f = new Zi();
1)、多态成员变量:编译运行看左边
2)、多态成员方法:编译看左边,运行看右边
注:instanceof关键字
Java中,instanceof运算符的前一个操作符是一个引用变量,后一个操作数通常是一个类(可以是接口),用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。如果是返回true,否则返回false。
作用:用来判断某个对象是否属于某种数据类型。
二、常见的RuntimeException(运行时异常):
IndexOutOfBoundsException(下标越界异常)
NullPointerException(空指针异常)
NumberFormatException (String转换为指定的数字类型异常)
ArithmeticException -(算术运算异常 如除数为0)
ArrayStoreException - (向数组中存放与声明类型不兼容对象异常)
三、String、StringBuilder、StringBuffer区别
String被final修饰,值是不可变的,每次对String的操作都会生成新的对象,效率低下,而且浪费大量的内存空间
StringBuffer是可变类,不会产生新的对象,线程安全,多线程操作字符串
StringBuilder是可变类,不会产生新的对象,线程不安全,单线程操作字符串
四、重载和重写的区别
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
重写发生在子类与父类之间,重写要求子类的方法与父类被重写方法有相同的参数列表,有兼容的返回类型,不能比父类被重写方法声明更多的异常(里氏代换原则)。
注:重载对返回类型没有特殊的要求,不能根据返回类型进行区分。
五、抽象类和接口的区别
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
六、反射
定义:反射是java语言的特征之一,允许动态地发现和绑定类、方法、字段,通过反射,能够在需要时完成创建实例、调用方法和访问字段的工作
用途:
在运行时判断任意一个对象所属的
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法,通过反射甚至可以调用到private修饰的方法
生成动态代理
反射的使用:
Spring 框架的 IOC
基于反射创建对象和设置依赖属性。
Spring MVC
的请求调用对应方法,也是通过反射。
JDBC
的 Class#forName(String className)
方法,也是使用反射。
注:
java文件编译后变成class文件,class文件被类加载器加载到内存中,并且JVM根据其字节数组创建了对应的Class对象。
Class类是Java反射的起源,针对任何一个我们想使用的类,只有先为它产生一个Class对象,接下来就可以通过Class对象获取其他的信息。
JVM为每个类管理着一个独一无二的Class对象,当我们需要创建每个类的对象时,JVM会检查所要加载的类对应的Class对象是否已经存在。不存在,则JVM会根据类加载机制加载并创建对应的Class对象,最后使用Class对象创建出我们通常使用的实例对象。
六、GET和POST区别
1)、GET把参数包含在URL中,POST通过request body传递参数。
2)、GET请求在URL中传送的参数是有长度限制的,而POST没有。
3)、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
4)、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
5)、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6)、GET发送一次请求,而POST则需要发送两次请求。
注:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
七、Session与Cookie
区别:Cookie保存在客户端浏览器中,Session保存在服务器端(cookie是在客户端保持状态,而session是在服务器端保持状态)
Cookie机制:cookie的内容主要包括name(名字)、value(值)、maxAge(失效时间)、path(路径),domain(域名)和secure
Session机制:服务端使用散列表保存信息,当程序需要为客户端的一个请求创建session的时候,首先需要去判断这个客户端请求中是否已包含了一个session标识--sessionID,
如果已经包含一个sessionID,则说明以前已经为此客户端创建过session,服务器就按照sessionID把这个session检索出来使用,
如果客户端请求不包含sessionID,则为此客户端创建一个session并且声称一个与此session相关联的sessionID,这个sessionID将被在本次响应中返回给客户端保存。
缺点:
Cookie:cookie可以被用户禁止;不安全;只能保存少量数据;只能保存字符串
Session:session是借助cookie来实现的,cookie被禁止,session也被禁止;当用户访问量很大时,对服务器压力大
八、equals 和 == 的区别
基本数据类型比较(string 除外), == 和 Equals 两者都是比较值;
引用类型:没有重写equals方法时,用equals 和 == 进行比较的时候,比较的是他们在内存中的存放地址
注:重写equals,必须重写hashcode方法
九、序列化和反序列化,如何实现序列化?
序列化:把对象转换为字节序列的过程称为对象的序列化
反序列化:把字节序列恢复为对象的过程称为对象的反序列化
序列化的实现:实现Serializable接口
对象的序列化的用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
十、String常用方法整理:
substring(int start) 参数:start:要截取位置的索引 返回: 从start开始到结束的字符串
注:如果start大于字符串的长度将会抛出越界异常;
substring(int beginIndex, int endIndex) 参数:beginIndex 开始位置索引 endIndex 结束位置索引 返回:从beginIndex位置到endIndex位置内的字符串
注:如果startIndex和endIndex其中有越界的将会抛出越界异常
indexOf(num)
作用:从数组开头向后开始查找目标数所在的位置,然后返回它的索引值。
未查找到返回-1
indexOf(num1,num2)
作用:在数组里面从num2往后开始查找num1,并返回num1在数组里正常的位置
未查找到返回-1
lastIndexOf(num)
作用:从数组后面开始往前查找第一次出现的目标数,并且返回它正常的索引值
未找到返回-1
lastIndexOf(num1,num2)
作用:从num2开始查找num1最后出现的位置
未找到返回-1