java面试题及答案---2018核心Java面试问题与解答(二)

2018-11-02 10:49:15 查看次数 614 分类: 面试题及技巧>java面试题 | 文章来源:http://www.ifx666.cn

摘要内容:java面试题及答案---2018核心Java面试问题与解答(二)


  1. 什么是界面?

    接口是java编程语言的核心部分,不仅在JDK中使用了很多,而且在Java设计模式,大多数框架和工具中都使用了很多。接口提供了一种在java中实现抽象的方法,用于定义要实现的子类的契约。

    接口适用于在我们的代码中定义Type并创建顶级层次结构的起点。由于java类可以实现多个接口,因此在大多数情况下最好将接口用作超类。

  2. 什么是抽象类?

    在java中使用抽象类来创建一个类,其中包含一些子类的默认方法实现。抽象类可以有没有body的抽象方法,也可以有实现的方法。

    abstract关键字用于创建抽象类。抽象类无法实例化,主要用于为子类提供扩展和实现抽象方法的基础,并覆盖或使用抽象类中实现的方法。

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

    abstract关键字用于创建抽象类,而interface是接口的关键字。

    抽象类可以有方法实现,而接口则不能。

    一个类只能扩展一个抽象类,但它可以实现多个接口。

    如果它有main()方法我们可以运行抽象类,而我们不能运行接口

  4. 接口可以实现还是扩展另一个接口?

    接口不实现另一个接口,它们扩展它。由于接口不能具有方法实现,因此不存在钻石问题。这就是我们在接口中有多重继承的原因,即接口可以扩展多个接口。

    从Java 8开始,接口可以具有默认方法实现。因此,当在多个接口中存在公共默认方法时,为了处理菱形问题,必须在实现它们的类中提供该方法的实现。

  5. 什么是Marker界面?

    标记接口是一个空接口,没有任何方法,但用于强制Java实现类的某些功能。一些众所周知的标记接口是Serializable和Cloneable。

  6. 什么是包装类?

    Java包装类是java中八种基本类型的Object表示。java中的所有包装类都是不可变的和final。Java 5自动装箱和拆箱允许在原始类型及其相应的包装类之间轻松转换。

  7. 什么是Java中的Enum?

    Enum是在Java 1.5中引入的一种新类型,其字段由固定的常量集组成。例如,在Java中,我们可以创建Direction作为枚举,其中固定字段为EAST,WEST,NORTH,SOUTH。

    enum是创建枚举类型并类似于类的关键字。枚举常量是隐式静态和最终的。

  8. 什么是Java注释?

    Java Annotations提供有关代码的信息,它们对它们注释的代码没有直接影响。注释在Java 5中引入。注释是关于程序本身嵌入的程序的元数据。它可以由注释解析工具或编译器解析。我们还可以将注释可用性指定为仅编译时间或直到运行时。Java内置注释是@ Override,@ Deprecated和@SuppressWarnings

  9. 什么是Java Reflection API?为什么这么重要?

    Java Reflection API提供了检查和修改Java应用程序的运行时行为的功能。我们可以检查java类,接口,枚举并获取它们的方法和字段详细信息。Reflection API是一个高级主题,我们应该在正常的编程中避免它。Reflection API的使用可以通过调用私有构造函数(即违反访问修饰符规则)来破坏Singleton 模式设计模式

    尽管我们在正常编程中不使用Reflection API,但它非常重要。我们不能有任何框架,如Spring,Hibernate或服务器,如Tomcat,没有Reflection API的JBoss。它们调用适当的方法并通过反射API实例化类,并将其用于其他处理。

  10. java中的组成是什么?

    组合是在类中实现has-a关系的设计技术。我们可以使用Object组合来重用代码。

    通过使用引用其他对象的实例变量来实现Java组合。使用组合的好处是我们可以控制其他对象对客户端类的可见性,并仅重用我们需要的东西。

  11. 组合优于继承有什么好处?

    Java编程的最佳实践之一是“支持组合优于继承”。一些可能的原因是:

    • 即使我们可能没有使用超类方法,超类中的任何更改都可能会影响子类。例如,如果我们在子类中有一个方法test(),并且突然有人在超类中引入了一个方法test(),我们将在子类中得到编译错误。组合将永远不会面临这个问题,因为我们只使用我们需要的方法。
    • 继承将所有超类方法和变量暴露给客户端,如果我们无法控制设计超类,则可能导致安全漏洞。组合允许我们提供对方法的限制访问,因此更安全。
    • 我们可以在组合中获得运行时绑定,其中继承在编译时绑定类。因此,组合为调用方法提供了灵活性。
  12. 如何在Java中对自定义对象的集合进行排序?

    我们需要实现Comparable接口以支持对集合中的自定义对象进行排序。可比较的接口具有compareTo(T obj)方法,该方法由排序方法使用并通过提供此方法实现,我们可以提供默认方式来对自定义对象集合进行排序。

    但是,如果要根据不同的条件进行排序,例如根据工资或年龄对Employees集合进行排序,那么我们可以创建Comparator实例并将其作为排序方法传递。

  13. 什么是java中的内部类?

    我们可以在类中定义一个类,它们被称为嵌套类。任何非静态嵌套类都称为内部类。内部类与类的对象相关联,并且它们可以访问外部类的所有变量和方法。由于内部类与实例相关联,因此我们不能在其中包含任何静态变量。

    我们可以在类中包含本地内部类或匿名内部类。

  14. 什么是匿名内部类?

    没有名称的本地内部类称为匿名内部类。匿名类在单个语句中定义和实例化。匿名内部类总是扩展类或实现接口。

    由于匿名类没有名称,因此无法为匿名类定义构造函数。匿名内部类只能在定义它的位置访问。

  15. 什么是Java中的Classloader?

    Java Classloader是在我们想要访问任何类时将字节代码程序加载到内存中的程序。我们可以通过扩展ClassLoader类并重写loadClass(String name)方法来创建自己的类加载器。

  16. 什么是不同类型的类加载器?

    Java中有三种类型的内置类加载器:

    1. Bootstrap类加载器 - 它加载JDK内部类,通常加载rt.jar和其他核心类。
    2. 扩展类加载器 - 它从JDK扩展目录加载类,通常是$ JAVA_HOME / lib / ext目录。
    3. System Class Loader - 它从当前类路径加载类,可以在使用-cp或-classpath命令行选项调用程序时设置这些类。
  17. 什么是java中的三元运算符?

    Java三元运算符是唯一采用三个操作数的条件运算符。它是if-then-else语句的单行代码替换,并在java编程中使用了很多。我们可以使用三元运算符if-else条件甚至使用嵌套三元运算符来切换条件。

  18. 超级关键字有什么作用?

    当您重写子类中的方法时,super关键字可用于访问超类方法。

    我们可以使用super关键字来调用子类构造函数中的超类构造函数,但在这种情况下,它应该是构造函数方法中的第一个语句。

    
    package com.journaldev.access;
    
    public class SuperClass {
    
    	public SuperClass(){
    	}
    	
    	public SuperClass(int i){}
    	
    	public void test(){
    		System.out.println("super class test method");
    	}
    }
    

    在下面的子类实现中可以看到super关键字的使用。

    
    package com.journaldev.access;
    
    public class ChildClass extends SuperClass {
    
    	public ChildClass(String str){
    		//access super class constructor with super keyword
    		super();
    		
    		//access child class method
    		test();
    		
    		//use super to access super class method
    		super.test();
    	}
    	
    	@Override
    	public void test(){
    		System.out.println("child class test method");
    	}
    }
  19. 什么是休息和继续声明?

    我们可以使用break语句来终止for,while或do-while循环。我们可以在switch语句中使用break语句来退出switch case。您可以在java break中看到break语句的示例我们可以使用break with label来终止嵌套循环。

    continue语句跳过for,while或do-while循环的当前迭代。我们可以使用带有标签的continue语句来跳过最外层循环的当前迭代。

  20. 这个关键字是什么?

    this关键字提供对当前对象的引用,它主要用于确保使用对象变量,而不是具有相同名称的局部变量。

    
    //constructor
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    

    我们也可以使用this关键字从构造函数中调用其他构造函数。

    
    public Rectangle() {
        this(0, 0, 0, 0);
    }
    public Rectangle(int width, int height) {
        this(0, 0, width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
  21. 什么是默认构造函数?

    没有参数的构造函数被称为默认构造函数。当我们没有为类定义任何构造函数时,java编译器会自动为该类创建默认的no-args构造函数。如果定义了其他构造函数,则编译器不会为我们创建默认构造函数。

  22. 我们可以尝试没有阻挡块吗?

    是的,我们可以使用try-finally语句,从而避免阻塞。

  23. 什么是垃圾收集?

    垃圾收集是查看堆内存,识别正在使用哪些对象以及未使用哪些对象以及删除未使用对象的过程。在Java中,解除分配内存的过程由垃圾收集器自动处理。

    我们可以使用代码运行垃圾收集器Runtime.getRuntime().gc()或使用实用程序方法System.gc()

  24. 什么是序列化和反序列化?

    我们可以将Java对象转换为名为Serialization的Stream。将对象转换为Stream后,可将其保存到文件或通过网络发送或用于套接字连接。

    该对象应该实现Serializable接口,我们可以使用java.io.ObjectOutputStream将对象写入文件或任何OutputStream对象。

    将通过序列化创建的流数据转换为Object的过程称为反序列化。

  25. 如何通过命令提示符运行JAR文件?

    我们可以使用java命令运行jar文件,但它需要jar清单文件中的Main-Class条目。Main-Class是jar的入口点,由java命令用于执行该类。

  26. System类有什么用?

    Java System Class是核心类之一。记录调试信息的最简单方法之一是System.out.print()方法。

    系统类是最终的,因此我们不能通过继承来子类化和覆盖它的行为。系统类不提供任何公共构造函数,因此我们无法实例化此类,这就是为什么它的所有方法都是静态的。

    System类的一些实用方法是用于数组复制,获取当前时间,读取环境变量。

  27. 什么是instanceof关键字?

    我们可以使用instanceof关键字来检查对象是否属于某个类。我们应尽可能避免使用它。示例用法是:

    
    public static void main(String args[]){
    	Object str = new String("abc");
    		
    	if(str instanceof String){
    		System.out.println("String value:"+str);
    	}
    		
    	if(str instanceof Integer){
    		System.out.println("Integer value:"+str);
    	}
    }
    

    由于str在运行时的类型为String,因此首先if语句的计算结果为true,第二个结果为false。

  28. 我们可以使用带开关盒的String吗?

    Java 7的一个特性是改进了允许字符串的开关案例。因此,如果您使用的是Java 7或更高版本,则可以在switch-case语句中使用String。

  29. Java是通过价值传递还是通过参考传递?

    这是一个非常令人困惑的问题,我们知道对象变量包含对堆空间中的对象的引用。当我们调用任何方法时,会传递这些变量的副本并将其存储在方法的堆栈内存中。我们可以测试任何语言,无论是通过引用传递还是通过简单的通用交换方法传递。

  30. 堆和堆栈内存有什么区别?

    堆和堆栈内存的主要区别如下:

    • 堆内存由应用程序的所有部分使用,而堆栈内存仅由一个执行线程使用。
    • 每当创建一个对象时,它总是存储在堆空间中,而堆栈存储器包含对它的引用。堆栈内存仅包含堆空间中对象的本地原始变量和引用变量。
    • 堆栈中的内存管理以LIFO方式完成,而在堆内存中则更复杂,因为它是全局使用的。
  31. Java Compiler存储在JDK,JRE还是JVM中?

    java编译器的任务是将java程序转换为字节码,我们有javac可执行文件。所以它必须存储在JDK中,我们在JRE中不需要它,而JVM只是规范。

  32. 以下程序的输出是什么?

    1. 类中的静态方法
      
      package com.journaldev.util;
      
      public class Test {
      
      	public static String toString(){
      		System.out.println("Test toString called");
      		return "";
      	}
      	
      	public static void main(String args[]){
      		System.out.println(toString());
      	}
      }
      

      :代码不会编译,因为我们不能使用Object带静态关键字类方法。请注意,Object类有toString()方法。您将得到编译时错误“此静态方法无法从Object隐藏实例方法”。原因是静态方法属于类,并且因为每个类基都是Object,所以我们不能在实例和类中使用相同的方法。如果将方法名称从toString()更改为超类中不存在的其他内容,则不会出现此错误Object

    2. 静态方法调用
      
      package com.journaldev.util;
      
      public class Test {
      
      	public static String foo(){
      		System.out.println("Test foo called");
      		return "";
      	}
      	
      	public static void main(String args[]){
      		Test obj = null;
      		System.out.println(obj.foo());
      	}
      }
      

      :这是一个奇怪的情况。NullPointerException当我们在对象上调用NULL方法时,我们都已经看到了。但是这个程序将工作并打印“Test foo called”。

      原因是java编译器代码优化。当java代码被编译为生成的字节代码时,它会发现foo()是一个静态方法,应该使用class调用。所以它改变了方法调用obj.foo()Test.foo(),因此没有NullPointerException

上一篇: 中级Java面试题多线程常问题目汇总_java面试题

下一篇: web前端面试题 本文是在GitHub上看到一个大牛总结的前端常见面试题

评论

评论列表