java开发岗高频面试题全解析,java面试高频知识点_1

  java开发岗高频面试题全解析,java面试高频知识点

  如何解决写爬虫IP受阻的问题?立即使用。

  一、是否可以从一个static方法内部发出对非static方法的调用?

  (视频教程推荐:java课程)

  你不能。因为非静态方法与对象相关联,所以必须在对对象进行方法调用之前创建对象。但是,静态方法可以直接调用,无需创建对象。也就是说,当调用静态方法时,可能还没有创建实例对象。如果从静态方法调用非静态方法,那么该非静态方法与哪个对象相关联?这个逻辑不能成立,所以静态方法在内部发出对非静态方法的调用。

  二、Integer与int的区别

  Int java是八种原始数据类型之一。Java为每个原语类型提供了一个封装类,Integer是Java为int提供的封装类。int的缺省值是0,而Integer的缺省值是null,也就是Integer可以区分一个未赋值的值和一个0的值,而int不能表达未赋值的情况。

  比如你想表达不参加考试和分数为0的区别,只能用整数。在JSP开发中,Integer的默认值为null,所以在文本框中使用el表达式显示时,值为空字符串,而int的默认值为0,所以在文本框中使用el表达式显示时,结果为0。因此,int不适合作为web层中表单数据的类型。

  在Hibernate中,如果OID被定义为整数类型,那么Hibernate可以根据其值是否为null来判断一个对象是否是临时的。如果OID定义为int类型,则需要在hbm映射文件中将它的未保存值属性设置为0。

  此外,integer提供了几个与整数相关的运算方法,例如,将一个字符串转换为整数,在Integer中定义了代表整数最大值和最小值的常数。

  三、Math.round(11.5)等於多少?Math.round(-11.5)等于多少?

  数学课提供了三种与舍入相关的方法:ceil、floor和round,它们的作用与其英文名的含义相对应。

  比如ceil的英文意思是ceiling,意思是四舍五入。Math.ceil(11.3)的结果是12,而Math的结果。CEIL (-11.3)是-11;floor的英文意思是floor,意思是四舍五入。Math.ceil(11.6)的结果是11,而Math的结果。Ceil (-11.6)是-12。最难掌握的是圆周率法,意思是“四舍五入”。算法是Math.floor(x 0.5),即原数加0.5后向下取整。所以Math.round(11.5)的结果是12,Math.round(-11.5)的结果是-11。

  这里有一些笔误。floor的英文意思是floor,意思是四舍五入。Math.floor(11.6)的结果是11,而Math的结果。楼层(-11.6)为-12;

  (更多相关面试问题推荐:java面试问答)

  四、Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型?

  Overload的意思是重载,Override的意思是覆盖,也就是重写。

  重载是指在同一个类中可以有多个同名的方法,但这些方法的参数列表是不同的(即参数的数量或类型不同)。

  Override意味着子类中方法的名称和参数可以与父类中方法的名称和参数完全相同。当这个方法被子类创建的实例对象调用时,子类中定义的方法就会被调用,相当于重写了父类中定义的完全相同的方法,这也是面向对象编程多态性的一种表现。当子类重写父类的方法时,只能抛出比父类更少的异常,也可以是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,但不能出现比父类更多的问题。子类的访问权限只能大于父类,不能小于父类。如果父类的方法是私有类型,那么子类就没有重写限制,相当于给子类添加了一个全新的方法。

  至于重载的方法能不能改变返回值的类型,就看你真正想问的是什么了。这个话题很模糊。如果几个重载方法的参数列表不同,它们的返回器类型也可以不同。但我猜你想问的问题是:如果两个方法的参数表完全一样,是否可以让它们的返回值不一样来实现重载?这可不行。我们可以用反证的方法来说明这个问题,因为有时候我们可以在不定义返回结果变量的情况下调用一个方法,也就是不关心它的返回结果。

  例如,当我们调用map.remove(key)方法时,虽然remove方法有返回值,但我们通常不会定义接收返回结果的变量。此时,假设这个类中有两个方法具有完全相同的名称和参数列表。只是因为返回类型不同,java无法确定程序员真正想调用哪个方法,因为无法通过返回的结果类型来判断。

  Override可以翻译成override。从字面上看,它覆盖了一个方法,并重写它以实现不同的功能。对我们来说,最熟悉的内容是接口方法的实现。一般只有方法是在接口中声明的,我们在实现它们的时候,需要实现接口声明的所有方法。除了这种典型的用法,我们还可以在继承过程中在子类中覆盖父类中的方法。覆盖时注意以下几点:

  1.被覆盖方法的logo必须与被覆盖方法的logo完全匹配,才能达到覆盖的效果;

  2.被覆盖方法的返回值必须与被覆盖方法的返回值一致;

  3.被覆盖方法抛出的异常必须与被覆盖方法或其子类抛出的异常一致;

  4.被覆盖的方法不能是私有的,否则只是在子类中定义了一个新方法,并没有覆盖它。

  过载可能我们都很熟悉,可以翻译为超载。意思是我们可以定义一些同名的方法,通过定义不同的输入参数来区分,然后在调用的时候,VM会根据不同的参数风格选择合适的方法来执行。使用重载时,请注意以下几点:

  1.使用重载时,只能使用不同的参数样式。比如参数类型不同,参数个数不同,参数顺序不同(当然同一个方法中的几个参数类型肯定是不同的,比如fun(int,float),而不是Fun (int,int));

  2.重载不能通过访问权限、返回类型和抛出异常来完成;

  3.方法中异常的类型和数量不会影响重载;

  4.对于继承,如果一个方法在父类和priavte中有访问权限,它不能在子类中重载。如果定义了,也只是定义了一个新的方法,不会达到重载的效果。

  五、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?

  接口可以继承接口。抽象类可以实现接口,抽象类可以继承具体类。抽象类中可以有静态的main方法。

  备注:只要你了解接口和抽象类的本质和功能,这些问题都很好回答。想想吧。如果你是java语言的设计者,你会提供这样的支持吗?如果没有,有什么原因吗?如果你没有理由不提供,那么答案是肯定的。

  只要记住抽象类和普通类的唯一区别就是不能创建实例对象,不能允许抽象方法。

  六、Java中实现多态的机制是什么?

  父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法是在运行时动态绑定的,即引用变量指向的具体实例对象的方法,也就是运行在内存中的对象的方法,而不是引用变量的类型中定义的方法。

  七、abstractclass和interface语法上有什么区别?

  1.抽象类可以有构造函数,但是接口不能有构造函数。

  2.抽象类中可以有普通成员变量,但接口中没有普通成员变量。

  3.抽象类可以包含非抽象的公共方法。接口中的所有方法都必须是抽象的,不能有非抽象的公共方法。

  4.抽象类中抽象方法的访问类型可以是公共的、受保护的和(默认类型,尽管

  Eclipse不报错,应该也不行),但是接口中的抽象方法只能是public类型,默认是public抽象类型。

  5.静态方法可以包含在抽象类中,但不能包含在接口中。

  6.抽象类和接口都可以包含静态成员变量。抽象类中静态成员变量的访问类型可以是任意的,但是接口中定义的变量只能是publicstatic final类型,这是默认类型。

  7.一个类可以实现多个接口,但它只能继承一个抽象类。

  (相关教程推荐:java入门教程)

  八、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

  抽象方法不能是静态的,因为抽象方法是要被子类实现的,静态和子类无关!

  原生方法是指方法要用另一种平台相关的编程语言实现,不存在被子类实现的问题。所以不能抽象,不能和抽象混为一谈。比如FileOutputSteam类要处理硬件,底层实现使用操作系统相关的api实现;比如在windows中,是用C语言实现的。所以查看jdk的源代码,可以发现FileOutputStream的open方法的定义如下:

  private native void open(string name)throwsFileNotFoundException;

  如果我们想用java调用别人写的C语言函数,不能直接调用。我们需要按照java的要求写一个C语言函数,我们的C语言函数调用别人的C语言函数。因为我们的C语言函数是按照java的要求编写的,所以我们的C语言函数可以和java对接。java那边的对接方法就是定义我们C函数对应的方法。java中对应的方法不需要写具体的代码,但是需要在前面声明native。

  至于synchronized和abstract结合的问题,我觉得也不可能,因为我在多年的学习和开发中,从来没有见过这样的情况,我觉得synchronized作用在具体的方法上是有意义的。而且方法上同步的同步使用的同步锁对象就是这个,但是抽象方法无法确定这是什么。

  九、内部类可以引用它的包含类的成员吗?有没有什么限制?

  绝对的。如果不是静态内部类,就没有限制!

  如果将静态嵌套类视为内部类的特例,那么在这种情况下不能访问外部类的普通成员变量,只能访问外部类的静态成员,例如下面的代码:

  外部类

  {

  静态int x;

  静态内部类

  {

  无效测试()

  {

  syso(x);

  }

  }

  }十、String s = "Hello";s = s + "world!";这两行代码执行后,原始的String对象中的内容到底变了没有?

  不会。因为String被设计为不可变的类,所以它的所有对象都是不可变的对象。这段代码中,s最初指向的是一个内容为‘Hello’的String对象,然后我们对s进行了操作,那么s指向的对象有变化吗?答案是没有。此时,s并不指向原对象,而是指向另一个内容为‘Hello world!’的字符串对象原来对象还存在于内存中,只是引用变量S不再指向它了。

  通过上面的解释,我们很容易得出另一个结论。如果字符串被频繁地以各种方式修改,或者换句话说,不可预见的修改,那么使用字符串来表示字符串将导致巨大的内存开销。因为String对象建立后就不能更改了,所以每个不同的字符串都需要一个String对象来表示。此时,您应该考虑使用StringBuffer类,它允许修改,而不是为每个不同的字符串生成一个新的对象。而且,这两种对象之间的转换非常容易。

  同时,我们也可以知道,如果我们想使用一个内容相同的字符串,我们不必每次都创建一个新的字符串。例如,如果我们想在构造函数中初始化一个名为s的字符串引用变量,并将其设置为初始值,我们应该这样做:

  公开课演示{

  私有字符串s;

  .

  公开演示{

  s=初始值;

  }

  .

  }而不是

  s=新字符串(“初始值”);后者每次生成一个新对象都会调用构造函数,性能低,内存开销大,没有意义。因为String对象不可更改,所以只需要一个String对象来表示内容相同的字符串。也就是说上面的构造函数被多次调用创建多个对象,它们的字符串属性S都指向同一个对象。

  上述结论也是基于这样一个事实,对于字符串常量,如果内容相同,Java认为它们表示的是同一个字符串对象。并且用关键字new调用构造函数总是会创建一个新的对象,不管内容是否相同。

  至于为什么把String类设计成不可变的,这是由其用途决定的。其实不仅仅是String,Java标准类库中的很多类都是不可变的。在开发系统时,我们有时需要设计不可变的类来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问不会有什么问题。当然,也有一些缺点,比如每个不同的状态都必须用一个对象来表示,这可能会导致性能问题。所以Java标准类库也提供了一个可变版本,即StringBuffer。以上是java高频基础面试题的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: