| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1040 人关注过本帖
标题:程序疑问2
只看楼主 加入收藏
yynn
Rank: 1
等 级:新手上路
帖 子:279
专家分:0
注 册:2005-11-4
收藏
 问题点数:0 回复次数:18 
程序疑问2

public class ShortCircuit{
static boolean test1( int val){

System.out.println("test1(" +val+")");
System.out.println("result:"+(val<1));
return val <1;
}
static boolean test2(int val){
System.out.println("test2(" +val+")");
System.out.println("result:"+(val<2));
return val <2;
}
static boolean test3(int val){
System.out.println("test3(" +val+")");
System.out.println("result:"+(val<3));
return val <3;
}
public static void main(String[]args){
if(test1(0)&&test2(2)&&test3(2))
System.out.println("true");
else
System.out.println("false");
}
}
第一个问题为什么要static boolean static有点什么用,为什么要范围return呢
第二个问题是现在输出只有test1 test2
如果我把test2()的值改成1 就会有test1 test2 test3 ,为什么会这样呢?

搜索更多相关主题的帖子: 疑问 
2007-10-07 00:19
易水辰
Rank: 1
等 级:新手上路
威 望:1
帖 子:136
专家分:0
注 册:2007-6-17
收藏
得分:0 

第一个问题 用static定义一个类方法 关键字是static 关键字return返回运算结果
你定义的是逻辑型的返回结果是false和true
如:return val <1; 意思是0<1
将返回ture

第二个问题 对象共享类变量 test 2(2) test3(2)……导致所有对象的这个类变量都将分配相同的内存!也可以这样理解:java中如果一个类创建的所有对象具有相同的引用,那么他们都将具有相同的实体!!

学习愉快啊!!!


^_^没事咱就灌水哈^_^!!!
2007-10-07 00:49
batwyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:88
专家分:0
注 册:2007-4-16
收藏
得分:0 
谈谈我个人的理解:
第一个问题:
声明static是为了:不在main函数中对类进行实例化而节省内存
第二个问题:
程序是从左到右依次执行
对于语句:if(test1(0)&&test2(2)&&test3(2)),把test2(2)换成test(1),则test1(0)&&test2(1)的值为false,那么无论test3(2)结果如何,if括号内的结果一定是false,所以Java并没有执行test3(2),所以也就无法打印出test3了

2007-10-07 01:09
易水辰
Rank: 1
等 级:新手上路
威 望:1
帖 子:136
专家分:0
注 册:2007-6-17
收藏
得分:0 
以下是引用batwyx在2007-10-7 1:09:29的发言:
谈谈我个人的理解:
第一个问题:
声明static是为了:不在main函数中对类进行实例化而节省内存
第二个问题:
程序是从左到右依次执行
对于语句:if(test1(0)&&test2(2)&&test3(2)),把test2(2)换成test(1),则test1(0)&&test2(1)的值为false,那么无论test3(2)结果如何,if括号内的结果一定是false,所以Java并没有执行test3(2),所以也就无法打印出test3了

没有更改结果输出如下:
test1(0)
result:true
test2(2)
result:false
false // 逻辑与结果
更改以后输出如下:
test1(0)
result:true
test2(1)
result:true
test3(2)
result:true

true //逻辑与结果

test3(2)
result:true
//多了这个 答案只能是对象共享类变量 test 2(2) test3(2)……导致所有对象的这个类变量都将分配相同的内存


^_^没事咱就灌水哈^_^!!!
2007-10-08 11:38
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
收藏
得分:0 
以下是引用batwyx在2007-10-7 1:09:29的发言:
谈谈我个人的理解:
第一个问题:
声明static是为了:不在main函数中对类进行实例化而节省内存

第二个问题:
程序是从左到右依次执行
对于语句:if(test1(0)&&test2(2)&&test3(2)),把test2(2)换成test(1),则test1(0)&&test2(1)的值为false,那么无论test3(2)结果如何,if括号内的结果一定是false,所以Java并没有执行test3(2),所以也就无法打印出test3了

第一点是错误的,声明为非static并不会多用内存,JAVA的面向对象实现与C++不一样,C++会,但JAVA不会.
声明为static的好处是: static 方法都是自动final的,就是说调用的时候可以节省时间.因为非final的方法需要运行时动态决定,而final方法在编译期间决定.


My BlogClick Me
2007-10-08 11:43
batwyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:88
专家分:0
注 册:2007-4-16
收藏
得分:0 
回复:(Eastsun)以下是引用batwyx在2007-10-7 1:09:...
可能我没说清楚:
申明类并在其中申明方法并不分配内存,但是实例化类是要分配内存的。
static方法可以不创建对象访问。如果方法不是static的,那么必须实例化类才能访问,这样就必须要分配一部分内存。

至于版主说的,我确实不知道,领教了,谢谢!

2007-10-08 23:11
时空之蕊
Rank: 2
等 级:新手上路
威 望:3
帖 子:691
专家分:0
注 册:2004-10-31
收藏
得分:0 

我发觉很多时候不好的教材会误导人
static 仅仅是定义了一个静态的成员函数别无他意,仅仅是一个静态成员函数罢了!在这里为什么这样static实际上是因为java运行必须要main才能够运行,而main必须定义为static的,而static内部如果想要直接使用所在类的方法只能够直接调用static类型的引为main是static,所以这里就是这样了,实际上不定义为static也可以的,只是main里面必须首先实例化一个ShortCircuit类对象,才能直接调用非static类型函数
至于第二点:完全是基础知识 对于这一点batwyx 说得非常正确的 对于逻辑运算java和c,c++没有区别,从左到右运算,如果已经能够判断整个表达式的逻辑值那么不会去执行后面的运算了,也就是对于test1(0)&&test2(2)&&test3(2)实际上当test2(2)计算完成后可以判断整个表达式必然为false所以不会执行test3了

以下是引用易水辰在2007-10-7 0:49:07的发言:

第一个问题 用static定义一个类方法 关键字是static 关键字return返回运算结果
你定义的是逻辑型的返回结果是false和true
如:return val <1; 意思是0<1
将返回ture

第二个问题 对象共享类变量 test 2(2) test3(2)……导致所有对象的这个类变量都将分配相同的内存!也可以这样理解:java中如果一个类创建的所有对象具有相同的引用,那么他们都将具有相同的实体!!

学习愉快啊!!!

严重指出第二个的解释完全错误的,呵呵,易水辰 这个地方我确实没看明白不过确实不是你说的这回事情啊

以下是引用Eastsun在2007-10-8 11:43:05的发言:

第一点是错误的,声明为非static并不会多用内存,JAVA的面向对象实现与C++不一样,C++会,但JAVA不会.
声明为static的好处是: static 方法都是自动final的,就是说调用的时候可以节省时间.因为非final的方法需要运行时动态决定,而final方法在编译期间决定.

还是严重指出:声明为static并没有错,所谓只要javac通过了那就是可以执行的,那么就是正确的。
不过这个地方引出了一个问题:就是大家比较迷惑的吧?在实际开发过程中怎样使用static!而不是为了例子而使用static
第二点声明为static并不会自动变为final类型,楼上说的static会自动成为final类型的是错误的

补充一点:至于内存的分配,对于java的类是又classloader加载的,所以说内存这个问题没有实例化前类代码被加载进来是肯定需要占用内存的,对于任何方法对于同一个classloader是不会存在第二份copy的
至于说动态决定,调用可以节省时间,对于jdk1.3之后的动态调用实际上时间可以忽略不计,不过似乎说的也在理 final的 调用的时候可以节省时间,这个我不是很清楚了,不过觉得这个掉用应该是javac编译为字节代码的时候已经作为了静态调用连接了,因为final方法不存在多态,所以不存在动态调用,而静态调用不需要维护运行时决定调用哪个,所以速度应该会快,这个市我的理解了!呵呵

[此贴子已经被作者于2007-10-9 1:46:08编辑过]


我渴望掌控时空的核心——用最先进的技术,打造无比美丽的世界!
2007-10-09 01:38
yynn
Rank: 1
等 级:新手上路
帖 子:279
专家分:0
注 册:2005-11-4
收藏
得分:0 
谢谢楼上几位貌似小弟不适合看这本java编程思想,有点负责,谢谢了!

2007-10-09 05:22
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
收藏
得分:0 
以下是引用时空之蕊在2007-10-9 1:38:20的发言:

我发觉很多时候不好的教材会误导人
static 仅仅是定义了一个静态的成员函数别无他意,仅仅是一个静态成员函数罢了!在这里为什么这样static实际上是因为java运行必须要main才能够运行,而main必须定义为static的,而static内部如果想要直接使用所在类的方法只能够直接调用static类型的引为main是static,所以这里就是这样了,实际上不定义为static也可以的,只是main里面必须首先实例化一个ShortCircuit类对象,才能直接调用非static类型函数
至于第二点:完全是基础知识 对于这一点batwyx 说得非常正确的 对于逻辑运算java和c,c++没有区别,从左到右运算,如果已经能够判断整个表达式的逻辑值那么不会去执行后面的运算了,也就是对于test1(0)&&test2(2)&&test3(2)实际上当test2(2)计算完成后可以判断整个表达式必然为false所以不会执行test3了

严重指出第二个的解释完全错误的,呵呵,易水辰 这个地方我确实没看明白不过确实不是你说的这回事情啊

还是严重指出:声明为static并没有错,所谓只要javac通过了那就是可以执行的,那么就是正确的。
不过这个地方引出了一个问题:就是大家比较迷惑的吧?在实际开发过程中怎样使用static!而不是为了例子而使用static

第二点声明为static并不会自动变为final类型,楼上说的static会自动成为final类型的是错误的


补充一点:至于内存的分配,对于java的类是又classloader加载的,所以说内存这个问题没有实例化前类代码被加载进来是肯定需要占用内存的,对于任何方法对于同一个classloader是不会存在第二份copy的
至于说动态决定,调用可以节省时间,对于jdk1.3之后的动态调用实际上时间可以忽略不计,不过似乎说的也在理 final的 调用的时候可以节省时间,这个我不是很清楚了,不过觉得这个掉用应该是javac编译为字节代码的时候已经作为了静态调用连接了,因为final方法不存在多态,所以不存在动态调用,而静态调用不需要维护运行时决定调用哪个,所以速度应该会快,这个市我的理解了!呵呵


我怎么觉得标黄色的地方自相矛盾呢?


My BlogClick Me
2007-10-09 08:23
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
收藏
得分:0 
以下是引用batwyx在2007-10-8 23:11:56的发言:
可能我没说清楚:
申明类并在其中申明方法并不分配内存,但是实例化类是要分配内存的。
static方法可以不创建对象访问。如果方法不是static的,那么必须实例化类才能访问,这样就必须要分配一部分内存。

至于版主说的,我确实不知道,领教了,谢谢!

不是,一样不占内存.
C++里的虚成员函数会占内存,因为实例里面带了一个函数指针表.
但Java不会.
如果你觉得不好理解,建议你去看看这篇文章:
http://java.csdn.net/page/2e28dedd-a57d-421a-bee1-39b7a08abdb1
然后把一个类的成员函数增加或减少,再用里面说的SizeOf函数来测试一下类实例的大小有没有变.


My BlogClick Me
2007-10-09 08:32
快速回复:程序疑问2
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012899 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved