面试题库之JAVA基础篇(一)
java的特性
- 面向对象,能够使程序的耦合度更低,内聚性更高。
- 平台无关性,因为java程序运行在jvm虚上。
- 支持多线程。
- 安全可靠。
- 有丰富的类库。
面向对象
万物皆对象,将解决问题的各个元素抽象成对象,对象中包含解决单个或某类问题的属性、行为(方法),将需要的对象组合到一起,达到解决问题的目的;面向对象有封装、继承、多态的特性,所以有很好的维护性、复用性、扩展性。
封装
- 将某一类的行为(数据操作)内聚到一个类中,并且隐藏其实现过程,只对外提供特定的方法,使用者只能调动对外公开的方法,无法对封装类进行修改。
- 好的封装能够降低耦合性、提高封装类的扩展性。
继承
- 使用已有的类作为基础(基类)建立新类,新类拥有基类的属性和方法,同时也可以新增自己的属性和方法。
- 子类无法访问父类的私有属性和方法。
- 子类可以重写父类的方法。
- 提高代码的复用性,增加代码的耦合度。
多态
- 同一对象同一方法调用的表现结果不同。
- 实现条件:继承重写、向上转型。
重写(Override)
- 子类把父类中可继承的方法重新一遍,重写发生在子类中。
- 重写的方法的方法名、参数、返回类型必须和父类的一致,其中返回类型可以是父类发放返回类型的子类。
- 重写方法的访问修饰权限不能小于父类方法。
- 重写方法中不能申明新的异常或检查范围更大的异常。
- 运行时多态。
重载(Overload)
- 同一类中,存在方法名相同且参数列表不同的情况。
- 参数列表的不同可以是参数类型不同、参数个数不同、参数顺序不同。
- 返回类型可以不同。
- 编译时多态
向上转型
- 子类转换为父类类型。
- 子类中重写的父类方法被保留。
- 子类自定义的属性、方法将被丢弃。
创建对象的方式
- new创建新对象。
- 通过反射机制。
- 采用clone机制。
- 通过序列化机制。
标识符命名规则
- 标识符可以包含大小写英文、0-9的数据、下划线、$。
- 标识符不能以数字开头。
- 类型用大驼峰式,首字符大写,后面每个单词首字母大写。
- 变量、方法名用小驼峰式,首字母小写,后面每个单词首字母大写。
权限修饰符
权限修饰符 | 访问范围 |
---|---|
public | 被public修饰的类、接口、方法和变量等成员都可以被任何其他类或对象所访问 |
protected | 被protected修饰的类、方法、变量或者接口只能被相同包或其子类中的类或对象所访问 |
default | default是Java中的默认访问权限修饰符,它表示不指定任何访问权限修饰符时所使用的访问权限。如果一个类、方法、变量或接口没有使用任何访问权限修饰符,则这些成员默认为包级别访问权限,也就是说,只能在同一个包内被访问 |
private | 被private修饰的类、方法、变量或接口只能在自己的类中被调用 |
基本数据类型
基本类型 | 占用字节 | 默认值 | 有效范围 | 封装类 |
---|---|---|---|---|
byte | 1 | 0 | -2^7~2^7 | Byte |
short | 2 | 0 | -2^15~2^15-1 | Short |
int | 4 | 0 | -2^31~2^31-1 | Integer |
long | 8 | 0L | -2^63~2^63-1 | Long |
float | 4 | 0.0f | 1.4E-45~3.4028235E38 | Float |
double | 8 | 0.0d | 4.9E-324~1.7976931348623157E308 | Double |
boolean | - | false | true或false | Boolean |
char | 2 | \u0000(null) | 0~65535 | Character |
boolean
jvm中没有boolean专用的字节码命令,单个boolean在jvm使用是int数据类型代替,数组boolean使用是btye数组。使用int的原因是32位的CUP一次处理数据是32位,存取效率较高。
自动拆箱与装箱
拆箱:将包装类型转换为基本数据类型,Integer>>int:Integer.intValue。
装箱:将基本数据类型转换为包装类型,int>>Integer:Integer.valueOf(int)
instanceof
java中的一个双目运算符,用来判断一个对象是否一个类的实例、子类。
==
- 如果是基本数据类型,比较的是值,等号两边的类型必须一致。
- 如果是对象,比较的是对象的堆内存地址。
equals
- 用于对象比较,用于比较两个对象的内容是否相等。
- 被比较的对象如果没有重写equals方法,那么会使用object类的equals方法,而object的equals方式返回的是==的判断。
hashCode
默认情况下,大部分对象的hashCode默认是根据对象的存储地址计算的出来的一个散列值,大部分情况下对象的hashCode是用的不上的,主要在集合(set,hashMap、hashTabel)添加元素的时候用于快速定位和判重。
比如一个set里面已经有了10000个对象,这时要添加一个元素,首先要判重,如果那要添加的这个元素跟10000个对象都比较一下的,效率上会很慢,使用hashCode的话可以快速定位到set集合里面是否已有这个hashCode,如果没有,直接添加元素,如果有,再把hashCode对应的对象拿出来与要添加的对象进行equals比较,equals返回true放弃添加,false则添加。
equals和hashCode的关系
- 一个对象,重写equals就要重写hashCode。
- 当一个对象 equals() 方法所使用的字段不变时,多次调用 hashCode() 方法的值应保持不变。
- 如果两个对象equals相等,则hashCode必须相等。
- 如果两个对象的equals不相等,则hashCode可能相等,单建议不相等,以提升性能。