免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4409 | 回复: 9
打印 上一主题 下一主题

JAVA类中关于static变量的疑问(成员变量) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-02 22:38 |只看该作者 |倒序浏览
/*********************************************************************
  程序名称:杨辉三角以菱形对称输出
  时间: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[size][];   //triangle[][]为局部变量,函数结束,其空间自动释放                                               
        for (int i = 0; i < triangle.length; i++) {                                               
            triangle[i]=new int[i+1];                                                               
            for(int j=0;j<=triangle[i].length-1;j++){                                       
                if(j==0||j==triangle[i].length-1){                               
                    triangle[i][j]=1;
                }else{                                                                       
                    triangle[i][j]=triangle[i-1][j]+triangle[i-1][j-1];
                }   
            }
        }
        /*********** 例  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[i][j]+" ");                                        // 输出数组元素  
            }
            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[i-1][j]+" ");                                        // 输出数组元素  
                    }
                    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[size][];                                                                // 创建二维数组
        for (int i = 0; i < triangle.length; i++) {                                                // 遍历二维数组的第一层
            triangle[i]=new int[i+1];                                                                // 初始化第二层数组的大小
            for(int j=0;j<=triangle[i].length-1;j++){                                        // 遍历第二层数组
                if(i==0||j==0||j==triangle[i].length-1){                                // 将两侧的数组元素赋值为1
                    triangle[i][j]=1;
                }else{                                                                                // 其它数值通过公式计算
                    triangle[i][j]=triangle[i-1][j]+triangle[i-1][j-1];
                }
                System.out.print(triangle[i][j]+"\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[i][j]+"\t");                                        // 输出数组元素  
            }
            System.out.println("");
        }
    }
}

*/

论坛徽章:
0
2 [报告]
发表于 2013-01-07 11:00 |只看该作者
输出不同大小的图形的size不同,size应该设为实例变量而不是静态变量

论坛徽章:
0
3 [报告]
发表于 2013-01-09 14:48 |只看该作者
static 是类的变量,不是实例的变量

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
4 [报告]
发表于 2013-01-09 15:11 |只看该作者
本帖最后由 方兆国 于 2013-01-10 16:19 编辑

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

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

论坛徽章:
0
5 [报告]
发表于 2013-01-10 11:31 |只看该作者
JFT_zhao 发表于 2013-01-02 22:38
/*********************************************************************
  程序名称:杨辉三角以菱形对 ...


估计你对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遍,并且期间要多谢代码

论坛徽章:
0
6 [报告]
发表于 2013-01-10 13:44 |只看该作者
回复 3# zavakid


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

论坛徽章:
0
7 [报告]
发表于 2013-01-10 13:46 |只看该作者
回复 4# 方兆国


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

论坛徽章:
0
8 [报告]
发表于 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种方法,一是直接使用,二是类名.变量。

论坛徽章:
0
9 [报告]
发表于 2013-01-10 13:56 |只看该作者
回复 5# BurstRabbit


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

论坛徽章:
0
10 [报告]
发表于 2013-01-10 13:59 |只看该作者
回复 2# ascept


    谢谢,我知道答案了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP