Java面试宝典 1.13~1.31【2020.5 Beta版】
<a name="14cb060b"></a>
1.Java基础
<a name="22b8b366"></a>
1.13 静态变量与实例变量的区别?
静态变量 | 实例变量 | |
---|---|---|
定义 | 使用static关键字声明的 | 实例变量在类中声明,但是在方法,构造函数或其他块之外 |
初始化 | 属于类,只要加载了类的字节码,就会被分配空间 | 必须创建实例对象,才会被分配空间 |
加载次数 | 初始化加载一次 | 每创建一次对象加载一次 |
<a name="3360eeec"></a>
1.14 是否可以从一个static方法内部发出对非static方法的调用?
<br />不可以,static方法调用时不需要创建对象,非static方法的调用需要创建实例,那在这个时刻,就像是你想找对象秀恩爱,你对象还没出生,这不扯呢<br />
<a name="6c5ca606"></a>
1.15 Math.round(1.5)等于多少?Math.round(-1.5)又等于多少?
// Math.round 返回一个四舍五入的值
Math.round(1.5) = 2
Math.round(-1.5) = -1
//
Math.ceil() 向上取整
Math.floor() 向下取整
<a name="74f218ae"></a>
1.16 下面的代码有什么不妥之处?
// 1
if(str.equals("test")){}
// 2
System.out.println(0.1+0.2);
<br />第一个 str 为 null的话会抛出空指针异常,所以改为 "test".equals(str)<br />第二个会输出0.30000000000000004,改成<br />
System.out.println(new BigDecimal(String.valueOf(0.1)).add(new BigDecimal(String.valueOf(0.2))));
<a name="76fb7dfa"></a>
1.17 java中作用域 public,protected,private和默认不写时的区别
作用域 | 说明 |
---|---|
public | 可以被任何类访问 |
protected | 可以被同一包中的所有类访问,被所有子类访问,子类没有在同一包中也可以访问 |
private | 只能够被当前类的方法访问 |
缺省 | 无访问修饰符,可以被同一包中的所有类访问,如果子类没有在同一个包中,也不能访问 |
<a name="2553c675"></a>
1.18 重载与重写的区别
<br />很多,面试的时候就捡简要的说<br />
- 重载在一个类中,重写发生在父子类
- 重载是可以在一个类中有多个重名但参数列表不同,参数列表要个数或数据类型不同,重写则返回值和形参都不能改变
- 重写的方法只能比父类抛出更少的异常,并且访问限制符也只能比父类大<br />
ps: 参数相同,但返回值相同,那不叫重载,错误写法
<br />基本上回答这些就OK<br />扩展:方法的重载与重写都是实现多态的方式,区别是前者是编译时的多态性,后者是运行时的多态性,重写遵循里氏代换原则,就是子类可以扩展父类的功能,但不能改变父类原有的功能<br />
<a name="badee970"></a>
1.19 Integer与int的区别
- Integer是int的包装类,可以为 null 值
- int是8种原始数据类型之一<br />
8种原始数据类型与其包装类型
原始 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
boolean | Boolean |
char | Character |
float | Float |
double | Double |
1.20 构造器Constructor是否可被override?
<br />构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload<br />
<a name="bdd0c610"></a>
1.21 java的接口可以继承接口吗?接口中可以定义静态或者默认方法吗?
<br />java的接口可以继承接口,第二个在jdk8之后也支持了,可以写静态方法体,但是默认方法要用default修饰符<br />
public interface TestInterface implements A,B,C{
static void staticMethod() {
System.out.println("static method");
}
default void defaultMethod() {
System.out.println("default method");
}
}
<a name="dcf93c57"></a>
1.22 抽象类可以实现接口吗?抽象类是否可以继承具体类?抽象类中是否可以有静态main方法?
- 抽象类可以实现接口
- 抽象类可以继承具体类
- 抽象类中可以有静态main方法
<br />抽象类可以实现接口,可以不必须实现接口中的所有方法<br />
<br />抽象类与普通类的区别<br />
- 前者不能实例化
- 前者允许存在抽象方法
- 后者实现接口必须要实现接口中所有方法
<a name="09764d9b"></a>
1.23 clone()有什么作用?
<br />super.clone()<br />拷贝使用<br />
package erdan.demo;
public class TestClone {
public static void main(String[] args) throws CloneNotSupportedException {
Demo demo = new Demo();
demo.a = 1;
demo.b = 2;
Demo demo2 = (Demo) demo.clone();
demo2.a = 100;
System.out.println(demo.a + " " + demo.b);
System.out.println(demo2.a + " " + demo2.b);
}
static class Demo implements Cloneable {
int a;
int b;
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
}
<a name="4e1b36ed"></a>
1.24 面向对象的特征
特征 | 总结 |
---|---|
封装 | 隐藏对象的属性与实现细节,对外提供公开的访问接口 |
抽象 | 将一类对象共同特征总结出来构造类的过程 |
继承 | 从已有类得到继承信息创建新类的过程 |
多态 | 指允许不同子类型的对象对同一消息作出的不同响应 |
<a name="03cf2641"></a>
1.25 Java中实现多态的机制是什么?
<br />答:父类中有方法 fun(),子类B与C分别继承与重写了fun()方法,当创建一个 A a = new B()时,a.fun()调用的是B中的fun(),假若是new C(),那么调用的就是C中的fun()方法,怎么判断使用的是哪个类的fun(),就是动态绑定,这个现象,就是多态<br />
1.26 abstract class 与 interface 有什么区别?
- abstract class可以有构造方法,而interface不行
- 单继承(抽象类),多实现(接口)
- 方法类型:接口只能有抽象方法。抽象类可以具有抽象和非抽象方法。从Java 8开始,接口还可以具有默认方法和静态方法。
- 最终变量:在Java接口中声明的变量默认为final,抽象类可能包含非 final 变量。
- 变量类型:抽象类可以具有 final,非 final,static和非 static 变量。接口只有 static 变量和 final 变量。
- 实现:抽象类可以提供接口的实现。接口无法提供抽象类的实现。
- 继承与抽象:可以使用关键字“ implements”来实现Java接口,而可以使用关键字“ extends”来扩展抽象类。
- 数据成员的可访问性:默认情况下,Java接口的成员是公共的。Java抽象类可以具有private,protected修饰的类成员
- 接口是用来约束类的,抽象类基本是用来代码复用的
1.30 抽象的方法可以是静态的吗?abstract与synchronized可以一起使用吗?
<br />用static声明方法表明这个方法在不生成类的实例时可直接被类调用,而abstract方法不能被调用,所以不能为静态的。<br />synchronized作用在具体的方法上才有意义,所以不行<br />
1.31 什么是内部类?Static Nested Class 与 inner class 不同点?
<br />内部类顾名思义就是在类内部的一个类,内部类中不能定义静态成员<br />Static Nested Class 静态内部类,不依赖于外部实例被实例化,通常的内部类需要在外部实例化后才能实例化。
网友评论