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); 
    }




  • 相关阅读:
    IE7下元素的 'paddingtop' 遇到 'clear' 特性在某些情况下复制到 'paddingbottom'
    Foundation HTML5 Canvas中的2处错误
    近期学习技术安排
    2011年工作总结和展望(上篇)
    详解ObjectiveC消息传递机制
    ObjectiveC 2.0的运行时编程消息转发
    c# Pdf 转换图片
    c语言指针用法难点
    C# web实现word 转Html、office转Html、pdf转图片 在线预览文件
    ObjectiveC中什么是类
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3186944.html
Copyright © 2011-2022 走看看