为什么类中有些方法必须定义成static类型的?

kala197 2011-02-15 11:49:09
import java.util.Timer;
import java.util.TimerTask;
/**
* @author softisland
*
*/

public class timetest {
public static void ShowPic(){

int i, j, k;
// i 的值,-3,-2,-1,0,1,2,3
for (i = -3, j = 1; i <= 3; j++) {
// 对i取绝对值,并传至给k
if (i < 0)
k = i * (-1);
else
k = i;
// 如果满足条件,输出*,且跳出本次循环。
if (j <= k || (j > 7 - k && j != 8)) {
System.out.print("*");
continue;
}
// 如果满足条件输出a
if (j > k && j <= 7 - k) {
System.out.print(" ");
}
//如果j=8则i自加1,并将0重新赋值为0!
//(只有j在[1,7]范围内才输出)
if (j == 8) {
i++;
j = 0;
System.out.println();
}
}

}
public static void main(String[] args) {
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
int count = 0;
public void run() {
System.out.println(count);
ShowPic();//如果方法不是static 类型的 这里IDE就会提示错误
++count;
if (count > 10) {
timer.cancel();
System.out.println("Timer is stopped.");
}
}

}, 0, 500);
}

}


上面的程序ShowPic() 必须是static 类型的 为什么 如果方法不是要声明成static 类型的 ShowPic()方法就必须写在run()方法里面 为什么 ?
...全文
801 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
whut_lcy 2011-02-15
  • 打赏
  • 举报
回复
谷歌or百度
关键字:java main 为什么 static

看它三四篇,你对java的static就很精通了

kala197 2011-02-15
  • 打赏
  • 举报
回复
类中的成员方法 必须实例化该类的对象才可以使用

如果不想实例化对象的话 把成员方法声明成 static 就可以了吗 ?

那么类能不能直接调用其他类里面的static 方法?
nairuohe 2011-02-15
  • 打赏
  • 举报
回复
你首先要知道一点:你看main方法是静态的,实际上,程序在执行main方法的时候没有实例化timetest类。
还要知道一点:当成员方法是静态时,可以不用实例化类而直接调用方法。若不是,则必须先实例化再调用。

现在你自己在代码中也没有实例化timetest类。所以你把showPic方法写在外面,也就是作为timetest类的成员方法,而在没有实例化timetest类的时候就调用它的成员方法,当然是有问题的。改成静态之后就没有问题了。实例化是怎么回事你应该清楚吧?
liumin_csu 2011-02-15
  • 打赏
  • 举报
回复
因为你没有新建timetest 类的对象就调用它的方法,这样当然报错。
1.如果方法不是static的,必须通过新建对象 timetest test=new timetest后,用test.ShowPic调用。
2.如果方法是static,则直接调用即可,就像你贴上来的代码。静态方法直接通过类名访问timetest.ShowPic,你现在贴上来的是用this调用,也行。
wangchangbing 2011-02-15
  • 打赏
  • 举报
回复
ShowPic();//如果方法不是static 类型的 这里IDE就会提示错误

timetest tt = new timetest();
tt.ShowPic();

这样就可以不使用static了
chaoliu1024 2011-02-15
  • 打赏
  • 举报
回复
ShowPic()定义为static,不实例化对象也能使用
一般使用方法都是"对象名"."函数名",加static后就可以不实例化对象
TimerTask类是一个时间任务类,必须有一个run()方法,相当于又开了一个线程
不善^ 2011-02-15
  • 打赏
  • 举报
回复
static 是静态的 属于公共的 不需要实例化
如果你不是static 你就必须 先实例化类 然后再调用 该方法
关于static的说明 你可以百度搜索下
浪漫江湖 2011-02-15
  • 打赏
  • 举报
回复
static本身的意思是静态的;ava中如果一个方法加上static那它那就成了这个类的方法,而不是一个具体的对象的方法了(虽然实例化后的对象也可以调用);但在main方法的run()方法中直接调用的话,它当然就是错的了.如果你加上static 就表示这个方法是这个类的方法,(类方法是在一个类中有作用);所以你可以直接调用了
魔都 2011-02-15
  • 打赏
  • 举报
回复
static 为静态,是当类编译加载的时候,内存就会开辟存储空间的。
你要用static 的静态 调用非静态的方法,这个时候非静态的方法还没有空间呢。所以不行。

可以先new一下在调用。也可。
qkniit 2011-02-15
  • 打赏
  • 举报
回复
ShowPic();//如果方法不是static 类型的 这里IDE就会提示错误

改成:

new timetest().ShowPic();

ShowPic()的static 去掉。

也可以的

zenganiu11 2011-02-15
  • 打赏
  • 举报
回复
因为main方法是static类型,static方法只能调用static方法
Darling_sheep 2011-02-15
  • 打赏
  • 举报
回复
因为你的main方法是static的,所以里面只能直接调用static类型的方法和属性。非static类型的属性和变量只能通过所属类的对象来调用。
因此,如果你的ShowPic()不是static类型的,只能这样调用:
timetest tt=new timetest();
tt.ShowPic();

另外,建议楼主有空看一下Java代码规范。
JoneSche 2011-02-15
  • 打赏
  • 举报
回复
很搞笑
该课程由付强老师主讲,系统的、全面的、具体的讲解了java入门的知识。可以使初级的学员入门。Java入门Java的历史、Java的版本、Java的优势、软件行业前景Java开发环境搭建、编写Java入门练习虚拟机的运行机制、Java的平台无关性、虚拟机垃圾回收机制基础语法关键字、标识符、Java数据类型分类、基础数据类型、取值范围变量、常量、三种注释、生doc文档、运算符、表达式if语句、switch语句、嵌套判断for语句、while语句、do-while语句、嵌套循环类和对象面向过程和面向对象的区别类的构、访问修饰符、对象的内存分配this关键字、按值传递与按引用传递、对象的初始化顺序高级类特性类的继承、父子类的初始化顺序、单继承性方法的覆盖、重载、super关键字、多态、instanceof关键字、强制类型转换、static关键字、final关键字数组和枚举一维数组的应用及内存分配多维数组的应用及内存分配数组的复制、数组的按引用传递排序算法:冒泡、直接选择、插入选择、希尔、快速、归并、堆排序Arrays工具类的应用枚举类型的应用常见类的使用Object类的底层及应用、Objects类String类的底层及应用、正则表达式StringBuffer和StringBuilder的底层及应用Math类的应用、包装类的应用日期类的应用:Date、DateFormat、Calendar、LocalDateTime、Instant、LocalDate、MonthDay、ZonedDateTime、YearMonth、新旧日期转换BigInteger和BingDecimal、DecimalFormatSystem类、Scanner类抽象类和接口抽象类的规则及应用接口的规则及应用默认方法、静态方法、函数式接口、Lambda表达式异常异常的定义异常的处理:抓(try-catch-finally)、抛(throws)异常的分类、自定义异常的应用、throw关键字集合框架集合框架结构:接口、实现类Collection接口的方法、Set接口的方法、List接口的方法、Map接口的方法Array、Linked、Hash、Tree底层实现原理泛型的作用、Collections工具类、历史集合类I/O流Path类的原理及应用、Files类的原理及应用文件字节流FileInputStream的原理及应用对象类、缓冲流、数据流的原理及应用字符流的原理及应用多线程进程与线程的概念、查看线程对象Java内存模型线程的创建与启动:扩展Thread类、实现Runnable接口、实现Callable接口、线程池线程状态的转换:新建、就绪、运行、阻塞、死亡线程的调度:sleep、yield、join、interrupt、wait后台线程、定时任务线程的并发与同步、同步锁、同步块、线程安全的类Lock接口、CAS、volatile修饰符内部类员内部类、本地内部类的应用匿名内部类的原理及引用、Lambda表达式设计模式基础设计模式概念、框架概念7大设计原则:开闭原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特原则、里氏替换原则、合复用原则单例模式、工厂模式、模板模式、代理模式、装饰模式、适配器模式、外观模式、策略模式、观察者模式、命令模式、备忘录模式、观察者模式反射反射包Class类的使用反射获取类属性、方法、构造器通过反射创建类对象/通过反射调用方法反射的应用

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧