动手动脑一
动手动脑
一、EnumTest.java
package day02;
public class EnumTest {
public static void main(String[] args) {
Size s = Size.SMALL;
Size t = Size.LARGE;
// s和t引用同一个对象?
System.out.println(s == t);
// 是原始数据类型吗?
System.out.println(s.getClass().isPrimitive());
// 从字符串中转换
Size u = Size.valueOf("SMALL");
System.out.println(s == u); // true
// 列出它的所有值
for (Size value : Size.values()) {
System.out.println(value);
}
}
}
enum Size {
SMALL, MEDIUM, LARGE
};
相关问题:
1)类 class isPrimitive()方法
- 用于检查此class 对象是否表示原始类型。(boolean\char\byte\short\int\long\float\double\void)
- 此方法是一种非静态方法,只能通过类对象访问,如果尝试使用类名称访问该方法,则会收到错误消息。
2)System.out.println(s.getClass().isPrimitive());
- 调用enum中的方法。
3)Size u=Size.valueOf("SMALL");
- 对u进行赋值,与1相似,使用不同的赋值语句。
4)or(Size value:Size.values())
{
System.out.println(value);
}
- 对枚举进行遍历,并且找最大的。
5)enum Size{SMALL,MEDIUM,LARGE};
- 表明使用类ENUM,名字叫Size,其中有元素SMALL,MEDIUM,LARGE,这几个元素可以看做类中的对象。
6)System.out.println()
- System.out.println(s); //运行结果:SMALL(枚举直接提供了toString的方法)
- System.out.println(s.name());//运行结果:SMALL(打印名字)
- System.out.println(s.ordinal());///得到枚举在序列中的位置
- System.out.println(s.getClass());//得到枚举类
- System.out.println(s.getDeclaringClass());//返回本类的申明处
(摘自: https://blog.csdn.net/weixin_30251587/article/details/96731005 )
结论:
枚举类型的使用是借助 ENUM 这样一个类,这个类是 JAVA 枚举类型的公共基本类。枚举目的就是要让某个变量的取值只能为若干固定值中的一个。
枚举类型是引用类型。(除了八种基本类型外其他都是引用类型)
枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象,相同的值则引用同一个对象。
可以使用“==”和equals() 方法直接比对枚举变量的值。
二、数值的二进制表示:弄清楚反码、补码和原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的
反码:正数的反码还是等于原码;负数的反码就是他的原码除符号位外,按位取反。
补码:正数的补码等于他的原码,负数的补码等于反码+1。
原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
首先先猜想是由原码表示,程序验证
1 int a=1;
2 int b=-1;
3 int sum=a+b;
4 System.out.println(sum);
可知程序的结果为0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。显然出错,故java中数值并非是由原码储存
同理,在使用反码表示时,也会出现同样的问题: (00000001) 反+ (11111110)反 = (11111111)反 = ( -0 )
而在补码中这没有这个问题:(00000001)补 + (11111111)补 = (00000000)补 = ( 0 )
结论:在java中,数值是由补码表示的
(摘自: https://www.cnblogs.com/heiyang/p/9748054.html )
三、Addition.java (两数相加)
package day02;
import javax.swing.JOptionPane;
public class Addition {
public static void main(String[] args) {
String firstNumber;// first string entered gy user
String secondNumber;// second string entered by user
int number1; // first number to add
int number2;// second number to add
int sum;// sum of number1 and number2
// read in first number from user as a string
firstNumber = JOptionPane.showInputDialog("Enter first integer");
// read in second number from user as a string
secondNumber = JOptionPane.showInputDialog("Enter second integer");
// convent numbers from type String to type int
number1 = Integer.parseInt(firstNumber);
number2 = Integer.parseInt(secondNumber);
// add the numbers
sum = number1 + number2;
// display the results
JOptionPane.showMessageDialog(null, "The sum is" + sum, "Results", JOptionPane.PLAIN_MESSAGE);
System.exit(0);// terminate the program
}
};
相关问题:
1)关于integer
http://m.biancheng.net/view/890.html
2)java消息提示框JOptionPane的使用方法
https://blog.csdn.net/c1481118216/article/details/51921521?utm_source=app
https://www.jb51.net/article/157989.htm
四、Java变量遵循“同名变量的屏蔽原则”,请自己编写一些测试代码,有意识地在不同地方定义一些同名变量,看看输出的到底是哪个值。
package day02; public class Test { private static int value=1; public static void main(String[] args) { int value=2; System.out.println(value); } }
结果为 2
五、InputTest.java
在运行时读取用户输入有两种方法:
1)使用JOptionPane类的showInputDialog方法
String firstNumber=JOptionPane.showInputDialog("Enter:");
2)使用Scanner类 (JDK5.0以上)
package day02; import java.util.*; public class InputTest { public static void main(String[] args) { Scanner in = new Scanner(System.in); // get first input System.out.print("What is your name? "); String name = in.nextLine(); // get second input System.out.print("How old are you? "); int age = in.nextInt(); // display output on console System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1)); } }
六、Java中的类型转换:查查Java中每个数据类型所占的位数,和表示数值的范围,你能得出什么结论?
除了使用C的强制类型转换方式,还可以通过原始类型的包装类完成类型转换。
适用场景:同一个数据需要转换为多种类型,并且这一数据需要比较长期的使用。多数情况下,推荐直接使用强制类型转换的方式。
七、TestDouble.java
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)); } }
为什么double类型的数值进行运算得不到“数学上精确”的结果?
答:涉及到二进制与十进制的转换问题。
N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4=1×10²+2×10+3×(10的0次幂)+4×(10的-1次幂);其它进制的也是同理,
例如二进制数11.01=1×2+1×(2的0次幂)+0+1×(2的-2次幂)=十进制的3.25。
double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。
举个例子来说,比如要用4bit来表示小数3.26,从高到低位依次对应2的1,0,-1,-2次幂,根据最上面的分析,应当在二进制数11.01(对应十进制的3.25)和11.10(对应十进制的3.5)之间选择。
简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。
八、处理精度损失:TestBigDecimal.java
package day02; 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)); } }
注意:在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。
原因:
double +、-不能准确的代表BigDecimal(String) 16位有效数以上的数字在使用BigDecimal时,用*、/构造器创建
对象。BigDecimal所创建的对象不能使用传统的等算术运算符直接对其对象进行数学运算,必须调用相对应的方法。
方法中的参数必须是BigDecimal的对象。
九、以下代码的输出结果是什么?为什么会有这样的输出结果?
int X=100 ; int Y =200 ; System.out.println ("X+Y="+X+Y) ; System.out.println(X+Y+"=X+Y" );
package day02; 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"); } }
输出语句1里“+”为连接运算,与("X+Y="+(X+Y));不同,输出字符串“X+Y=”与X与Y,输出语句2里第一个“+”为加法运算符,第二个“+”为连接运算符。
***************************************************************************************************************************************************************
字符串转为数字的基本方法:
int number =Integer.parseInt(numberString);
类lnteger属于包 java.lang,它封装了一个int类型的整数,因此,它是原始数据类型int的“包装类”。
字符串转为浮点数:
number1=Double.parseDouble(firstNumber); number2=Double.parseDouble(secondNumber);