JFT_zhao 发表于 2013-01-02 22:38

JAVA类中关于static变量的疑问(成员变量)

/*********************************************************************
程序名称:杨辉三角以菱形对称输出
时间:2013年1月2日
作者:赵志新
收获:类中的静态不能被类中的函数直接使用,类中函数的变量全部为局部变量,即使函数名相同!
错误示例:见程序末尾

????????? 疑问:(实际好像又不这样:以输入菱形的大小:10,size=6为例,到例1处:size分别等于5、4,
                  例2处:size的值不变,等于4 ,到例3:size又等于初值6,即a等于6,
                  疑问?size的值明明改变为4了,怎么会突然恢复初值6呢?)
      
书本关于静态变量的解释:静态变量的范围可以跨类,甚至可以达到整个应用程序之内。静态变量,除了能在定义
它的类内存取,还能直接以“类名.静态变量”的方式在其他类内使用。

实际效果:以输入10为例
请输入菱形的大小:
10
       1
      1 1
   1 2 1
    1 3 3 1
   1 4 6 4 1
1 5 10 10 5 1
   1 4 6 4 1
    1 3 3 1
   1 2 1
      1 1
       1   
**********************************************************************/
import java.util.Scanner;//引用java自带的Scanner类
public class HelloJava{
        static int size;
        static int triangle[][]; //全局变量,但各个子函数不能直接调用,需要经过参数传递
    public static void main(String[] args) {
            Scanner scan= new Scanner(System.in);
                System.out.println("请输入菱形的大小:");
                int size=scan.nextInt();
                scan.close();
            size=size/2+1;                                                                        // 计算菱形大小
                triangle=YanghuiTriangle(size);//不赋值,全局变量triangle[][]得不到数据
                /********** 例 3 *************/
                int a=size;
                /*****************************/
                printRhombus(a,triangle);
               
    }
    /*
   把杨辉三角的值赋给二维矩阵
   */
    public static int[][] YanghuiTriangle(int size ){
            int triangle[][]=new int[];   //triangle[][]为局部变量,函数结束,其空间自动释放                                               
      for (int i = 0; i < triangle.length; i++) {                                               
            triangle=new int;                                                               
            for(int j=0;j<=triangle.length-1;j++){                                       
                if(j==0||j==triangle.length-1){                               
                  triangle=1;
                }else{                                                                       
                  triangle=triangle+triangle;
                }   
            }
      }
      /*********** 例1   ************/
      size--;//size 的确减小了,但实际不影响结果的正确输出
      size--;
      /*********************************/
      /*********** 例2   ***********/
       HelloJava.size--;//size 不变,实际也不影响正确输出
       HelloJava.size--;
       /*********************************/
      return triangle;//返回参数,否者printRhombus出现空指针报错
    }
    /*
   把二维矩阵按菱形的方式对称输出
   */
    public static void printRhombus(int size,int triangle[][]){//全局变量需要参数传递,否者出现空指针报错
            for (int i = 0; i < size ; i++) {
            for (int j = size; j > i + 1; j--) {
                System.out.print(" ");                                        // 输出左上角位置的空白
            }
            for (int j = 0; j < i + 1; j++) {
                    System.out.print(triangle+" ");                                        // 输出数组元素
            }
            System.out.println("");
      }
            for(int i=size-1;i>=0;i--){
                    for(int j=0;j<=size-1-i;j++){
                            System.out.print(" ");                                        // 输出左上角位置的空白
                    }
                    for(int j=0;j<i;j++){
                            System.out.print(triangle+" ");                                        // 输出数组元素
                    }
                    System.out.println("");
            }
    }
}

/*
import java.util.Scanner;
public class HelloJava{
        static int size;
        static int triangle[][];
    public static void main(String[] args) {
            Scanner scan= new Scanner(System.in);
                System.out.println("请输入菱形的大小:");
                int size=scan.nextInt();
                scan.close();
                if (size % 2 == 0) {
            size++;                                                                        // 计算菱形大小
      }
                YanghuiTriangle(size);
                printRhombus(size);//Exception in thread "main" java.lang.NullPointerException
                                      //at HelloJava.printHollowRhombus(HelloJava.java:41)
                                     //at HelloJava.main(HelloJava.java:14)                                  
    }
    public static void YanghuiTriangle(int size){
            int triangle[][]=new int[];                                                                // 创建二维数组
      for (int i = 0; i < triangle.length; i++) {                                                // 遍历二维数组的第一层
            triangle=new int;                                                                // 初始化第二层数组的大小
            for(int j=0;j<=triangle.length-1;j++){                                        // 遍历第二层数组
                if(i==0||j==0||j==triangle.length-1){                                // 将两侧的数组元素赋值为1
                  triangle=1;
                }else{                                                                                // 其它数值通过公式计算
                  triangle=triangle+triangle;
                }
                System.out.print(triangle+"\t");                                        // 输出数组元素
            }
            System.out.println();
      }
    }
    public static void printRhombus(int size) {
      for (int i = 0; i < size / 2 + 1; i++) {
            for (int j = size / 2 + 1; j > i + 1; j--) {
                System.out.print(" ");                                        // 输出左上角位置的空白
            }
            for (int j = 0; j < i + 1; j++) {
                    System.out.print(triangle+"\t");                                        // 输出数组元素
            }
            System.out.println("");
      }
    }
}

*/

ascept 发表于 2013-01-07 11:00

输出不同大小的图形的size不同,size应该设为实例变量而不是静态变量

zavakid 发表于 2013-01-09 14:48

static 是类的变量,不是实例的变量

方兆国 发表于 2013-01-09 15:11

本帖最后由 方兆国 于 2013-01-10 16:19 编辑

static的静态变量只能在本类或者子类中使用吧

PS:修改原因:不小心把静态变量写成了静态类

BurstRabbit 发表于 2013-01-10 11:31

JFT_zhao 发表于 2013-01-02 22:38 static/image/common/back.gif
/*********************************************************************
程序名称:杨辉三角以菱形对 ...

估计你对java的OO思想还欠缺了解,class之所以叫做类,是因为这是一种抽象,比如说人类,鸟类,鱼类。我们定义一个类比如人类,class person.人类具有什么特征:比如姓名name,年龄age,身高height.人类具有哪些行为:如吃饭,睡觉,唱歌。这样我定义一个类型.
public class Person{
private String name;//姓名
private int age;//年龄
private int height;//身高
public Person(String name,int age,int height){
this.name = name;
this.age = age;
this.height = height;
}
public void eat(){
System.out.println("i am eating");
}
public void sleep(){
System.out.println("i am sleeping");
}

public void sing(){
System.out.println("i am singing");
}

public static void main(String[] args){
Person xiaoming=new Peson("xiaoming",11,130);
xiaoming.eat();
xiaoming.sleep();
   
}
}

当你想让一个人去睡觉或者吃饭,你不可能让这一类人(即class)同时吃饭,你必须指定一个人吃饭,比如说小明.这就需要对Person进行实例化(Person xiaoming=new Peson()),产生小明这个对象。实例化的过程其实就是从抽象的人类到具体的某个人。操作小明这个对象进行吃饭(xiaoming.eat()),睡觉(xiaoming.sleep)的行为。假若把这群人类限定到一个小的范围内,比如Person类是一个班上所有人员的定义,建立这个班上的所有人员对象Person.
在上面的main 方法中加入
Person daxiong=new Person("daxiong",11,111);
Person xiaohong=new Person("xiaohong",10,120);
假若上面3个人属于一个班级,教师节快到了,他们都想给英语老师(只有一个英语老师)送礼物,那怎么知道英语老师收到了多少礼物?
我们定义一个变量presentNum,假若Person类中加入如下定义
private int presentNum=0;
public void givePresent(){
++presentNum;
System.out.println("teacher has got "+presentNum+"presents");
}
调用
xiaoming.givePresent();
daxiong.givePresent();
xiaohong.givePresent();
会出现所有打印都是:("teacher has got 1 presents"),因为presentNum为成员变量是每个实例化对象的专属特征,即xiaoming,daxong,xiaohong的各自特征,这个定义按照正确的理解含义不是英语老师收到多少礼物,而是每个人自己送了多少份礼物.就像执行xiaoming.givePresent();xiaoming.givePresent()在这两次次执行之后打印输出会变成teacher has got 2 presents一样,xiaoming送了2份礼物
那该如何实现呢?
把presentNum定义为static:(static指由此类无论有多少个对象(即实例),这个变量只有一个,这类似c语言的全局变量,而非static变量有多少实例就有多少个变量)
private static int presentNum=0;
那givePresent必须为static吗?
我们由面向对象来思考。givePresent()送礼物这个动作是类方法(static方法)还是成员方法(非static方法)。也就是说送礼物是抽象的类的动作(抽象的类并不是说这个类是抽象类,是指相对具体某个人而言)还是具体的一个人执行的动作。显而易见,是某个人的动作。
所以执行完成xiaoming.givePresent();
daxiong.givePresent();
xiaohong.givePresent();
会发现teacher has got 3 presents,
这才是我们真正想要的。
静态变量和成员变量初始化的顺序是不一样的
真正要理解透彻,最好去看java编程思想,要理解透彻,至少要看5-6遍,并且期间要多谢代码

JFT_zhao 发表于 2013-01-10 13:44

回复 3# zavakid


    谢谢,看书没看完,现在我知道了!谢谢

JFT_zhao 发表于 2013-01-10 13:46

回复 4# 方兆国


    谢谢,初学Java,看书没看完,现在我知道了!谢谢

JFT_zhao 发表于 2013-01-10 13:49

局部变量,size等于5,4是由于size参数传递值为6。HelloJava.size--调用静态常量,但静态常量没有在程序中使用,有可有无!
如果把 static int size 删掉,程序照样执行。但是调用 HelloJava.size--的确在作用,如果static int size=10;执行完后size=8.
           注意:这里调用size和triangle[][]两个参数的方法不同,在主方法public static void main(String[] args){}前者使用int size属于新建局部变量,后者直接使用triangle,属于调用静态常量.所以在主方法中使用静态常量有2种方法,一是直接使用,二是类名.变量。

JFT_zhao 发表于 2013-01-10 13:56

回复 5# BurstRabbit


    谢谢,初学java,对类还不是很透,使用上还是以结构化语言的方式,处理的思想还有些像C,只是会调用类库的函数。我会改进的。谢谢

JFT_zhao 发表于 2013-01-10 13:59

回复 2# ascept


    谢谢,我知道答案了。
页: [1]
查看完整版本: JAVA类中关于static变量的疑问(成员变量)