`
tedeyang
  • 浏览: 328290 次
  • 性别: 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易混淆概念Anonymous Inner Class

    Java 易混淆概念 Anonymous Inner Class Java编程语言中存在一些易混淆的概念,今天我们将探讨 Anonymous Inner Class、final、finally、finalize 的区别,Static Nested Class 和 Inner Class 的不同,&和&&的区别...

    Java面试题,他会给你很好的Java面试准备,第一,谈谈final, finally, finalize的区别,第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

    在Java中,还有Static Nested Class和Inner Class的概念。Static Nested Class意味着创建一个static内部类的对象,不需要一个外部类对象,不能从一个static内部类的一个对象访问一个外部类对象。 在Java面试中,还...

    变态JAVA面试32问.docx

    Inner Class 是一个内部类,需要外部类对象来访问,而 Static Nested Class 不需要外部类对象。Inner Class 可以访问外部类对象的成员变量,而 Static Nested Class 不能。 4. &和&&的区别 & 是位运算符,用于...

    java 经典面试题(含答案)

    * 静态内部类(InnerClass)意味着:1、创建一个static内部类的对象,不需要一个外部类对象;2、不能从一个static内部类的一个对象访问一个外部类对象。 四、&和&&的区别 * &是位运算符,用于对二进制数进行位操作...

    java面试题一锅端全集!!!!!!!!!!.doc

    * Nested Class 是 C++ 的概念,Java 中称为 Inner Class。 * Java 内部类与 C++ 嵌套类最大的不同在于是否有指向外部的引用上。 * 静态内部类(Inner Class)意味着创建一个 static 内部类的对象,不需要一个外部类...

    江苏昆山中创软件公司笔试题

    * Nested Class(一般是 C++的说法),Inner Class (一般是 JAVA 的说法)。 * Java 内部类与 C++嵌套类最大的不同就在于是否有指向外部的引用上。 * 静态内部类(Inner Class)意味着 1. 创建一个 static 内部类的...

    Java面试宝典 Java面试宝典

    答:内部类是定义在另一个类中的类,Static Nested Class是静态内部类,Inner Class是非静态内部类。 25.内部类可以引用它的包含类的成员吗?有没有什么限制? 答:内部类可以引用它的包含类的成员,但需要使用外部...

    Javac测试题123456

    【Static Nested Class与Inner Class】 静态嵌套类(Static Nested Class)类似于普通的类,可以有自己的静态成员,而内部类(Inner Class)需要依赖外部类的实例,不能有静态成员。 【HashMap与Hashtable】 ...

    精选java面试分类汇总-含目录

    2. **方法的重载与重写**: - **重载**:发生在同一个类中,方法名相同但参数列表不同(参数个数、类型或顺序不同)。返回值类型的变化不影响方法重载。 - **重写**:发生在父类与子类之间,子类的方法与父类同名...

    java面试笔试题经典版

    **Static Nested Class 和 Inner Class**:Static Nested Class是静态嵌套类,可以直接通过类名创建实例,不依赖外部类实例。Inner Class是内部类,需要先创建外部类实例才能创建内部类实例。 **接口和抽象类的继承...

    Android面试题,有答案,清除解析

    - Static Nested Class可以独立于外部类实例存在,而Inner Class需要外部类实例才能创建。 - Static Nested Class不能直接访问外部类的非静态成员,而Inner Class可以直接访问。 4. **& 和 &&的区别**: - `&`是...

    Java面试题

    以上内容涉及Java基础知识,包括类的访问控制、内部类、集合框架、基本数据类型、方法的重载与重写、断言的使用、字符串和数组的操作等,是Java程序员在面试中经常遇到的问题,对理解Java语言特性与编程实践有着重要...

    Java陷阱一箩筐

    3. **Static Nested Class与Inner Class**: - Static Nested Class(静态嵌套类)与普通类类似,只是与外部类有静态关联,可以直接访问外部类的静态成员,不包含对外部类实例的隐式引用。 - Inner Class(内部类...

    C++ online test

    根据给定的C++在线测试样本,...这些问题涵盖了C++中的多个关键概念,包括类成员访问、常量与预处理器、运算符重载、封装、指针操作以及模板和输入流处理。理解并掌握这些概念对于成为一名熟练的C++程序员至关重要。

    中软国际Java程序员笔试题及答案.doc

    3. Static Nested Class 和 Inner Class 的不同: * Static Nested Class 是将内部类声明为 static 的,意味着它可以独立于外围类对象存在。 * Inner Class 是一个非静态的内部类,隐式地保存了一个引用,指向创建...

    面试用Java基础方面问题以及答案

    3. **Static Nested Class 和 Inner Class**:静态内部类(Static Nested Class)可以在没有外部类实例的情况下创建,它可以访问外部类的静态成员,而不能访问非静态成员。非静态内部类(Inner Class)需要一个外部...

    经典Java面试题.pdf

    Static Nested Class 和 Inner Class 的不同:Nested Class 一般是 C++ 的说法,Inner Class 是 Java 的说法。Static Nested Class 是可以独立存在的类,而 Inner Class 不能独立存在,必须在外部类的实例中存在。

    Java经典面试试题及答案

    Static Nested Class 和 Inner Class 的不同在于,Nested Class(一般是 C++的说法),Inner Class(一般是 JAVA 的说法)。Java 内部类与 C++嵌套类最大的不同就在于是否有指向外部的引用上。具体来说,静态内部类...

Global site tag (gtag.js) - Google Analytics