设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Java面试过程中10个最难回答的面试题(附答案)(8)

发布时间:2019-08-05 12:09 所属栏目:21 来源:IT技术分享
导读:1。Producer线程测试条件(缓冲区是是否完整)并确认必须等待(找到缓冲区已满)。 Consumer线程在使用缓冲区中的元素后设置条件。 Consumer线程调用notify()方法; 这是闻所未闻的,因为Producer线程还没有等待。 Produ

1。Producer线程测试条件(缓冲区是是否完整)并确认必须等待(找到缓冲区已满)。

  1. Consumer线程在使用缓冲区中的元素后设置条件。
  2. Consumer线程调用notify()方法; 这是闻所未闻的,因为Producer线程还没有等待。
  3. Producer线程调用wait()方法并进入等待状态。

因此,由于竞争条件,我们可能会丢失通知,如果我们使用缓冲区或只使用一个元素,生产线程将永远等待,你的程序将挂起。“在java同步中等待notify和notifyall现在让我们考虑如何解决这个潜在的竞争条件?这个竞争条件通过使用Java提供的synchronized关键字和锁定来解决。为了调用wait(),notify()或notifyAll(在Java中,我们必须获得对我们调用方法的对象的锁定。由于Java中的wait()方法在等待之前释放锁定并在从wait()返回之前重新获取锁定方法,我们必须使用这个锁来确保检查条件(缓冲区是否已满)和设置条件(从缓冲区获取元素)是原子的,这可以通过在Java中使用synchronized方法或块来实现。

我不确定这是否是面试官实际期待的,但这个我认为至少有意义,请纠正我如果我错了,请告诉我们是否还有其他令人信服的理由调用wait(),notify()或Java中的notifyAll方法。总结一下,我们用Java中的synchronized方法或synchronized块调用Java中的wait(),notify()或notifyAll方法来避免:1)Java中的IllegalMonitorStateException,如果我们不调用wait(),notify()或者来自同步上下文的notifyAll()方法。2)Java中wait和notify方法之间的任何潜在竞争条件。

10.你能用Java覆盖静态方法吗?如果我在子类中创建相同的方法是编译时错误?

不,你不能在Java中覆盖静态方法,但在子类中声明一个完全相同的方法不是编译时错误,这称为隐藏在Java中的方法。

你不能覆盖Java中的静态方法,因为方法覆盖基于运行时的动态绑定,静态方法在编译时使用静态绑定进行绑定。虽然可以在子类中声明一个具有相同名称和方法签名的方法,看起来可以在Java中覆盖静态方法,但实际上这是方法隐藏。Java不会在运行时解析方法调用,并且根据用于调用静态方法的 Object 类型,将调用相应的方法。这意味着如果你使用父类的类型来调用静态方法,那么原始静态将从父类中调用,另一方面如果你使用子类的类型来调用静态方法,则会调用来自子类的方法。简而言之,你无法在Java中覆盖静态方法。如果你使用像Eclipse或Netbeans这样的Java IDE,它们将显示警告静态方法应该使用类名而不是使用对象来调用,因为静态方法不能在Java中重写。

  1. /** 
  2.  * 
  3.  * Java program which demonstrate that we can not override static method in Java. 
  4.  * Had Static method can be overridden, with Super class type and sub class object 
  5.  * static method from sub class would be called in our example, which is not the case. 
  6.  */ 
  7. public class CanWeOverrideStaticMethod {   
  8.  public static void main(String args[]) { 
  9.  Screen scrn = new ColorScreen();   
  10.  //if we can override static , this should call method from Child class 
  11.  scrn.show(); //IDE will show warning, static method should be called from classname  
  12.  }  
  13. class Screen{  
  14.  /* 
  15.  * public static method which can not be overridden in Java 
  16.  */ 
  17.  public static void show(){ 
  18.  System.out.printf("Static method from parent class"); 
  19.  } 
  20. class ColorScreen extends Screen{ 
  21.  /* 
  22.  * static method of same name and method signature as existed in super 
  23.  * class, this is not method overriding instead this is called 
  24.  * method hiding in Java 
  25.  */ 
  26.  public static void show(){ 
  27.  System.err.println("Overridden static method in Child Class in Java"); 
  28.  } 

输出:

此输出确认你无法覆盖Java中的静态方法,并且静态方法基于类型信息而不是基于Object进行绑定。如果要覆盖静态mehtod,则会调用子类或 ColorScreen 中的方法。这一切都在讨论中我们可以覆盖Java中的静态方法。我们已经确认没有,我们不能覆盖静态方法,我们只能在Java中隐藏静态方法。创建具有相同名称和mehtod签名的静态方法称为Java隐藏方法。IDE将显示警告:"静态方法应该使用类名而不是使用对象来调用", 因为静态方法不能在Java中重写。

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读