Java
线程不安全的 |
线程安全的 |
StringBuilder |
StringBuffer |
ArrayList |
Vector |
HashMap |
Hashtable |
基本数据类型
字符型:char
布尔型:Boolean
数值型:
整数类型:byte(1字节), short(2字节), int(4字节), long(8字节)
浮点型:float(4字节), double(8字节)
byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
boolean:只有true和false两个取值。
char:16位,存储Unicode码,用单引号赋值。
(1)成员变量和局部变量的区别
在类中的位置不同
成员变量:在类中方法外面
局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中)
在内存中的位置不同
成员变量:在堆中(方法区中静态区),成员变量属于对象,对象进堆内存
局部变量:在栈中,局部变量属于方法,方法进栈内存(Java虚拟机栈)
生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用或代码块的执行而存在,随着方法的调用完毕或者代码块的执行完毕而消失
初始值
成员变量:有默认初始值
局部变量:没有默认初始值,使用前需赋值
成员变量和局部变量的重名问题,使用变量时遵循的原则是就近原则;
可以使用this关键字区分,this.name指的是类中的成员变量,而不是方法内部的。
(2)抽象类和接口的区别 important
**抽象类:**如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。
**抽象方法:**它只有声明,而没有具体的实现的方法。
接口:比abstract class更加抽象,是一种特殊的abstract class。用Interface关键字修饰
实现
抽象类:子类使用extends关键字继承抽象父类。如果子类不是抽象类,就必须要实现抽象父类中声明的所有方法。
接口:子类使用implements关键字实现接口。子类需要实现接口中声明的所有方法。
一个类仅可以继承一个抽象类,但是可以实现多个接口
构造器
抽象类:可以有构造器
接口:无构造器
与正常Java类的区别
抽象类:除了不能实例化外,其它的都和正常Java类一样
接口:是和Java正常类完全不一样的类型
方法的访问修饰符
抽象类:抽象方法可以有public、protected、default修饰符
接口:接口方法的修饰符默认为public
成员变量及其修饰符
抽象类:可以有普通成员变量,也可以有静态成员变量,成员变量的访问类型可以任意
接口:接口中定义的变量只能是public static final类型(静态成员变量),并且默认即为public static final类型。(必须要赋初值,只能是常量)
两者在应用上的区别
抽象类:在代码实现方面发挥作用,可以实现代码的重用
接口:更多的是在系统架构设计方面发挥作用,主要用于定义模块之间的通信契约。
**相同点:**都不能被实例化,位于继承树的顶端,都包含抽象方法
对于接口:另外Java8允许接口中有 默认方法 、静态方法 。Java9允许接口中有私有方法 。它们都可以有具体的实现。
JDK9 私有方法
为什么要出现私有方法:
问题描述:在接口中我们需要抽取一个公共方法,用来解决两个默认方法之间重复代码 的问题,但是这个共有方法不应该让实现类使用,应该是私有化的。因此要解决这个问题就要考虑使用私有方法。
因此,接口中出现私有方法的目的就是解决多个默认方法之间的重复代码问题。
普通私有方法是解决多个默认方法之间重复代码的问题;private void method();
静态私有方法是解决多个静态方法之间的代码重复问题。 private static void method()
如何使用私有方法
使用过程的话其实和普通类中声明一个私有方法然后使用时一样的,在接口中创建一个私有方法当然只能在本接口内部使用。这里要说的是由于JDK8中出现了默认的方法和静态方法,因此此时的私有方法就可以使用了。
【下面这张图错误很多&#