`
YuHuang.Neil
  • 浏览: 187545 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
请你说一下Java内部类都有哪些用途以及在什么情况下才需要使用内部类。 答:个人认为Java内部类主要有三个用途:第一,起到封装类的作用;第二,可以直接访问外部类的成员;第三,回调外部类的方法。作为Java内部类的作用,第三点尤为重要。 (1)封装类型:面向对象的核心思想之一就是封装,把所有不希望对外公开的实现细节封装起来。顶层类只能处于public和默认两种访问级别,而成员内部类可以处于public、protected、private和默认4中访问级别。此外,如果一个内部类仅仅为特定的方法服务,那么可以把这个内部类定义在方法中。内部类是一种封装类型的有效手段。 (2)直接访问外部类的成员 ...
请阅读以下代码段,给出这段程序运行结果,并尝试总结一下匿名类的特点。 package com.ecom.baidu; public class A { A(int v) { System.out.println("another constructor"); } A() { System.out.println(&q ...
阅读以下代码段,给出代码运行的结果及其原因: class Outer { Inner in; Outer() { in = new Inner(); } public class Inner { public Inner() { System.out.println("inner of Outer"); } } } public clas ...
请问Java中的局部内部类有何特点? 答:局部内部类是在一个方法中定义的内部类,它的可见范围是当前方法。和局部变量一样,局部内部类不能用访问控制修饰符(public、private和protected)以及static修饰符来修饰。局部内部类具有以下几个特点: (1)局部内部类只能在当前方法中使用。 (2)局部内部类和实例内部类一样,不能包含静态成员。 (3)在局部内部类中定义的内部类也不能被public、protected和private这些访问控制修饰符修饰。 (4)局部内部类和实例内部类一样,可以访问外部类的所有成员,此外,局部内部类还可以访问所在方法中的final类型的参数和变量。 ...
请说明一下静态内部类有哪些特点? 答:静态内部类是成员内部类的一种,要使用static修饰。静态内部类具有以下几个特点:      (1)静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不              创建外部类的实例。      (2)静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,就必须通过              外部类的实例去访问。例如在以下静态内部类B中,可以直接访问外部类A的静态变量              a2,但是不能直接访问实例变量a1。              cl ...
请详细阐述一下Java中实例内部类的特点。 答:实例内部类是成员内部类的一种类型,没有static修饰。实例内部类就是一个实例内部类。实例内部类具有以下几个特点: (1)在创建实例内部类的实例时,外部类的实例必须已经存在。例如,一个内部类InnerTool类,它的外部类是Outer,那么如果要创建InnerTool类的实例,必须先创建Outer外部类的实例。 Outer.InnerTool tool = new Outer().new InnerTool(); //上述代码等价于: Outer outer = new Outer(); Outer.InnerTool too ...
在Java集合中有一种特殊的Map类型——WeakHashMap,在这种Map中存放了键对象的弱引用,当一个键对象被垃圾回收器回收时,那么相应的值对象的引用会从Map中删除。WeakHashMap能够节省存储空间,可用来缓存那些非必须存在的数据。 下面程序段测试了垃圾回收器对WeakHashMap中值对象的回收过程,其中能够被3整除的键不会被垃圾回收器回收是由于其引用是强引用。 import java.util.*; import java.lang.ref.*; class Key { String id; public Ke ...
在Java引用中,使用最多的无疑是强引用类型,对于其余三种级别的引用类型用得比较少。它们使用的方式与强引用也有些区别。下面使用一个例子来介绍一下其余三种引用(包括软引用、弱引用和虚引用)的使用方法。 import java.lang.ref.*; import java.util.*; class Grocery { private static final int SIZE=10000; private double[] d = new double[SIZE]; private String id; ...
请问Java中的引用分为哪几种级别?这几种级别之间都有些什么区别? 答:为了使程序更灵活地控制对象的生命周期,在JDK1.2版本之后,把对象的引用分为4种级别。这4种级别由高到底分别为:强引用(StrongReference)、软引用(So ...
请分析一下finalize()方法和finally代码块之间在作用上面的异同。 答:在Object类中提供了finalize()方法,它的初衷是用于在对象被垃圾回收之前,释放所占用的相关资源,这和try ... catch ... finally语句的finally代码块的用途比较相似。但是由于垃圾回收器是否执行finalize()方法以及何时才执行这个方法都是不确定的,因此在程序中不能使用finalize()方法来完成同时具有下面两个特点资源的释放操作: (1)必须执行的释放操作。 (2)必须在某个确定的时刻执行的释放操作。 具有上述两个特点的资源释放操作放在finally语句块中更加合适。 ...
请问finalize()方法在垃圾回收过程中的作用,它具有哪些特点? 答:当垃圾回收器将要释放无用对象的时候,先调用该对象的finalize()方法。如果在程序终止之前垃圾回收器始终没有执行垃圾回收操作,那么垃圾回收器将始终不会调用无用对象的finalize()方法。在Java的Object祖先类中提供了protected类型的finalize()方法方法,因此任何Java类都可以覆盖finalize()方法,在这个方法中进行释放对象所占资源的操作。 Java虚拟机的垃圾回收操作对程序完全是透明的,因此程序无法预料某个无用对象的finalize()方法何时被调用。另外,除非垃圾回收器认为程序 ...
请问从Java垃圾回收器的角度来看,堆区对象有几种状态,对象处于什么状态时垃圾回收器会对该对象进行回收? 答:在Java虚拟机的垃圾回收器来看,堆区中的每个对象都可能处于以下三种状态之一:       (1)可触及状态:当一个对象被创建之后,只要程序中还有引用变量引用它,那么它就始               终处于可触及的状态。       (2)可复活状态:当程序不再有任何引用变量引用一个对象的时候,它就进入了可复活状               态。在这种状态中,垃圾回收器会准备释放它占用的内存资源,在释放之前,会调用               它及其处于可复活状态对象的finaliz ...
请说明一下使用具有缓冲的不可变类的好处,并设计一个带有缓存的不可变类。 答:不可变类的实例的状态不会发生变化,这样的实例可以安全地被其他与之相关的对象共享,还可以安全地被多个线程共享。为了节省内存空间,优化程序的性能,应该尽量重用不可变类的实例,避免重复创建具有相同属性值的不可变类的实例。但是值得注意的一点是,没有必要为所有的不可变类提供实例缓存机制。随意地创建大量的实例供缓存,反而会造成不必要的内存开销和降低程序运行的性能。通常只有满足以下几个条件的时候才需要使用不可变类的实例缓存机制: (1)不可变类的实例数量有限,缓存这些实例的内存开销比较小。 (2)在程序运行过程中,需要频繁地访问不可 ...
阅读以下代码段,结合代码的意图分析此代码是否能够实现这个目的。 import java.util.Date; public final class Schedule { private final Date start; //开学时间,不允许被修改 private final Date end; //放假时间,不允许被修改 public Schedule(Date start,Date end){ if(start.compareTo(end)>0) ...
在Java中有两种基本类类型,就是可变类与不可变类。所谓不可变类,是指当创建了这个类实例之后,就不允许修改它的任何属性值。在JDK的基本类库中,所有基本类型的包装类,比如Integer类和Long类,都是不可变类,还有最常见的就是java.lang.String类也是不可变类。 那么创建自己的不可变类时,需要考虑的基本设计模式如下: (1)把所有属性定义为private final类型。 (2)不对外公开用于修改属性的setXXX()方法。 (3)只需要公开用于读取属性值的getXXX()方法。 (4)在构造方法中初始化类中的所有属性。 (5)覆盖Object类中的equals()和hashC ...
Global site tag (gtag.js) - Google Analytics