1.三大特性
封装:提供一些方法供外部访问对象内部信息
继承:
1.子类继承父类的所有变量和方法,但是不能访问父类的私有变量和方法。
2. 子类可以增加自己独有的变量和方法
3. 子类可以重写父类的方法
多态:
父类的引用指向子类,只能调用父子类都有的方法,如果子类重写了方法,则调用的实际是子类的方法。
2.接口和抽象类
共同之处:1.都不能实例化 2.都可以有默认实现(接口可以使用default,java8)3.都可以包含抽象方法
区别:1.可以实现多个接口,只能继承一个类 2.接口的成员变量只能是public static final,类的成员变量默认是default,在子类可以重定义。
3.深拷贝、浅拷贝、引用拷贝
引用拷贝两个引用指向堆中同一个对象。
浅拷贝新创建一个对象,对象中的基本类型会复制一份,与原数值互相独立,但是对象中有内部对象,则直接复制引用地址,拷贝对象和原对象中的内部对象会同步改动。
深拷贝就是不同的对象,在堆中新建。
4.==和equals
基本数据类型 == 比较值,引用数据类型 ==比较对象内存地址
equals用来判断对象是否相等,不能用来判断基本数据类型变量是否相等。String是特例,equals重写过直接比值
5.hashcode
重写equal却不重写hashcode,在插入map时候因为是先计算hashcode,可能导致两个equal为true的类因为hashcode不同 被重复插入。
6.String不可变,StringBuilder和StringBuffer继承自AbstractStringBuilder,使用字符数组保存字符串。
Sring和Stringbuffer线程安全。
String不可变是因为String内部的字符串数组是私有的并且不提供修改字符串的方法,同时作为final类,String不能被继承,子类无法破坏不可变性。
字符串相加实际是使用Stringbuilder append。循环相加,会创建过多StringBuilder。
字符串常量池,通过初始化创建的字符串都会放入,且可重复使用
String str = new String("str");会创建1-2个字符串对象
如果之前常量池中有,只会在堆中创建一个对象。如果没有,会在堆中创建1个对象,在字符串常量池中创建一个。
String str = "str"
如果之前常量池中有,只会返回对象引用。如果没有,会在字符串常量池中创建1个对象,返回对象引用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)