Java-01-问题解答
问题一:Java类文件是否只能有一个公有类?
1测试代码:
//信1603 李敦岳 20163520
//测试Java是否只能有一个公有类
//2017.10.2
public class Test {
//第一个公有类
public static void main(String[] args) {
//输出语句
System.out.println("Hello Word");
}
//第二个公有类
public class innerclass
{
//System.out.println("Hello Word");
}
}
2测试结果:
3结论:Java类文件中并非只能有一个公有类,可以有多个内部类,它可以是共有的。
问题二:把main()方法的返回值由 void 改为 int ,程序能编译通过吗?能运行吗?
1测试代码:
//信1603 李敦岳 20163520
//测试把main()方法的返回值由 void 改为 int ,程序能编译通过吗?能运行吗?
//2017.10.2
package helloword;
public class helloword {
public static int main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello Word");
return 0;
}
}
2测试截图:
3结论:在main方法中将void改为int程序可运行,能编译通过,需要在main方法里加入return 0
问题三:为什么java规定作为程序入口点的main() 方法静态的?
1静态方法可以直接用类名+方法名,不需要实例化对象,非静态方法需要实例化对象,通过对象调用该方法
2程序被打包为jar文件,给外界唯一的接口就是main方法。使用者双击jar文件,其实就是让虚拟机执行main方法
3main方法是提供给客户的,客户不知道怎么实例化对象,更不知道实例化对象需要输入什么参数,只能用静态方法
问题四:变量作用域
1测试代码:
//信1603 李敦岳 20163520
//测试变量作用域
//2017.9.26
public class Test1 {
private static int value=1;
public static void main(String[] args) {
int value=2;
System.out.println(value);
}
}
2测试截图:
(1):
(2):
3.结论:
类的变量的作用域是整个类,函数的变量作用域是整个函数,如果类中定义一个变量x,这个类的函数定义一个x,默认使用函数中的x。若函数中的最外层定义一个x,函数有循环,循环中定义一个x,就会有冲突。
问题五:查查Java中每个数据类型所占的位数,和表示数值的范围,你能得出什么结论?
对于字符型和整数型如:char,int,long,byte,short,取值范围小的转化为取值范围大的,无精度的损失,但整数型向浮点型如:float,double转化是会出现精度损失,浮点型取值范围小的转化为取值范围大的,无精度的损失。
问题六:请运行以下代码,你看到了什么样的输出,意外吗?
1.代码:
public class TestDouble {
public static void main(String args[]) {
System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
System.out.println("4.015 * 100 = " + (4.015 * 100));
System.out.println("123.3 / 100 = " + (123.3 / 100));
}
}
2.截图:
3.结论:结果有错误,并不精确。计算机只能识别二进制码,无论用什么编译器都是将程序转化为二进制的机器码。计算机进行加减乘除运算过程,带小数点的数字的二进制转化不一定准确
,浮点型可用于科学计算,但精确计算有误差。
问题七:在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题,为什么会这样呢?
1.涉及代码:
package 列子;
import java.math.BigDecimal;
public class TestBigDecimal
{
public static void main(String[] args)
{
BigDecimal f1 = new BigDecimal("0.05");
BigDecimal f2 = BigDecimal.valueOf(0.01);
BigDecimal f3 = new BigDecimal(0.05);
System.out.println("下面使用String作为BigDecimal构造器参数的计算结果:");
System.out.println("0.05 + 0.01 = " + f1.add(f2));
System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
System.out.println("0.05 / 0.01 = " + f1.divide(f2));
System.out.println("下面使用double作为BigDecimal构造器参数的计算结果:");
System.out.println("0.05 + 0.01 = " + f3.add(f2));
System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
System.out.println("0.05 / 0.01 = " + f3.divide(f2));
}
}
2截图:
3结论:在使用BigDecimal(double)构造器时,使用不恰当会出现精确的误差,二进制浮点数的局限性产生类型上述的问题
问题八:以下代码的输出结果是什么?为什么会有这样的输出结
1涉及代码:
public class Test {
public static void main(String[] args) {
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
}
}
2截图结果:
3结论:输出结果为X+Y=100200,300=X+Y。当"X+Y="在前时,默认的把int型X,Y转化为String型,"X+Y="使编译器认为X,Y是String型的了,System.out.println()本身的参数默认为String型,遇到这种情况默认了转化,产生了如此结果,而第二个就是简单的输出,没有让计算器产生“误解”。