1、面向对象三大特征
- 封装:将对象的状态信息隐藏在对象内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对内部信息的操作和访问。
- 继承:把子类共有的属性和行为抽象到父类,在由子类继承父类。这样就拥有了父类的行为和属性,可实现代码的复用和多态。
- 多态:java引用变量有两种类型:编译时类型和运行时类型。编译时类由声明变量的类型决定,运行时类型由实际赋给盖变量的类型决定。引用类型由运行时实际赋给的类型去决定,可以实现同样的引用类型调用同样的方法,却有不同的效果,这就是多态。(或者说把子类类型赋给父类引用)
2、访问权限修饰符
image.png3、方法重写
方法重写发生在子类与父类间,子类重写父类的方法,但是不可重写构造器。
重写规范:两同、两小、一大
- 两同:方法名相同,参数相同
- 两小:抛出的异常小于等于父类抛出的异常,返回类型小于等于父类返回类型
- 一大:访问权限大于父类访问权限
4、方法重载
方法重载发生在同一个类种,指具有相同方法名,不同参数列表的方法。返回类型可相同也可不同,但是不可以返回类型作为方法重载的判断。因为调用方法时无法确定要调用哪个方法。方法重载抛出的异常可以不同。
5、为什么要重写equals方法
所有类都是直接或间接继承于Object类
的,Object类中的equals方法实际上就是==
,比较的是地址,这与我们实际使用情况不符合。实际情况下,我们可能希望两个对象实例的属性值相同,就判断为对象相同,所以要重写equals方法。
6、为什么重写equals方法还要重写hashcode()方法
java中有这么个规范:两个对象相等,hashcode一定相等。两个对象的hashcode相等,它们不一定相等。
在使用hash存储的数据结构时(hashmap,set),可能造成错误。两个相等的对象都存储到一个hashmap中去了。
7、java是值传递还是引用传递
值传递。对于基本数据类型变量,就把该变量的值传递过去。对于引用类型变量,就把该引用的地址传递过去(不把整个引用指向的值传过去)。
8、String对象会创建几个对象
String a = "abc";
创建一个对象,在字符串常量池中
String a = new String("abc")
创建一个或两个对象,堆中肯定会创建"abc"
对象,若常量池中已经存在"abc"
对象,则不在创建,不存在,则创建。
String a = "abc" + "def"
创建一个对象,编译期会被优化为"abcder"
9、String、StringBuilder、StringBuffer区别
- String:不可变字符串
- StringBuilder:可变字符串,线程不安全
- StringBuffer:可变字符串,线程安全,synchronize修饰
10、String + 拼接原理
String a = "abc" + "def"
创建一个对象,编译期会被优化为"abcder"
String a = "abc";
String b = a + "def";
变量b的拼接中包含其他变量,编译期无法确定,运行时调用StringBuilder拼接,生成的对象在堆中。
11、String.intern()
jdk1.7中,调用String.intern()
方法。如果常量池中存在字符串,则不做操作。如果不存在,在把该字符串堆中的引用赋给常量池中的对象。
12、抽象类与接口的区别
不同:
- 抽象类可以有构造器,接口没有构造器
- 抽象类可以有普通方法和具体方法,接口没有具体方法(jdk1.8后可以有静态方法,并有方法体)
- 抽象类可以有普通成员变量,接口只有常量
- 抽象类成员修饰符有
public、protected、默认、private
,接口只能是public
相同: - 都不能被实例化
- 都可以作为引用类型
网友评论