
参考文献
[1] https://cloud.tencent.com/developer/article/1872211
Java语言特点
- 纯面向对象的语言。
- 具有平台无关性。
- 解释型语言。(相对的是编译型语言)
- 很多内置类库,如多线程支持,网络通信支持,垃圾回收器。
- 较好的安全性和健壮性。提供异常处理和垃圾回收机制。
JDK和JRE区别
- JDK:Java Development Kit,开发工具包,提供开发环境和运行环境。
- JRE:Java Runtime Environment,Java运行环境。
- JDK包含了JRE。
Java数据类型
基本数据类型
整数类型
- byte,1字节,-128 ~ 127。
- short,2字节,-32768 ~ 32767。
- int,4字节,-2^31 ~ 2^31-1
- long,8字节,-2^63 ~ 2^63-1
浮点数
- float,浮点数,32位,4字节
- double,浮点数,64位,8字节
布尔类型
- boolean:布尔,占用大小依据虚拟机不同有差异。
- 在规范上,没有要求boolean占用多大内存。
- 在遵循规范的基础上,如果boolean是单独使用,boolean占用4字节。如果boolean以数组使用,则一个boolean占用1字节。
- boolean:布尔,占用大小依据虚拟机不同有差异。
字符类型
- char:2字节,16位。
引用数据类型
- 数组
- 对象
自动装箱拆箱
对于Java基础数据类型,都有其对象的包装类。
装箱就是把基本数组类型封装为包装器类型。
拆箱就是自动将包装器类型转换为基础数据类型。
访问修饰符
- default:默认修饰符,同一包内可见。
- private:同一类内可见
- protected:同一包内的类和所有子类可见,不能修饰类。
- public:所有类可见。
构造方法,成员变量初始化以及静态成员变量三者初始化顺序
先后顺序:静态成员变量,成员变量,构造方法。
详细先后顺序:
- 父类静态变量,
- 父类静态代码块,
- 子类静态变量,
- 子类静态代码块,
- 父类成员变量,父类构造方法,子类成员变量,子类构造方法。
面向对象三大特征
继承:对象新类可以从现有的类中派生,派生类可以从它的基类那继承方法和实例变量,且派生类可以修改或新增新的方法使之更适合特殊的需求。
封装:将客观事物抽象成类,每个类可以把自身数据和方法只让可信的类或对象操作,对不可信的类进行信息隐藏。
多态:允许不同类的对象对同一消息做出响应,不同对象调用相同方法即使参数也相同,最终表现行为是不一样的。
Java多态
Java多态分为编译时多态和运行时多态。
编译时多态主要指方法的重载,即通过参数列表的不同来区分不同的方法。
运行时多态主要指继承父类和实现接口时,可以使用父类引用指向子类对象。
运行时多态表现:主要依靠方法表,放发表最先存放Object类的方法,接下来是该类父类的方法,最后是该类本身的方法。若子类改写了父类的方法,则子类和父类同名方法共享一个方法表项,都被认作是父类的方法。因此可以实现运行时多态。
Java提供多态机制
重载,同一个类有多个同名的方法,方法有不同的参数,在编译期间可以确定调用哪个方法。
覆盖:派生类重写基类的方法。父类引用指向子类对象,在运行时可以确定要调用的方法。
重载和重写的区别
- 重写是父类与子类的关系。重载是同一类中方法之间的关系。
接口和抽象类的区别
- 相同
- 都不能被实例化
- 接口的实现类或抽象类的子类需实现接口或抽象类中相应的方法才能被实例化。
- 不同
- 接口只能有方法定义,不能有方法实现。抽象类可以有方法的定义和实现。
- 实现接口implement,继承抽象类使用extends。只能“单继承,多实现“。
- 对于应用
- 抽象类:当子类和父类之间存在逻辑上的层次接口,建议用抽象类。
- 接口类:当功能不需要,希望支持差别较大的两个或更多对象间的特定交互行为。
内部类及其作用
- 成员内部类:
- 成员内部类可以访问private及以上外部类的属性和方法。
- 外部类想要访问内部类属性或方法时,必须创建一个内部类对象,然后通过该对象访问内部类的属性或方法。
- 外部类也可以访问private修饰的内部类属性。
- 局部内部类:
- 存在于放啊中的内部类,访问权限类似局部变量,只能访问外部类的final变量。
- 匿名内部类:
- 只能用一次,没有类名,只能访问外部类的final变量。
- 静态内部类
- 类似类的静态成员变量。
Java的static
- 修饰成员变量
- 修饰常用方法
- 修饰代码块
- 修饰内部类
为什么String被设计为不可变
- 节省空间:字符串常量存储在JVM的字符串池中可以被用户共享。
- 提高效率:String可以被不同线程共享,是线程安全的。在涉及多线程操作中不需要同步操作。
安全:String常用于用户名,密码,文件名使用,由于其不可变,可避免黑客行为对其恶意修改(什么胡言乱语)
String,StringBuffer,StringBuilder
String类:不可变。
StringBuilder:采用无final修饰的字符数组保存,可变,效率高,线程不安全。
StringBuffer:采用无final修饰的字符数组保存,可变,效率低,线程安全。
- StringBuilder和StringBuffer原理上的区别:StringBuffer的所有方法都有synchronized修饰,所以线程安全。
Object类常用方法
- hashCode:通过对象计算散列码。常用于map和equals。
- equals:判断两个对象是否一致。若equals相同,则hashCode也必须相同。
- toString:用String表示该对象。
- clone:深拷贝一个对象。
Java一维数组和二维数组声明方式
一维数组
1 | type[] arrayName; |
二维数组
1 | type[][] arrayName; |
Java异常的分类
Error:程序无法处理的错误
Exception:程序可以处理的异常
Error常见的有StackOverFlowError,OutOfMemoryError。
Exception分为运行时异常和非运行时异常。对于运行时异常,可以用try,catch处理,也可不处理。对于非运行时异常,则无法通过编译。
throw和throws的区别
- throw一般用在方法体内部,用于抛出异常
- throws用在方法声明上,代表该方法可能会抛出异常的列表。
finally是否一定会执行
- 在try语句之前出现异常。
- 程序在try中出现程序强制退出,如System.exit(0)等方法,finally不会执行。
- 其他
- 当try/catch/finally时,若try中存在return,finally语句会在return之前执行。若try/catch/finally中都有return语句,finally语句中的return语句会覆盖try/catch中的return语句。
final,finally和finalize区别
- final,用于声明属性、方法和类,分别表示属性不可变,方法不可重写,类不可继承。
- finally作为异常处理的一部分,只能在try/catch中使用,finally语句在try/catch后一定会被执行,一般用于释放资源。
- finalize时Object类的一个方法,在垃圾收集器要回收对象时,会先调用finalize方法,并在下次垃圾回收动作时真正回收对象占用的内存。
泛型
即“参数化类型”,解决不确定对象具体类型的问题。
在编译阶段有效,操作的数据类型被指定为一个参数,这种参数类型在类中成为泛型类,接口中称为泛型接口,方法称为泛型方法。
泛型擦除
Java编译器生成的字节码不包含泛型西悉尼,泛型类型信息将在编译处理阶段擦除。
注解
Java注解用于为Java代码提供元数据。作为元数据,注解不直接影响代码执行,有些类型的注解可以用于这个目的。
可以用于提供信息给编译器,在编译阶段时给软件提供信息进行相关的处理,在运行时处理写相应代码,做对应操作。
元注解
元注解可以理解为注解的注解,即在注解中使用,实现想要的功能,具体有:
- @Retention:表示注解存在阶段。包括:保留在源码,在字节码(类加载),还是在运行期间。
- @Target,注解作用范围。
- @Document,将注解元素包含到Javadoc中。
- @Inherited:一个被@Inherited注解了的注解修饰一个父类,若子类没有被其他注解修饰,则子类继承父类注解。
- @Repeatable:被这个元注解修饰的注解可以同时作用一个对象多次,但每次作用注解又可以表示不同的含义。
Java的Class对象
Jav中对象可分为实例对象和Class对象,每个类都有一个Class对象,其包含了与该类相关的信息。
获取Class对象的方法。
1 | Class.forName("类的全限定名"); |
Java反射机制
Java反射机制是指程序在运行过程中可以构造任意一个类的对象,获取任意一个类的成员变量和成员方法,获取任意一个对象所属的类信息,调用任意一个对象的属性和方法。反射机制使得Java具有动态获取程序信息和动态调用对象放啊的能力。可以通过以下类调用反射API。
- Class类:可以获得类属性方法
- Field:可以获得类的成员信息
- Method:类的方法信息
- Construct:类的构造方法等信息。