`
tedeyang
  • 浏览: 318398 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

inner class与重载问题

阅读更多

今天发现一个问题,不解.


TaskStatistic类源码



/**
 *
 */
package cn.tohot.webdown.statistic;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;

import cn.tohot.webdown.persist.StatisticDAO;
import cn.tohot.webdown.persist.TaskCountRecord;
import cn.tohot.webdown.util.Config;

/**
 * 任务状态定时统计线程,只记录发生了变动的统计结果.<br>
 * 以单例模式运行,通过观察者模式发送统计结果<br>
 * 典型的观察者有客户端通讯和统计曲线图
 *
 * @author 杨
 *
 */
public class TaskStatistic extends CommonStatisticSource {
 static private int statisticRate = Config.getApplicationConfig().statisticRate();
 static private TaskStatistic thread = null;
 private static Logger log = Logger.getLogger(TaskStatistic.class);
 private final ScheduledExecutorService schedule = Executors.newSingleThreadScheduledExecutor();
 private boolean started = false;

 private TaskStatistic() {
 }

 public static TaskStatistic getSingleScheduledThread() {
  if (thread == null) {
   thread = new TaskStatistic();
  }
  return thread;
 }

 /**
  * 在垃圾收集前停止线程
  * @see java.lang.Object#finalize()
  */
 protected void finalize() throws Throwable {
  this.stop();
  super.finalize();
 }

 /**
  * 启动,以固定的延迟频率统计数据库中任务的状态,如果状态发生变化则通知监听者,并记录.
  */
 public void start() {
  if (started)
   return;
  if (log.isInfoEnabled())
   log.info("启动任务统计线程");
  started = true;

  final StatisticDAO dao = new StatisticDAO();
  schedule.scheduleWithFixedDelay(
    
    new Runnable() {
     TaskCountRecord lastRecord = null;
     public void run() {
      TaskCountRecord totalCount = dao.countTaskStatus();
      // 任务数没有变化则不更新
      if (!totalCount.equals(lastRecord)) {
       lastRecord = totalCount;
       tellAllObservers(totalCount);
       dao.save(totalCount);
      }
      notifyAll(totalCount);
     }
    },
    statisticRate,
    statisticRate,
    TimeUnit.SECONDS
  );
 }

 /**
  * 结束
  */
 public void stop() {
  schedule.shutdown();
  started = false;
  if (log.isInfoEnabled())
   log.info("停止任务统计线程");
 }
}
 
CommonStatisticSource



/**
 *
 */
package cn.tohot.webdown.statistic;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

/**
 * 简单统计消息源
 *
 * @author 杨
 *
 */
public class CommonStatisticSource implements StatisticSource {
 private static Logger log = Logger.getLogger(CommonStatisticSource.class);
 final protected List<StatisticObserver> observers = new ArrayList<StatisticObserver>();

 /**
  * 把消息通知所有观察者
  * @param message
  */
 final protected void tellAllObservers(Object message) {
  for (StatisticObserver obs : observers) {
   if (obs != null) {
    try {
     obs.tellMe(message);
    } catch (Exception e) {
     log.error("监听器更新出错", e);
    }
   }
  }
 }

public void notifyAll(Object me){

//do

}

 /*
  * (non-Javadoc)
  *
  * @see
  * cn.tohot.webdown.statistic.StatisticMessageSource#addObserver(cn.tohot
  * .webdown.statistic.StatisticObserverIface)
  */
 public void addObserver(StatisticObserver observer) {
  observers.add(observer);
  if(log.isDebugEnabled()) log.debug("增加一个观察者");
 }

 /*
  * (non-Javadoc)
  *
  * @see
  * cn.tohot.webdown.statistic.StatisticMessageSource#removeObserver(cn.tohot
  * .webdown.statistic.StatisticObserverIface)
  */
 public void removeObserver(StatisticObserver observer) {
  observers.remove(observer);
  if(log.isDebugEnabled()) log.debug("删除一个观察者");
 }

}

 

后来我把notifyAll改成了tellAllObsever,发现是可以调用的.

但为什么notifyAll就不行呢?

这个Object的final方法有什么特殊约束吗?

 

经过一段时间思考,

应该是混淆了inner class的notifyAll()和outer class的notifyAll(),

可以把代码"notifyAll(totalCount);  "改写成 " TaskStatistic.this.notifyAll(totalCount);    ".

用明确的this引用来声明方法所属对象 ,果然不再报错了!

 

  • 大小: 196.6 KB
分享到:
评论

相关推荐

    java笔试题

    1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别...24、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 25、Java 中会存在内存泄漏吗,请简单描述。

    JAVA面试题最全集

    37.classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有什么区别? 38.列举三种以上垃圾回收算法,并比较其优缺点? 39.编写代码实现一个线程池 40.描述一下JVM加载class文件的原理机制? 41....

    java编程基础,应用与实例

    第10章 内隐类(inner class) 146 10.1 静态类(static class) 146 10.2 成员类(member class) 147 10.3 局部类(local class) 150 10.4 匿名类(anonymous class) 152 10.5 巩固练习 153 第11章 异常处理...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 19 【基础】关于“==”和“equal()” 19 关于“==” 19 关于“equals()” 20 【基础】String为什么是final 20 【基础】java中String、...

    LuaBind 源码 (Lua增强库)

    为了正确处理所有权转移问题,create_a()将用来适配返回值策略. 参见 策略 章节. -Linker Lin 4/5/08 6:32 PM struct B: A {}; struct C: B {}; void g(A*); void g(B*); 执行以下 Lua 代码即结果: a1 = create...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.5.5 重载容易引发误解的两个地方——返回类型和形参名 170 7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.5.5 重载容易引发误解的两个地方——返回类型和形参名 170 7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 ...

    java 面试题 总结

    21、Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 22、JSP中动态...

    超级有影响力霸气的Java面试题大全文档

    24、Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 25、JSP中动态...

    Java面试宝典2020修订版V1.0.1.doc

    31、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 33、数字转字符有多少种方式,分别是什么 22 34、Java创建对象有几种方式 22 35、写出验证...

    Java开发技术大全(500个源代码).

    localVSmember.java 局部变量与成员变量同名问题示例 onlyTest.java 对象传值示例 otherClass.java 从类的外部访问对象的成员 showInstVar.java 演示不同的对象拥有不同的成员变量 showMain.java 演示main方法...

    java面试800题

    Q0041 Java保留字 11个:byValue, cast, false, future, generic, inner, operator, outer, rest, true, var. Q0042 Java的值传递的规则? Java基本类型的都是值传递,对象使用的都是引用传递 Q0043 java相关概念 ...

    【05-面向对象(下)】

     –在外部类以外的地方使用内部类,内部类完整的类名应该OuterClass.InnerClass.  –在外部类以外的地方使用非静态内部类创建对象的语法如下:OuterInstance.new InnerConstructor()  –在外部类以外的地方使用...

    MySQL命令大全

    RELOAD: 重载访问控制表,刷新日志等。 SHUTDOWN: 关闭MySQL服务。 数据库/数据表/数据列权限: Alter: 修改已存在的数据表(例如增加/删除列)和索引。 Create: 建立新的数据库或数据表。 Delete: 删除表的记录...

    MYSQL常用命令大全

    RELOAD: 重载访问控制表,刷新日志等。 SHUTDOWN: 关闭MySQL服务。 数据库/数据表/数据列权限: Alter: 修改已存在的数据表(例如增加/删除列)和索引。 Create: 建立新的数据库或数据表。 Delete: 删除表的记录。 ...

Global site tag (gtag.js) - Google Analytics