黑马程序员技术交流社区

标题: static类和普通类到底有什么区别啊?谁能用通俗的语言给... [打印本页]

作者: sangyuan    时间: 2015-8-10 09:34
标题: static类和普通类到底有什么区别啊?谁能用通俗的语言给...
本帖最后由 sangyuan 于 2015-8-10 17:52 编辑
  1. public class Test9 {

  2.         public static void main(String ars[]) {
  3.                 Test9 t = new Test9();
  4.                 t.factorial(1000);
  5.                
  6.       //  factorial(1000);  //这样写就报错,说应将阶乘的数学运算原理封装成对象,为啥啊!!!

  7.         }
  8.         //将阶乘的数学运算原理封装成对象
  9.         public void factorial(int number) {
  10.                 //创建一个大数对象
  11.                 BigInteger result = new BigInteger("1");
  12.                 //利用循环计算1000!的值
  13.                 for (int i = 1; i <= number; i++) {
  14.                         BigInteger num = new BigInteger(String.valueOf(i));
  15.                         // 相当于result * = num;,但是大数不是基本数据类型,不能使用*运算符,用独有的方法
  16.                         result = result.multiply(num);
  17.                 }
  18.                 //将获得的值转成字符串
  19.                 String str = result.toString();
  20.                 //调用方法,获取res中一共有多少个0
  21.                 int zeroNum = Countzero(str);
  22.                 //输出结果
  23.                 System.out.println(number + "的阶乘为:" + "\n" + str);
  24.                 System.out.println(number + "的阶乘中所有的0的个数:" + zeroNum);
  25.         }

  26.         // 求阶乘结果所有的0的个数
  27.         public int Countzero(String str) {
  28.                 int count = 0;
  29.                 String regex = "0";
  30.                 //将给定的正则表达式即“0”编译到具有给定标志的模式中
  31.                 Pattern p = Pattern.compile(regex);  
  32.                 Matcher m = p.matcher(str);  //str为要匹配的序列

  33.                 //尝试查找与该模式匹配的输入序列的下一个子序列,
  34.                 //当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true。
  35.                 while (m.find()) {
  36.                         count++;
  37.                 }
  38.                 return count;
  39.         }
  40. }
复制代码

作者: Clouddd    时间: 2015-8-10 09:42
首先呢,static是”静态“、”全局“的意思。它可以用来修饰变量,方法还有代码块等。
只要你明白一点:被static修饰的代码会在类被JVM编译的同时会加载到内存里面。
所以被static修饰的方法和变量都属于静态的,都是被所有该类的实例所共享,即被static修饰的成员变量和成员方法独立于该类的任何对象。它不依赖类特定的实例,被类的所有实例共享。
static修饰的代码块也是一样,在编译的同时也会被加载到内存。举个栗子:对操作数据库的代码在整个程序过程中只需要被加载一次,就会选择把加载数据库的代码放在static中。
然后你有这着这个思想后,经过一些代码练习很快就可以掌握它啦,希望对你有用~
作者: code_linux    时间: 2015-8-15 13:50
看到标题毫不犹豫的进来了,看到代码毫不犹豫的醉了。。。表示竟然看不懂了{:2_33:}
作者: boboyuwu    时间: 2015-8-15 14:49
JAVA中调用成员方法都是对象名.方法()这就是面向对象思想,你那直接调用方法名是C语言的面向过程,这点需要转换,方法名前面加上static,就可以直接用方法名调用了,知道为什么直接用方法名会出错不,因为你方法在类中只有创建一个对象分配空间存放方法才可以调用,你直接调用没有分配空间方法都不在内存中杂用啊,内存中啥都没有啊
作者: pengbeilin    时间: 2015-8-15 15:06
同一个类中,静态只能掉用静态(静态函数只能调用静态函数,静态函数只能调用静态成员)
  1. public static void main(String ars[]) {
  2.                 Test9 t = new Test9();//这里是通过对象调用
  3.                 t.factorial(1000);
  4.                
  5.       //  factorial(1000);  //这样写就报错,说应将阶乘的数学运算原理封装成对象,为啥啊!!!
  6.     //为什么报错?主函数是静态的,你直接去调用非静态的函数!肯定会报错!你把下面的函数加上静态再试试
  7.         }
复制代码

作者: zhao1991    时间: 2015-8-15 17:42
static作用于类是只能用于内部类,其地位和类的静态成员一样




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