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("");
}
}
}
*/
输出不同大小的图形的size不同,size应该设为实例变量而不是静态变量 static 是类的变量,不是实例的变量 本帖最后由 方兆国 于 2013-01-10 16:19 编辑
static的静态变量只能在本类或者子类中使用吧
PS:修改原因:不小心把静态变量写成了静态类 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遍,并且期间要多谢代码 回复 3# zavakid
谢谢,看书没看完,现在我知道了!谢谢 回复 4# 方兆国
谢谢,初学Java,看书没看完,现在我知道了!谢谢 局部变量,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种方法,一是直接使用,二是类名.变量。 回复 5# BurstRabbit
谢谢,初学java,对类还不是很透,使用上还是以结构化语言的方式,处理的思想还有些像C,只是会调用类库的函数。我会改进的。谢谢 回复 2# ascept
谢谢,我知道答案了。
页:
[1]