三大特性
- 封装是指类的信息隐藏起来,不能给外部直接访问(可以反射获取),但是提供了公有的方法来获取他。
- 继承是指一个类继承另一个类,就会继承他的公有属性和方法,并可以进行扩展。java支持单继承,但是可以继承多个接口
- 多态是可以表现出不同的形态,有引用多态和方法多态两种。引用多态就是父亲的引用可以指向本类的对象或者子类的对象。方法多态是子类可以用重写后的父亲方法或者继承父亲的方法。
泛型
泛型可以减少一些代码量,复用模板就好。泛型可以把运行时的类型检查提前到编译期间。
泛型通过类型擦除来实现,编译器会在编译时期擦除所有泛型类型相关的信息,所以在运行时不存在任何泛型类型相关的信息。
泛型擦除是在编译成字节码时先进行类型检查,然后类型擦除,如果类型擦除和多态性发生冲突就在子类中生成桥方法解决,然后如果调用泛型方法的返回类型被擦除就在调用时强制类型转换。
限定通配符:如果是<? extends E>,我的理解是可以向下兼容,即可以是E和E的子类。如果是<? super E>,我的理解是向上兼容,可以是E和E的父类。
反射
java反射机制是在运行状态中,对于任意一个类来说,我可以得到他的所有方法和属性。对于任意一个对象来说,我可以调用他的任意一个属性和方法。
原理是java编译后生成一个class文件,反射通过字节码文件找到其中的属性和方法。
优点:动态执行,在运行时候可以根据业务功能来执行方法,属性,比较灵活
缺点:效率肯定比直接执行java代码低。性能不好。
注解
注解应该算一种标签,一种注释,告诉你接下来这个东西是用来干什么的,可以在编译期用预编译期进行处理,也可以在运行期通过反射机制处理。
接口与抽象类
- 接口方法默认实现是public,接口里面的所有方法都不能实现(可以有默认实现),抽象类可以有非抽象的方法。
- 接口变量只能用static,final修饰,抽象类不限制
- 一个类只能实现一个抽象类,但是可以实现好多个接口,一个接口可以继承好多个接口。
- 接口方法默认public修饰,抽象类方法不能用private修饰
- 接口是对行为的抽象,是行为规范。抽象类是对类的抽象,是模板设计。
异常
所有异常都有一个祖先Throwable,然后分为异常和错误这两类,错误是系统不能被程序本身处理,只能避免。异常是可以被catch然后处理的。Exceptions可以分为受检查异常(必须处理)和不受检测的异常(可以不处理)。
equals与==
==比较的是两个对象的地址是否相等,也即是判断两个对象是否是同一个对象。(基本数据类型比较的就是值,引用数据类型比较的是地址)。
equals分为有没有重写
有被重写(如int,string):比较的是两个对象的值是否相等
没被重写:比较的是两个对象的地址是否相等。
重写equals为什么要重写hashcode方法
因为两个对象hashcode相等,对象不一定相等,但是如果两个对象相等,则hashcode一定相等。
hashcode是对堆上的对象产生一个独特值,如果没重写hashcode,两个对象无论如何都不能相等。
String,StringBuffer,StringBuilder
StringBuffer是线程安全的,速度会慢一点
StringBuilder是线程不安全的,速度快一点
String使用final来修饰,所以字符串不可变,每次改变都是生成一个新的对象,然后指针指向新的String对象,线程安全。
final
final可以修饰变量,类,方法
修饰变量的时候,如果是基本数据类型的,那么他的值就无法更改,如果是引用数据类型的,他就不能指向另一个对象。
修饰类的时候,这个类就不能被继承,同时这个类里面的成员方法都会被指定为final方法。
修饰方法的时候,把方法锁定,防止其他继承类去修改他的含义,类中所有的private方法都隐式的被指定为final
static关键字
static可以修饰变量,方法,类,代码块。可以在不实例化对象的时候,就获取被修饰的变量。在static方法内部不能调用非静态方法,但是非静态方法可以调用静态方法。
内部类与静态内部类的区别
内部类 | 静态内部类 |
---|---|
内部类中的方法和属性不可以声明为静态 | 静态内部类可以声明为静态或者非静态 |
如果要实例化内部类要先实例化外部类如A.B b = new A().new B() | 可以直接A.B b = new A.B() |
内部类可以引用外部类的静态或者非静态属性及方法 | 静态内部类只能引用外部类的静态属性及方法 |
java的值传递
java程序设计总是采用按值去调用,一个方法得到的是他的参数的拷贝,方法不能修改传递给他的参数内容。比如说我写一个void swap(int a,int b)交换的是a和b的拷贝,a和b实际上没有被交换。
深拷贝与浅拷贝
浅拷贝:对基本数据类型进行值传递,引用数据类型进行引用传递般的拷贝
深拷贝:对基本数据类型进行值传递,对引用数据类型创建一个新对象进行复制。
IO
- 从流的流向分析,分为输入流输出流
- 从流的操作单元分析,分为字节流和字符流
- 从流的角色分析,分为节点流和处理流
IO流的类都是从四个基类衍生出来的,四个基类分别是 - InputStream/Reader:输入流的基类,前者字节流,后者是字符流
- outputStream/Writer:输出流的基类,前者字节流,后者字符流
既然有了字节流,为什么要字符流
不管是文件操作还是网络操作,最小单元都是字节,为什么还要提供字符流
不同语言(英语,汉字等)占据多少个字节不一样,不知道编码类型就容易发生乱码,所以直接提供了一个字符流,方便对字符进行操作,字符流一般用来处理txt这种纯文字,字节流用于网络操作和文件操作。
BIO,NIO,AIO区别
BIO(Blocking I/O):同步阻塞IO模型,数据的读取写入必须阻塞在一个线程内完成,不能太多连接。
NIO(NonBlocking I/O):非同步阻塞模型,可以多连接的完成输入输出,如果连接少,也支持阻塞模型来输入。
AIO(Asynchronous I/O):异步非阻塞模型,应用操作之后直接返回,当后台处理完成的时候,再去通知对应的线程去处理后续操作。
重载与重写
重载:一个类中有多个名字一样,参数或者返回值不同的方法,就是重载。发生在编译期。
重写:子类继承父类后,对父类的一个方法进行重写,参数不变,对里面的内容进行修改。发生在运行期。
transient
transient关键字来防止某些字段序列化。只能修饰变量,当对象被反序列化时,被transient修饰的变量不会持久化和恢复。