欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java-2020年最全面试题-基础篇(1)【附答案】

程序员文章站 2022-04-11 19:02:42
...

1 说一说面向对象的特征

封装,继承,多态和抽象

封装

封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在 Java 当中,有 3 种修饰符: public, private 和 protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。

下面列出了使用封装的一些好处:

  1. 通过隐藏对象的属性来保护对象内部的状态。
  2. 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。
  3. 禁止对象之间的不良交互,提高模块化继承

继承

给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。

多态

多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。

抽象

抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。

Java 支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。

2 重载和重写的区别

override(重写)

  1. 方法名、参数、返回值相同。

  2. 子类方法不能缩小父类方法的访问权限。

  3. 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。

  4. 存在于父类和子类之间。

  5. 方法被定义为final不能被重写。

overload(重载)

  1. 参数类型、个数、顺序至少有一个不相同。

  2. 不能重载只有返回值不同的方法名。

  3. 存在于父类和子类、同类中。

Java-2020年最全面试题-基础篇(1)【附答案】
image.png

3 抽象类和接口有什么区别

接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的

而抽象类是可以有私有方法或私有变量的

实现接口的一定要实现接口里定义的所有方法,

而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最*的是接口,然后是抽象类实现接口,最后才到具体类实现。

接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。

4 说说反射的用途及实现

Java反射机制主要提供了以下功能:在运行时构造一个类的对象;判断一个类所具有的成员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架

Java反射的主要功能:

  1. 确定一个对象的类
  2. 取出类的modifiers,数据成员,方法,构造器,和超类.
  3. 找出某个接口里定义的常量和方法说明.
  4. 创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).
  5. 取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.
  6. 在运行时刻调用动态对象的方法.
  7. 创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.

反射的应用很多,很多框架都有用到

spring 的 ioc/di 是反射….

javaBean和jsp之间调用也是反射….

struts的 FormBean 和页面之间…也是通过反射调用….

JDBC 的 classForName()也是反射…..

hibernate的 find(Class clazz) 也是反射….

5 int 和 Integer 有什么区别

int 是基本数据类型

Integer是其包装类,注意是一个类。

为什么要提供包装类呢???

一是为了在各种类型间转化,通过各种方法的调用。否则 你无法直接通过变量转化。 比如,现在int要转为String

int a=0;
String result=Integer.toString(a);

在java中包装类,比较多的用途是用在于各种数据类型的转化中。

//通过包装类来实现转化的

int num=Integer.valueOf("12");
int num2=Integer.parseInt("12");
double num3=Double.valueOf("12.2");
double num4=Double.parseDouble("12.2");

//其他的类似。通过基本数据类型的包装来的valueOf和parseXX来实现String转为XX

String a=String.valueOf("1234");//这里括号中几乎可以是任何类型
String b=String.valueOf(true);
String c=new Integer(12).toString();//通过包装类的toString()也可以
String d=new Double(2.3).toString();

再举例下。比如我现在要用泛型

List nums;

这里<>需要类。如果你用int。它会报错的。

6 说说&和&&的区别

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str!= null&& !str.equals(s))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 &++y>0) y会增长,If(x==33 && ++y>0)不会增长

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

7 short s1= 1; s1 = (s1+1是int类型,而等号左边的是short类型,所以需要强转)1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?(没有错)

对于short s1= 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

对于short s1= 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

8 静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

9 char型变量中能不能存贮一个中文汉字?为什么?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

10 用最有效率的方法算出2乘以8等於几?

2<< 3,(左移三位)因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2<< 3。

Java-2020年最全面试题-基础篇(1)【附答案】
image.png