常问面试题总结(JAVA基础篇)

byte、short、int型的数据和char型数据做运算,结果是什么类型?
byte,short,char三者之间做运算,结果都是int型

方法的重载和重写的区别:
重载:“两同一不同”,同一个类同一个方法名,不同的形参列表。从编译和运行的角度看,这些同名的方法成了不同的方法.它们的调用地址在编译器就绑定了.所以对于重载而言,在方法调用前,编译器就知道了所要调用的方法.这称为"静态绑定".
重写:“两同一小一大一子” , 方法名形参列表必须相同(相同后编译器就会认为子类想重写父类的方法),子类重写的方法的权限大于或等于父类的权限(子类不能重写private方法),子类重写的方法的返回值必须和父类的返回值一致或其子类,子类重写父类的方法的异常小于等于父类抛出的异常.而对于多态而言,只有等到调用方法的那一刻,编译器才知道所要调用哪个具体方法,这称为"动态绑定".其中父类和子类的方法都不能是static方法,同名同参的static方法不认为是重写.

方法参数的值传递机制:
如果方法的形参是基本数据类型,那么实参传递给形参的就是“数据值”,在该方法中操作这个形参不影响传递进来的那个数据;
如果方法的形参是引用数据类型,那么实参传递给形参的就是“地址值”,在该方法中操作这个形参就会影响传递进来的那个数据;

四种权限修饰符的作用范围?private、缺省、protected、public
private:同一个类中可见
缺省:同一个包中可见
protected:不同包的子类可见
public:整个项目中都可见
其中,四种权限修饰符都可以修饰类的内部结构(属性、方法、构造器、内部类);但是修饰类的class只能使用public 和 缺省。

属性赋值的先后顺序(①默认初始化值,②显示初始化值,③构造器中,④set中,⑤代码块中赋值):
① === > ② / ⑤ 谁在上面谁先 === > ③ === > ④

main方法里面的输出语句和静态代码块里面的输出语句谁先输出?
静态代码块里的先输出,因为main方法本身是一个方法,也需要通过类去掉,类必须得先加载到内存中,而类加载的同时静态代码块已经执行,main方法还需要类去进一步调用才会执行.

为什么继承了父类之后,子类就会得到父类的属性和方法?
因为我们通过子类的构造器创建子类对象时,我们一定会直接或者间接的加载他所有父类的构造器,直到调用了Object类的空参构造器为止.正因为加载了所有的父类的构造器,所有才能在内存中看到父类的结构,子类对象才可以考虑进行调用.

多态的应用举例:
①很多方法(如equals() )形参为Object类型,如果没有多态,把子类进行填充那将毫无意义
②Java连接数据库时只对外暴漏了简单的接口如java.sql.Driver;java.sql.Connection,但真正连接 的时候并不知道要连哪个数据库,因此需要有多态性,使数据库厂商去实现java的接口,实例化时得到的连接对象是哪个数据库的,就调用哪个数据库的结构.

多态性并不适用与属性:
子类继承父类后,如果定义了和父类同名的属性,则对父类进行了属性的隐藏,而子类定义和父类同名同参的方法后,是对父类的方法进行了重写;在多态的情况下,父类调用同名方法时会调用子类重写的方法,而调用同名属性时只会调用自己的属性.

对于多态而言,这个对象实际是什么类型的?
实际上这个对象的类型为new之后的类型,但是因为声明的是父类,所以只能看见父类的结构和子类重写父类后的方法.

	Object o1 = new Integer(1);
	System.out.println(o1);//1
	Object o2 = new Object();
	System.out.println(o2);//java.lang.Object@15db9742

==和equals()的区别:
==:只要使用等等,那么就是比较的地址值.
没重写equals之前,==和equals()一致,比较引用数据类型时比较的都是地址值.
重写equals()后,比较的就是两个对象的属性值是否都相等.

包装类和string的相互转换:
包装类 === > string : 调用String类的静态方法valueOf();
String === > 包装类 : 调用包装类的静态方法parseXxx();

数组属于类吗?也继承于Object吗?
是的,数组.getClass()后可以看出数组的类型是"[+数据类型" , 另外数组可以直接赋值给形参为Object类型的方法,继承于Object类.

饿汉式单例模式和懒汉式单例模式的区别?
饿汉式:线程安全,但是对象加载时间过长.
懒汉式:线程不安全,但是对象延时加载,不会浪费内存.

final关键字可以修饰什么?分别代表什么?
可以修饰类,方法,变量;修饰类代表该类不可被继承;修饰方法代表该方法不可被重写;修饰属性代表该属性是一个常量,可以对该属性赋值的位置有①显示初始化②构造器中初始化③代码块中初始化;修饰局部变量代表该变量是一个常量,一旦赋值后就只能在该方法体内使用该常量,但不能再修改.

native关键字修饰方法时代表什么?
native关键字修饰的方法一般没有方法体,调用该方法时会去底层调用本地的c或c++代码去完成对应的功能,一般隐藏了不对外开放.

static方法可以被重写吗?
不行,父类和子类定义同名同参的方法时,编译器会认为这是两个方法,不认为是重写.

接口和抽象类的区别:
接口:jdk7之前:接口里面只能定义全局常量和抽象方法;jdk8之后接口里面可以定义静态方法和默认方法.抽象类里面既能写抽象方法又能写非抽象方法.
接口中不能定义构造器,抽象类可以
接口多继承,抽象类单继承

throw 和 throws区别:
throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。
throws 属于异常处理的一种方式,声明在方法的声明处。

你可能感兴趣的:(面试题,java,多态,设计模式,编程语言,jdk)