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 ,为什么会这样呢?
----------------解决方案--------------------------------------------------------
第一个问题 用static定义一个类方法 关键字是static 关键字return返回运算结果
你定义的是逻辑型的返回结果是false和true
如:return val <1; 意思是0<1
将返回ture
第二个问题 对象共享类变量 test 2(2) test3(2)……导致所有对象的这个类变量都将分配相同的内存!也可以这样理解:java中如果一个类创建的所有对象具有相同的引用,那么他们都将具有相同的实体!!
学习愉快啊!!!
----------------解决方案--------------------------------------------------------
谈谈我个人的理解:
第一个问题:
声明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是为了:不在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)……导致所有对象的这个类变量都将分配相同的内存
----------------解决方案--------------------------------------------------------
谈谈我个人的理解:
第一个问题:
声明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方法在编译期间决定.
----------------解决方案--------------------------------------------------------
申明类并在其中申明方法并不分配内存,但是实例化类是要分配内存的。
static方法可以不创建对象访问。如果方法不是static的,那么必须实例化类才能访问,这样就必须要分配一部分内存。
至于版主说的,我确实不知道,领教了,谢谢!
----------------解决方案--------------------------------------------------------
我发觉很多时候不好的教材会误导人
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定义一个类方法 关键字是static 关键字return返回运算结果
你定义的是逻辑型的返回结果是false和true
如:return val <1; 意思是0<1
将返回ture
第二个问题 对象共享类变量 test 2(2) test3(2)……导致所有对象的这个类变量都将分配相同的内存!也可以这样理解:java中如果一个类创建的所有对象具有相同的引用,那么他们都将具有相同的实体!!
学习愉快啊!!!
严重指出第二个的解释完全错误的,呵呵,易水辰 这个地方我确实没看明白不过确实不是你说的这回事情啊
第一点是错误的,声明为非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编辑过]
----------------解决方案--------------------------------------------------------
谢谢楼上几位貌似小弟不适合看这本java编程思想,有点负责,谢谢了!
----------------解决方案--------------------------------------------------------
我发觉很多时候不好的教材会误导人
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方法不存在多态,所以不存在动态调用,而静态调用不需要维护运行时决定调用哪个,所以速度应该会快,这个市我的理解了!呵呵
我怎么觉得标黄色的地方自相矛盾呢?
----------------解决方案--------------------------------------------------------
可能我没说清楚:
申明类并在其中申明方法并不分配内存,但是实例化类是要分配内存的。
static方法可以不创建对象访问。如果方法不是static的,那么必须实例化类才能访问,这样就必须要分配一部分内存。
至于版主说的,我确实不知道,领教了,谢谢!
不是,一样不占内存.
C++里的虚成员函数会占内存,因为实例里面带了一个函数指针表.
但Java不会.
如果你觉得不好理解,建议你去看看这篇文章:
http://java.csdn.net/page/2e28dedd-a57d-421a-bee1-39b7a08abdb1
然后把一个类的成员函数增加或减少,再用里面说的SizeOf函数来测试一下类实例的大小有没有变.
----------------解决方案--------------------------------------------------------