zoukankan      html  css  js  c++  java
  • j2ee面试宝典翻译(1)

    q1:给出一些使用Java的理由?

    a1:java是一个有趣的编程语言,让我找出一些理由来:

    • 内建的多线程机制、套接字、内存管理(自动垃圾回收)
    • 面向对象
    • 跨平台
    • 通过对标准API的扩展来支持基于web的应用程序(applet、servlet、jsp),分布式应用程序(socket、RMI、EJB)和网络协议(HTTP、JRMP等)。


    q2:java平台和别的软件平台有什么主要区别?

    a2:java平台是纯粹的软件平台,运行在别的基于硬件的平台之上(如UNIX、NT等)。


            java平台由两部分组成:

    • java虚拟机(JVM):是硬件平台上的一个软件,字节码(class文件)是JVM的机器语言。
    • java Application Programing Interface(API)——系列用Java语言编写的class文件,它们运行在JVM上。


    q3:C++和Java有哪些区别?

    a3:虽然Java和C++都使用相近的语法而且都是面向对象的编程语言,但是:

    • Java不支持指针。指针天生较为教滑和令人讨厌。
    • Java不支持多重继承,因为这带来的麻烦比它解决的要多。作为替代,Java支持多接口继承,运行一个类继承(实现)多个来自不同接口的方法签名。多接口继承运行子类对象的行为具备多态性。
    • Java不支持析构函数,但是添加了finalize()方法。垃圾回收器在回收对象前会调用其finalize()方法,但是我们并不知道对象何时被回收。我们不应该使用finalize来释放资源,例如文件处理、socket、数据库连接,因为这些资源都很有限,我们并不知道finalize()方法何时被调用。
    • Java没有结构体或者联合体,因为传统的数据结构被设计为一个面向对象的框架(Java集合框架)。

    q4:Java packages有什么作用?

    a4:多个包下可以有同名的类,因此包可以帮助我们解决命名冲突的问题。另外,它可以很好地组织文件。例如 java.io 包与I/O相关而java.net包与网络相关,等等。如果我们将所有的.java文件放在单个包中,随着项目的增大,将会很难管理这些文件。

    我们可以通过package来声明类所在的包。package关键字应该是源码中出现的第一个关键字,随后是import语句。默认情况下,java.lang包会被隐式地引入,而其它包都必须显式地引入。

    package com.xyz.client ; 
    import   java.io.File; 
    import   java.net.URL; 


    q5:解释Java类加载器(class loader)?如果你有一个类在一个包里,你需要做什么才能运行它?解释动态类加载?

    a5:类加载器是分等级的。当已经运行在JVM中类引用了一个类的名字时,这个类才会被加载到JVM中。那么,第一个类是如何被加载的呢?JVM要加载的第一个类是声明了main()方法并被运行的类。接下来所有被装载的类都是由它引发的——它已经在JVM中并处于运行状态。

    一个类装载器创建一个命名空间。所有JVM至少有一个类装载器,被称为原始类加载器或者引导类加载器,它是由C或者C++实现的。除此之外,Java允许用java语言编写的类加载器来加载class文件。通常JVM提供两个这样的非原始类加载器:

    • 引导类加载器(Bootstrap)——加载JDK内部的class文件(java.*包),典型地,它加载rt.jar和i18n.jar
    • 扩展类加载器(Extensions)——加载JDK扩展路径下的jar包, java.ext.dirs系统变量指定的路径,通常是JRE的lib/ext路径
    • 系统类加载器(System)——从系统classpath加载class文件,系统classpath由 java.class.path系统变量决定,它通过CLASSPATH环境变量或者命令行的–classpath / –cp参数指定


    类加载器是分层级的,而且采用委托模型。类装载器会先请求其父级类加载器加载类文件,如果父级加载器未能加载,再自己加载。一旦父级加载器已经加载该类,子加载器不会重复加载。子加载器加载的类可访问父加载器加载的类,但是反过来不成立。

    Q:在某个package下拥有main()方法的class,你需要做什么才能运行它?

    举例来说:你有一个类名为“Pet”在工程文件“c:myProject”并且包名为“com.xyz.client”,你能用下列方式编译和运行它吗?

    package com.xyz.client; 
     
    public class Pet { 
        public static void main(String[] args) { 
             System.out.println("I am found in the classpath"); 
        } 
    }


    To run --》  c:myProject>  java com.xyz.client.Pet

    答案是不行!你将会得到这样的异常:“Exception in thread "main" java.lang.-NoClassDefFoundError: com/xyz/client/Pet”.
    你需要设置classpath

    1. 设置操作系统的“CLASSPATH”环境变量,包含工程文件“c:myProject”
    2. 设置操作系统的“CLASSPATH”环境变量,包含工程文件“c:myProjectclient.jar”,这个jar包应含有Pet.class类文件。
    3. 运行命令行提供-cp或者-classpath环境变量:

         

    c:>java  -cp  c:/myProject  com.xyz.client.Pet   
                  OR   
    c:>java -classpath c:/myProject/client.jar  com.xyz.client.Pet


    Q:解释静态vs动态类加载?

    静态类加载
    动态类加载
    类的静态加载伴随着Java的new操作符

    class MyClass {
        public static void main(String args[]) {
             Car c  = new  Car();  
        }
    }


    动态加载是在运行期调用类装载功能的一种编程技术。
    //static method which returns a Class
    Class.forName (String className );

    上面的静态方法返回一个和类名关联的Class实例。字符串“className”可以在运行期被动态地提供。不像静态加载,动态加载决定加载Car类文件或者Jeep类文件,是基于属性文件或者其它运行期条件的。一旦类被加载,就可以通过下列方式来创建类的一个实例(就像用new操作符调用一个无参构造器那样!)

    class.newInstance () ; //A non-static method, which creates an instance of a  
                                         //class (i.e. creates an object).   
    Jeep myJeep = null ;
    //myClassName should be read from a .properties file or a Constants class.  
    // stay away from hard coding values in your program.   
    String myClassName = "au.com.Jeep" ;
    Class vehicleClass = Class.forName(myClassName) ;
    myJeep = (Jeep) vehicleClass.newInstance();
    myJeep.setFuelCapacity(50);
    NoClassDefFoundException异常将被抛出,如果用new操作符使用一个类,但是在运行期系统并未找到这个被引用的类。
    ClassNotFoundException将会被抛出,如果程序试图使用下列方式之一,通过字符串类名加载一个类,而这个类未被定义的话。

    The forName(..) method in class -  Class.
    The findSystemClass(..) method in class - ClassLoader.
    The loadClass(..) method in class - ClassLoader. 


    Q:静态初始化和静态块是什么?

    A:当一个类被加载的时候,其静态块就会被执行,这会先于构造器的执行。正如其名,它用于初始化静态成员。

    public class StaticInitializer { 
       public static final int A = 5; 
       public static final int B; //note that it is not Æ public static final int B = null ; 
       //note that since B is final , it can be initialized only once. 
      
       //Static initializer block, which is executed only once when the class is loaded.  
        
       static { 
          if(A == 5) 
             B = 10; 
          else 
             B = 5;    
       } 
     
       public StaticInitializer(){}  //constructor is called only after static initializer block 
    } 


    下列代码将会输出:A=5, B=10

    public class Test { 
        System.out.println("A =" + StaticInitializer.A + ", B =" + StaticInitializer.B); 
    }




  • 相关阅读:
    阿里消息队列中间件 RocketMQ 源码分析 —— Message 拉取与消费(上)
    数据库中间件 ShardingJDBC 源码分析 —— SQL 解析(三)之查询SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(六)之删除SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(五)之更新SQL
    消息队列中间件 RocketMQ 源码分析 —— Message 存储
    源码圈 300 胖友的书单整理
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(一)分库分表配置
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(四)之插入SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(二)之分库分表路由
    C#中Math类的用法
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3186944.html
Copyright © 2011-2022 走看看