因为热爱所以坚持,因为热爱所以等待。熬过漫长无戏可演的日子,终于换来了人生的春天,共勉!!!
备战Java面试【每日十道面试题系列】 --基础篇Day1
1.Java有哪11种数据类型?
基本数据类型 | 占内存 | 数据范围 | 对应的包装类 | 示例 |
---|---|---|---|---|
byte | 1字字 | -27~27-1 | Byte | byte a = 1; |
short | 2字节 | -215~215-1 | Short | short a = 1; |
int | 4字节 | -231~231-1 | Integer | int a = 1; |
long | 8字节 | -263~263-1 | Long | long a = 1l; |
float | 4字节 | ±3.40282347E+38F(有效位数6 ~ 7位) | Float | float a = 1.0f(注意必须要加f/F); |
double | 8字节 | ±1.79769313486231570E+308(有效位数15位) | Double | double a = 1.0d; |
char | 2字节 | unicode字符范围 | Character | char a = ‘a’; |
boolean | 1字节 | true或false | Boolean | boolean a = true; |
2.面向对象的特性?
- 1.抽象
把现实世界某一类东西,提取出来,成为类或者接口,抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用考虑实现细节。抽象包括两个方面,一是数据抽象,二是过程抽象。
数据抽象:用代码的形式表示事物的特征,如拿鸟举例子:鸟都有以下属性:一对翅膀、两只脚、羽毛等。抽象出来的这些特征对应类的成员变量。
过程抽象:用代码形式表示现实世界中事物的一系列行为,就是针对对象的行为特征。比如鸟会飞、会叫等。抽象出来这些行为对应类的方法。
- 2.封装
封装是把过程和数据包围起来,对数据的访问只能通过暴露给外部的接口,封装隐藏了类的实现细节,从而可以在不影响使用者的前提下改变类的内部结构,保护了数据。
- 3.继承
继承是一种联结类的层次模型,对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。因此可以说,继承是为了重用父类代码,同时为实现多态性作准备
- 4.多态
多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。多态性是发送消息给某个对象,让该对象自行决定响应何种行为,多态包括编译时多态性和运行时多态性
编译时多态:也就是方法的重载
运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态,包括重写和向上转型
向上转型:向上转型中,对象调用的方法可能会涉及到了方法重写(向上转型说明有继承,继承就可以重写父类的方法)。向上转型的方法调用的判断机制简单来说是,先根据调用的方法的方法签名到父类中找到这个方法,再看子类中是否重写了这个方法,如果子类重写了,就调用子类的,没有重写就还是调用父类的
重写:使用override关键字重写父类或接口的方法
3.switch能否使用byte,long,String作为分支判断?
java5以前只能是byte,short,int,char,java5后引入枚举,expr开始可以是enum类型,java7后引入String,但long依然不可以
可以的类型 | 不可以的类型 |
---|---|
byte,short,int,char,enum,String | boolean,long,double,float |
4.构造器Constructor可不可以重写?
构造器Constructor不能被重写,但可以被重载
Constructor不能被继承,所以Constructor也就不能被override。每一个类必须有自己的构造函数,负责构造自己这部分的构造。子类不会覆盖父类的构造函数,相反必须负责在一开始调用父类的构造函数
5.String,StringBuider,StringBuffer的差别?
- 1.可变与不可变。
String类中使用字符数组保存字符串,因为有“final”修饰符,所以string对象是不可变的。对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,这两种对象都是可变的。
char[] value;
- 2.是否线程安全。
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
StringBuilder是非线程安全的。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
- 3.效率
速度方面StringBuilder > StringBuffer > String
Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢;
StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多
StringBuffer比StringBuilder慢的原因是为了保证线程安全会进行加锁操作
- 4.总结
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
6.java重载和重写的区别?
重载 | 发生在同一个类中 | 方法名相同参数列表不同 | 不能根据返回类型进行区分 |
重写 | 发生在父子类中 | 方法名参数列表必须相同 | 1.返回值小于等于父类(可以是子类) 2.抛出的异常小于等于父类 3.访问修饰符(可见性)大于等于父类 4.如果父类方法访问修饰符为private则子类中就不能重写 |
7.抽象类和接口的区别?
不同 | 抽象类 | 接口 |
---|---|---|
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要实现所有的抽象方法 | 子类使用implements关键字来实现接口。实现所有接口中的(抽象)方法 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
访问修饰符 | 抽象类中的方法可以是任意访问修饰符 | 接口方法默认修饰符是public abstract, 并且不允许定义为 private 或者 protected |
多继承 | 一个类最多只能继承一个抽象类 | 一个类可以实现多个接口, 接口可以多继承其他接口 |
字段声明 | 抽象类的字段声明可以是任意的 | 接口的字段默认都是 static 和 final 的 |
设计层面 | 抽象类是对一种事物的抽象,即对类抽象。抽象类是对整个类整体进行抽象,包括属性、行为,抽象类作为很多子类的父类,它是一种模板式设计。 | 接口是对行为的抽象,但是接口却是对类局部(行为)进行抽象,而接口是一种行为规范,它是一种辐射式设计 |
注:JDK 1.8 以后,接口里可以有静态方法和方法体了。
注:JDK 1.8 以后,接口允许包含具体实现的方法,该方法称为"默认方法",默认方法使用 default 关键字修饰。更多内容可参考 Java 8 默认方法。
注:JDK 1.9 以后,允许将方法定义为 private,使得某些复用的代码不会把方法暴露出去。更多内容可参考 Java 9 私有接口方法。
8.java是解释型语言还是编译型语言?
可以认为是半解释型半编译型语言
Java首先由编译器编译成.class类型的文件,这个是java自己类型的文件 然后在通过虚拟机(JVM)从.class文件中读一行解释运行,这也是java可以跨平台的原因,
现在的JVM为了效率,都有一些JIT优化。它又会把.class的二进制代码编译为本地的代码直接运行,所以,又是编译的
9.什么是装箱和拆箱?
- 装箱:基本类型转变为包装器类型的过程(装箱是通过调用包装器类的 valueOf 方法实现的)
int a = 1;
//int装箱的时候自动调用Integer的valueOf(int)方法
Integer b = Integer.valueOf(a);
- 拆箱:包装器类型转变为基本类型的过程(拆箱过程是通过包装类的xxxValue方法实现的)
Integer b = Integer.valueOf(a);
//Integer拆箱的时候自动调用Integer的intValue()方法
int c = b.intValue();
- 自动拆箱与自动装箱
- 直接赋值会自动进行拆箱,装箱操作
//自动装箱
Integer a = 1;
//自动拆箱
int b = a;
- 算数运算时会自动进行拆箱,装箱操作(编译器将自动地插人一条对象拆箱的指令,然后进行自增计算,最后再将结果装箱)
Integer a = 1;
a++;
- 注意:
这些数据被包装到固定的对象中。这些数据被缓存在常量池中,引用指向的地址相同,使用==比较结果为true.
//i==i2 true
Integer i1 = 127;
Integer i2 = 127;
//i3 == i4 fasle
Integer i3 = 128;
Integer i4 = 128;
//b1 == b2 true
Boolean b1 = true;
Boolean b2 = true;
//c1 == c2 true
Character c1 = 'a';
Character c2 = 'a';
//c3 == c4 false
Character c3 = '\uffff';
Character c4 = '\uffff';
10.final、finally、finalize的区别?
- final
- 用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次,且值无法改变。对于成员变量来说,只能在声明时或者构造方法中对它赋值
- 被final修饰的类不可以被继承
- 被final修饰的方法不可以被重写
- 被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的
- finally
- finally 作为异常处理的一部分,它只能在 try/catch 语句中,并且附带一个语句块表示这段语句最终一定被执行(无论是否抛出异常),经常被用在需要释放资源的情况下,System.exit (0) 可以阻断 finally 执行。
- finalize
- finalize 是在 java.lang.Object 里定义的方法,也就是说每一个对象都有这么个方法,这个方法在 gc 启动,该对象被回收的时候被调用。
- 一个对象的 finalize 方法只会被调用一次,finalize 被调用不一定会立即回收该对象,所以有可能调用 finalize 后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会再次调用 finalize 了,进而产生问题,因此不推荐使用 finalize 方法。
最后:创作不易,喜欢的话请给个赞吧,为了保证内容准确查阅了大量的资料,力求严谨准确,如果你也和我一样备战面试,关注我,持续更新,一起加油吧,给努力的自己点个赞!!!
参考资料
书籍:
java核心技术、java编程思想博客:
http://blog.sciencenet.cn/home.php?mod=space&uid=469621&do=blog&id=379622
https://www.cnblogs.com/woyujiezhen/p/12795768.html
https://www.cnblogs.com/weibanggang/p/9455926.html
https://blog.csdn.net/meism5/article/details/89084470