Java面试知识点之Java基础
1、面向对象的特性有哪些?
答:继承、封装、多态
- 封装 隐藏对象的属性和实现细节,对外提供接口访问。
- 继承 子类继承父类,保留父类的属性和方法,并可以进行扩展。
- 多态 不同的对象有相同的行为,但具体执行过程不同。
假设你是个妹子,你有一个男朋友,他帅,会做饭,我不关心为什么他帅,怎么做饭,我让他做饭他就做饭。这就是封装。
假设你是个妹子并且有多个男朋友,男朋友的基本要求是帅,男朋友A是高帅,男朋友B是富帅。这就是继承。
假设你是个妹子并且有多个男朋友,都说要带我去兜风,一个说骑摩拜,一个说坐宝马。这就是多态。
2、面向对象和面向过程的区别?
答:
面向对象是指以对象为中心的编程思想,分析出解决问题的步骤,然后用函数把这些步骤依次实现,使用时依次调用;
面向过程是指以过程为中心的编程思想,把构成问题的事务分解成各个对象,描述某个事务在整个解决问题的步骤中的行为。
3、JDK、JRE和JVM的联系和区别?
答:
JDK(Java Development Kit)是指Java语言的软件开发工具包,包含Java的运行环境(JVM、Java系统类库)和Java工具(编译器、调试器等)。
JRE(Java Runtime Environment)是指Java运行环境,包含JVM+Java系统类库。
JVM(Java Virtual Machine)是指Java虚拟机,当我们运行一个程序时,JVM负责将字节码解释成具体平台上的机器命令。这就是Java的能够“一次编译,到处运行”的原因。
区别:
1)JDK用于开发,JRE用于运行Java程序。
2)JDK和JRE中都包含JVM。
又问:JDK中常用的包有哪些?
答:java.lang、java.util、java.io、java.net、java.sql、java.servlet
4、Java中重写和重载是什么意思?
答:
重写(override)是指子类对父类方法的重写。
重载(overload)是指在同一个类中,方法名一样,但参数列表不同。
又问:那么构成重写的条件有哪些?
答:
1)子类的方法名、参数以及返回值类型必须和所覆盖的方法相同
2)子类方法的访问权限不能比父类小
3)子类方法不能比父类抛出更多的异常
又问:那么构成重载的条件有那些?
答:
1)参数类型不同
2)参数个数不同
3)参数顺序不同。
又问:方法的返回值不同可以构成重载吗?为什么?
答:不可以。因为Java中调用函数并不需要强制给返回值赋值,可能会调用方法而忽略返回值,这时Java无法判断调用哪个方法。
又问:重载是否可以改变返回值的类型?
答:可以。重载本质上是完全不同的方法,只是恰好取了相同的方法名。
5、抽象类和接口的区别有哪些?
答:
- 抽象类是指包含一个或多个抽象方法的类,不能被实例化。
- 接口是指描述具有什么功能,不提供每个功能的具体实现。
待插入
1)使用方式:抽象类只能通过继承(extends)被使用;接口只通过实现(implements)被使用。
2)实现方式:抽象类不仅能通过抽象方法,也能提供实现方法;接口只能提供抽象方法,但Java8中能提供实现方法,前提是方法前加一个default修饰符。
又问:抽象类和接口如何选择?
答:
1)如果要创建不带任何方法定义和成员变量的基类,应选择接口而不是抽象类。
2)如果知道某个类是基类,第一选择应该是让它成为接口,只有在必须有方法定义和成员变量时,才应该选择抽象类。因为抽象类存在一个或多个抽象方法,只要方法没有全部被实现,该类就还是抽象类。
6、Java和C++的区别
相同点:都是面向对象的语言,都支持封装、继承和多态
不同点:
1)指针 Java不提供指针来直接访问内存,C++提供。
2)继承 Java的类是单继承,C++支持多继承;Java是通过一个类实现多个接口来实现C++中的多继承。
3)内存 Java有自动内存管理机制,不需要程序员手动释放。
7、static关键字是什么意思?
答:static关键字表示一个成员变量或成员方法可以在没有所属类的实例变量的情况下被访问。
又问:Java中是否可以重写一个static的方法?
答:不可以。因为方法覆盖是基于运行时动态绑定的,而static方法是编译时动态绑定的,static方法和类的任何实例都不相关,所以概念上不适用。
又问:是否可以从一个static方法内部发出对非static方法的调用?
答:不可以。因为非static方法需要一个具体的实例才能被调用,而调用static时不一定存在一个实例。
8、Java是值传递还是引用传递?
答:值传递。
- 值传递 是指在调用函数时将实际参数复制一份传递给函数,这样在函数中如果对参数进行修改,将不会影响到实际参数。
- 引用传递 是指在调用函数时将实际参数的地址直接传递给函数,这样在函数中如果对参数进行修改,将影响到实际参数。
9、Interger的缓存机制
答:在JVM启动时就缓存了-128到127这个区间的所有数字。
10、下述两种方法分别创建了几个String对象?
// 第一种:直接赋一个字面量 String str1 = "ABCD"; // 第二种:通过构造器创建 String str2 = new String("ABCD");
答:
String str1 = "ABCD"; 不创建或创建一个String对象。如果常量池中存在"ABCD",则直接引用,不创建String对象。如果不存在,则先创建String对象,再引用。
String str2 = new String("ABCD"); 创建一个或两个String对象。因为new关键字一定会创建一个对象。
11、++i 和i++的区别
答:
++都是先将变量的值加1,然后才继续运算的。
区别:前置++是将变量的值+1后,使用增值后的变量进行运算的,而后置++是首先将变量赋值给一个临时变量,然后用临时变量进行运算。
12、交换整型变量的三种方式
答:
1)通过第三个变量交换数值
class TestEV //创建一个类 { public static void main(String[]args) { int x =5,y=10; //定义两个变量 int temp = x; //定义第三临时变量temp并提取x值 x = y; //把y的值赋给x y = temp; //然后把临时变量temp值赋给y System.out.println("x="+x+"y="+y); } }
2)通过相加的方式,弊端在于如果 x 和 y 的数值过大的话,超出 int 的值会损失精度。
class TestEV //创建一个类 { public static void main(String[]args) { int x =5,y=10; //定义两个变量 x = x + y; //x(15) = 5 + 10; y = x - y; //y(5) = x(15) - 10; x = x - y; //x(10) = x(15) - y(5) System.out.println("x="+x+"y="+y); } }
3)通过异或的方式,一个数异或同一个数两次,结果还是那个数,而且不会超出int范围
class TestEV //创建一个类 { public static void main(String[]args) { int x =5,y=10; //定义两个变量 x = x^y; y = x^y; //y=(x^y)^y x = x^y; //x=(x^y)^x System.out.println("x="+x+"y="+y); } }
13、Java对象初始化顺序
答:不考虑静态成员的初始化,调用一个对象的构造函数时,程序先调用父类的构造函数,之后静态成员变量的初始化函数和静态初始化块则按照在代码当中的顺序执行,成员变量如果没有指定值则赋予默认值,也就是基本类型0、false、对象null,最后调用自身构造函数。
public class Derive extends Base { private Member m1 = new Member("Member 1"); { System.out.println("Initial Block()"); } public Derive() { System.out.println("Derive()"); } private Member m2 = new Member("Member 2"); private int i = getInt(); private int getInt() { System.out.println("getInt()"); return 2; } public static void main(String[] args) { new Derive(); } } class Base { public Base() { System.out.println("Base()"); } } class Member { public Member(String m) { System.out.println("Member() "+m); } }
程序的输出结果是: Base() Member() Member 1 Initial Block() Member() Member 2 getInt() Derive()
14、true、false、null、goto、const是关键字吗?
答:
true、false不是关键字,是布尔类型的常量。
null不是关键字,是引用类型的常量。
goto和const是保留关键字,没有实际意义。
15、exception和error有什么区别?
相同点:
exception和error都实现了Throwable接口。
不同点:
exception是指代码逻辑的异常,比如下标越界OutOfIndexException。
error是JVM层面的错误,比如内存不足OutOfMemoryError。
16、throw和throws有什么区别?
throws 用在方法声明上面,表示该方法有可能抛出某个异常,多个异常是用逗号分隔的。
throw 抛出一个指定的异常。