黑马程序员技术交流社区

标题: 一个Java类被虚拟机加载时 静态变量被静态方法初始化赋值 以后调用时用哪个? [打印本页]

作者: che201311    时间: 2013-11-26 09:57
标题: 一个Java类被虚拟机加载时 静态变量被静态方法初始化赋值 以后调用时用哪个?

package com.tool;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import com.bean.Teacher;
import com.bean.TeacherDAO;

public class SchoolManager {
public static TeacherDAO tbao = new TeacherDAO();

private static List<Teacher> allTeacher;

static {
Timer t = new Timer();
t.schedule(new TimerTask(){

@Override
public void run() {
SchoolManager.setAllTeacher();

}

}, new Date(), 1000 * 60);
}

public static void setAllTeacher() {
allTeacher = SchoolManager.tbao.findAll();
System.out.println(allTeacher.get(0).getTname()+"================================");
}

public static List<Teacher> findAllTeacher() {
return allTeacher;
}

}
问 调用findAllTeacher()方法时 allTeacher的值用的是哪个??别的都不看只问它的执行顺序。
作者: 一直很安静    时间: 2013-11-26 10:25
调用的是被静态方法初始化后的值,这种问题使用简单代码验证一下就清楚了
public class TEST14{
        public static void main(String[] args){
                System.out.println(met());
               
        }
        static int i=2;
        public static int met(){
                i=7;
                return i;
        }
}
上面代码运行后结果为7
作者: 汪洋大海    时间: 2013-11-26 10:34
看到楼主写这么多import,虽然不知道写的什么,不过感觉很吊的样子。
作者: freehiker    时间: 2013-11-26 10:41
我用多态的一个例子来说明static和非静态方法及static和非静态成员的运行结果吧
  1. package test.java;

  2. public class StaticBind {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 TopStaticBind top = new EndStaticBind();
  9.                 System.out.println(top.a); // 5
  10.                 System.out.println(top.b); // 6
  11.                 top.run(); // EndStaticBind非静态方法
  12.                 top.show(); // TopStaticBind静态方法
  13.         }

  14. }

  15. class TopStaticBind {
  16.         public int a = 5;
  17.         public static int b = 6;

  18.         public void run() {
  19.                 System.out.println("TopStaticBind非静态方法");
  20.         }

  21.         public static void show() {
  22.                 System.out.println("TopStaticBind静态方法");
  23.         }
  24. }

  25. class EndStaticBind extends TopStaticBind {
  26.         public int a = 15;
  27.         public static int b = 16;

  28.         public void run() {
  29.                 System.out.println("EndStaticBind非静态方法");
  30.         }

  31.         public static void show() {
  32.                 System.out.println("EndStaticBind静态方法");
  33.         }
  34. }
复制代码

多态中,关于成员变量,不管是静态还是非静态,是谁调用它就调用哪个引用类型类中的变量
如上题所示,不管是a还是b,调用的都是Top中的变量
关于成员函数,静态方法调用的是引用变量所属类中的方法,因为这里有一个静态绑定。
而非静态函数的话Top类中的方法会被End类中的方法覆盖,所以执行的是End类中的方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2