二十一、构造方法的特性
- 名字与类名相同;
- 没有返回值,但不能用void声明构造函数;
- 生成类的对象时自动执行,无需调用
二十二、静态变量与实例变量,静态方法与实例方法的区别
-
内存:
- 静态变量: 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。
- 实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。
-
共享与初始化
- 静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
- 非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
-
还有一点就是static成员变量的初始化顺序按照定义的顺序进行初始化
静态方法与实例方法
- 在外部调用静态方法时,可以使用**"类名.方法名**"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
- 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制
二十三、==与equals(),equals()与hashcode()
-
==与equals()
==:基本数据类型,比较的是值
引用数据类型,比较的是两个对象的地址
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两
个对象。
情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内
容相等,则返回 true (即,认为这两个对象相等)。 -
equals()与hashcode()规定
两个对象equals(),返回true,两个对象的hashcode()一定相等
两个对象hashcode()相等,equals()不一定放回true
二十四、字符型常量与字符串常量 字符串常量池
字符型常量与字符串常量区别
- 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
- 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该
字符串在内存中存放位置) - 占内存大小 字符常量只占两个字节 字符串常量占若干个字节(至少一个字符结束标志)
字符串常量池
字符串常量池位于堆内存中,专门用来存储字符串常量,可以**提高内存的使用率,**避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用
二十五、String有哪些特性 为什么说String是不可变的
特性:
- 不可变性:String 是只读字符串,是一个典型的 immutable 对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。
- 常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。
- final:使用 final 来定义 String 类,表示 String 类不能被继承,提高了系统的安全性。
为什么说String是不可变的
简单来说就是,String类利用final修饰的char数组来存储字符数据