java面试题(七)

1.

解析:

A.抽象类是可以实现接口的,而且抽象类也可以继承自抽象类

B.对

C.抽象类指有abstract修饰的class,其可以包含抽象方法,也可以不包含

D.抽象类和接口都是不能被实例化的,只有具体的类才可以被实例化

 

2.

解析:

 y是2,返回的结果是2+(z--/++x),再来看z--/++x,结果应该是3/2,但是因为x,y,z都是int型的,所以最后的返回值只能是int,这时候z--/++x的值就是1,那么最终的结果就是2+1=3

3.

解析:

static表示静态变量,归类所有,该类的所有对象公用

被final 修饰的是常量

4.

解析:

1:特殊变量super,提供了对父类的访问。

2:可以使用super访问父类被子类隐藏的变量或覆盖的方法。

3:每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

4:构造是不能被继承的。 

5.

解析:

被static修饰的变量称为静态变量,静态变量属于整个类,而局部变量属于方法,只在该方法内有效,所以static不能修饰局部变量 

6.

解析:

protected Object clone ()                             //创建并返回此对象的一个副本。 

boolean equals (Object obj)                        //指示某个其他对象是否与此对象“相等”。 

protected void finalize ()                              //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 

Class<? extends Object> getClass ()         //返回一个对象的运行时类。 

int hashCode ()                                             //返回该对象的哈希码值。 

void notify ()                                                  //唤醒在此对象监视器上等待的单个线程。 

void notifyAll ()                                             //唤醒在此对象监视器上等待的所有线程。 

String toString ()                                           //返回该对象的字符串表示。 

void wait ()                                                     //导致当前的线程等待,直到其他线程调用此对象的 notify () 方法或 notifyAll () 方法。 

void wait ( long timeout)                               //导致当前的线程等待,直到其他线程调用此对象的 notify () 方法或 notifyAll () 方法,或者超过指定的时间量。 

void wait ( long timeout, int nanos)             //导致当前的线程等待,直到其他线程调用此对象的 notify () 方法或 notifyAll () 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。

7.

解析:

  • -s 还原文件的顺序和备份文件内的存放顺序相同。
  • -t 列出备份文件的内容。
  • -v 显示指令执行过程。
  • -f 指定压缩文件
  • -x 从备份文件中还原文件。

 

8.

解析:

Apache就是一个Http服务器,Tomcat是一个web容器,静态的htmlApache还可以处理,但是动态的需要转发给Tomcat去处理了,比如jsp页面,请求先经由Apache转发给Tomcat再由Tomcat解析请求。所以应该是web容器去解析成request对象。

9.

解析:

1.== 和 equals():

(1)“==” 用于比较基本数据类型时比较的是值,用于比较引用类型时比较的是引用指向的地址。

(2)Object 中的equals() 与 “==” 的作用相同,但String类重写了equals()方法,比较的是对象中的内容。

public boolean equals(Object anObject) {  if (this == anObject) {
      return true;    } else { if (anObject instanceof String) {
                String aString = (String)anObject;
       if (this.coder() == aString.coder()) { return this.isLatin1() ? StringLatin1.equals(this.value, aString.value) : StringUTF16.equals(this.value, aString.value); 
       }
        } return false;  }
}

2.String对象的两种创建方式:

(1)第一种方式: String str1 = "aaa";  是在常量池中获取对象("aaa" 属于字符串字面量,因此编译时期会在常量池中创建一个字符串对象,如果常量池中已经存在该字符串对象则直接引用)

(2)第二种方式: String str2 = new String("aaa") ; 一共会创建两个字符串对象一个在堆中,一个在常量池中(前提是常量池中还没有 "aaa" 象)。

        System.out.println(str1==str2);//false

3.String类型的常量池比较特殊。它的主要使用方法有两种:

(1)直接使用双引号声明出来的String对象会直接存储在常量池中。
(2)如果不是用双引号声明的String对象,可以使用 String 提供的 intern 方法。 String.intern() 是一个 Native 方法,它的作用是: 如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用; 如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。
    String s1 = new String("AAA");
    String s2 = s1.intern();
    String s3 = "AAA";
    System.out.println(s2);//AAA
    System.out.println(s1 == s2);//false,因为一个是堆内存中的String对象一个是常量池中的String对象,

    System.out.println(s2 == s3);//true, s1,s2指向常量池中的”AAA“

4.字符串拼接:

    String a = "a";
    String b = "b";
         
    String str1 = "a" + "b";//常量池中的对象
    String str2 = a + b; //在堆上创建的新的对象     
    String str3 = "ab";//常量池中的对象
    System.out.println(str1 == str2);//false
    System.out.println(str1 == str3);//true 
    System.out.println(str2 == str3);//false

 

10.

解析:

  • ArrayList插入和现有项的删除开销很大,除非在末端
  • LinkedList插入和删除开销很小
  • ArrayList和LinkedList都是实现了List接口
  • HashMap可以用null值和空字符串作为K,不过只能有一个

 

11.

解析:

 

 12.

解析:

 具体可以参考单例模式 | 菜鸟教程

13.

解析:

1、ThreadLocal的类声明:

public class ThreadLocal<T>

可以看出ThreadLocal并没有继承自Thread,也没有实现Runnable接口。所以AB都不对。

2、ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的一个变量。所以ThreadLocal重要作用并不在于多线程间的数据共享,而是数据的独立,C选项错。

3、由于每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问,变量被彻底封闭在每个访问的线程中。所以E对。

4、ThreadLocal中定义了一个哈希表用于为每个线程都提供一个变量的副本:

 static class ThreadLocalMap {


        static class Entry extends WeakReference<ThreadLocal> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal k, Object v) {
                super(k);
                value = v;
            }
        }

        /**
         * The table, resized as necessary.
         * table.length MUST always be a power of two.
         */
        private Entry[] table;

}

所以D对。

14.

解析:

USES-A:依赖关系,A类会用到B类,这种关系具有偶然性,临时性。但B类的变化会影响A类。这种在代码中的体现为:A类方法中的参数包含了B类。

关联关系:A类会用到B类,这是一种强依赖关系,是长期的并非偶然。在代码中的表现为:A类的成员变量中含有B类。

HAS-A:聚合关系,拥有关系,是关联关系的一种特例,是整体和部分的关系。比如鸟群和鸟的关系是聚合关系,鸟群中每个部分都是鸟。

IS-A:表示继承。父类与子类,这个就不解释了。

要注意:还有一种关系:组合关系也是关联关系的一种特例,它体现一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分的关系,但这种整体和部分是不可分割的。

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再让我学一会吧!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值