接口(interface)
接口的由来:当一个抽象类中 所有的函数都是抽象的时候,那么我们就可以将这个抽象类用另外一种表现形式-接口。
在JDK7之前 接口中是不可以定义具体函数的
在JDK8以后 接口中是可以定义具体函数的(必须是静态的函数 成员函数还是依旧默认抽象的)
类与类之间是什么关系---单继承 ( 一个类只能且只有一个父类)
接口与类之间是什么关系---实现关系(一个类可以实现多个接口 implements)
接口与接口之间是什么关系---多继承
为什么类与类之间不能多继承?为什么接口与接口之间可以多继承?
本质就看 函数是否有函数体!
final关键字
- final修饰变量 表示该变量所存储的数据的地址不能被改变
- final修饰函数 表示该函数不能被重写
- final修饰类 表示该类不能被继承
内部类
当我们在描述一个事物的时候,发现该事物当中又存在另外一个事物的时候,
我们把当前的事物称之为外部类 ,另一个事物称之为内部类
class 铁扇公主{
class 孙悟空{
}
}
Object类解析
所有类的最终父类都是Object !!!
native本地函数:就是指当前的方法内容有计算机具体的底层来实现 C/C++语言
- private static native void registerNatives();
Object的这个类一旦被加载进方法区 则执行 注册本地方法registerNatives()
就会在底层去创建一个Object对象并对类进行一定程度上初始化
static {
registerNatives();
}
所有Object的子类 可以继承到此方法 但是不能重写
功能:主要就是获取当前类的信息(当前对象的类的对象 - Class类)
本地方法
- public final native Class<?> getClass();
功能:获取当前对象的哈希值(在哈希表中的一个存储位置)
本方法可以被重写:
如果子类重写该方法 就意味着有子类去决定它自己的哈希值
如果子类没有重写该方法 默认将该对象的地址当做哈希值
- public native int hashCode(); *****
功能:当前对象this和传入的对象obj是否相等
对于Object而言 比较的其实就是两个对象的地址!!!
如果子类没有重写该方法 那么也默认进行地址的比较!!!
【一般而言 我们比较的应该对象的内容 而不是对象的地址】
【== equals有什么区别:==比的永远是地址 equals在Object中与==一样 当然 也可以由子类自行重写】
- public boolean equals(Object obj) { *****
return (this == obj);
}
功能:就是当我们直接打印一个对象时 打印的内容默认就是toString返回的内容
返回当前对象的字符串形式
Object obj=new Object();
println(obj); == println(obj.toString());
全类名+@+十六进制哈希值的字符串形式
- public String toString() { *****
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
基本数据类型包装类
万事万物接对象对象 ,所以我们的基本数据类型其实也有其针对的类描述
byte - Byte
short - Short
int - Integer
long - Long
float - Float
double - Double
char - Character
boolean - Boolean
Number
|-- Byte Short Integer Long Float Double 【BigDecimal BigInteger】
Object
|-- Character Boolean
StringBuffer类与StringBuilder类
字符串缓冲区(就是个动态扩容的数组而已!)
String是固定长度的且不能修改内容的字符串
SB就是长度可变的且能够修改内容的字符串
StringBuffer和StringBuilder 方法都是一样的,唯一的区别就在于适用的场景不同
- StringBuffer适用于多线程
- StringBuilder适用于单线程
- StringBuilder是线程不安全的->没加锁(同步锁) 单 效率会更高
- StringBuffer是线程安全的->加锁(同步锁) 多 效率会更低
String和SB本质上都是字符数组
- String中不支持字符数组扩容和修改内容的
- SB中支持字符数组扩容和修改内容的
AbstractStringBuilder
|impl Appendable 可扩展(字符/字符序列)的
Appendable append(char c)
Appendable append(CharSequence csq)
Appendable append(CharSequence csq, int start, int end)
|impl CharSequence 此接口对许多不同种类的 char 序列提供统一的只读访问
char charAt(int index)
int length()
CharSequence subSequence(int start, int end)
String toString()
|StringBuilder 有final表示不能被继承 成员函数没有synchronized修饰 无同步锁
|impl Serializable
|impl CharSequence
|StringBuffer 有final表示不能被继承 成员函数都有synchronized修饰 同步锁
|impl Serializable
|impl CharSequence
String 有final表示不能被继承 线程不安全的 会产生额外的垃圾!
|impl Serializable
|impl Comparable
|impl CharSequence
字符串缓冲区SB其实就是个动态扩容的数组而已!
如果扩容的次数越多,那么也就意味着所用过的数组也越多 产生的垃圾越多!
我们在使用String去操作的话,也会产生许多临时的字符串 产生的垃圾也多!
SB产生的垃圾主要集中在 堆内存
String产生的垃圾主要集中在 方法区(字符串常量池)
【JVM告诉你,GC在堆内存中活跃程度 比在方法区的活跃程度 要大的大的大的多!】
【GC 垃圾收集器】
【也就意味着 GC在堆内存中回收垃圾的效率要远远比在方法区高】
(堆垃圾就像是家用垃圾桶,满了就清理)
(方法区就像是垃圾场,满了才清理)
【堆的垃圾被回收的很快 方法区的垃圾回收的很慢】
综上而言 还是推荐使用SB