动手动脑
一、import java.util.Scanner;
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};
枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。 可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的。反码:左边第一位为符号位,0”表示正,1”表示负。正数的反码与原码一样,负数的反码,其数值部分按原码的每位求反,即将原码中的0”变为1”,而将1”变成0”。原码是指一个二进制数左边加上符号位后所得到的码,且当二进制数大于0时,符号位为0;二进制数小于0时,符号位为1;二进制数等于0时,符号位可以为0或1。补码(Two's complement),是有符号数的一种二进制表示方式。
import java.util.Scanner;
public class SignConversion {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个十进制数:");
int number = scanner.nextInt();
System.out.println("输入的十进制数:" + number);
System.out.println("对应的原码:" + getOriginalCode(number));
System.out.println("对应的补码:" + getComplementCode(number));
} // 获取原码
public static String getOriginalCode(int number) {
StringBuilder originalCode = new StringBuilder();
int temp = Math.abs(number); // 取绝对值
while (temp > 0) {
originalCode.insert(0, temp % 2); temp /= 2;
}
if (number < 0) {
originalCode.insert(0, "-"); // 如果是负数,在最前面加上负号“-”
}
return originalCode.toString();
} // 获取补码
public static String getComplementCode(int number) {
if (number >= 0) {
return getOriginalCode(number); // 对于非负数,补码与原码相同
}
else {
String originalCode = getOriginalCode(number);
StringBuilder complementCode = new StringBuilder();
boolean carry = false; // 进位标志
for (int i = originalCode.length() - 1; i >= 0; i--)
{
char c = originalCode.charAt(i);
if (c == '-') {
complementCode.insert(0, "-"); // 负号“-”不变
}
else {
int bit = Character.getNumericValue(c);
int complementBit = (bit ^ 1) ^ (carry ? 1 : 0); // 按位取反再加上进位
complementCode.insert(0, complementBit); carry = (bit == 1 && !carry); // 如果该位是1且没有进位,设置进位标志为true
}
}
return complementCode.toString();
}
}
}
二、
import javax.swing.JOptionPane;
public class Addition {
public static void main( String args[] )
{
String firstNumber, // first string entered by user
secondNumber; // second string entered by user
int number1, // first number to add
number2, // second number to add
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" );
// convert 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
}
}
public class Test {
private static int value=1;
public static void main(String[] args){
int value=2;
System.out.println(value);
}
}
输出结果是2,如果去掉“int value=2;”这行代码则输出结果为1,这是因为:Java变量遵循“同名变量的屏蔽原则”。如果想输出value=1,可以用“System.out.println(Test.value);”
其中第一个value是成员变量,也是全局变量。第二个是局部变量。在Java中,局部变量能够覆盖全局变量,在局部使用某个变量的时候JVM会优先找和当前使用位置近的变量定义
三、
byte的表示位数为-128~127
short的表示位数是为-32768~32767
int的表示位数为-2147483648~2147483647
long的表示位数为-9223372036854775808~9223372036854775807
float的表示位数为1.4E-45~3.4028235E38
double的表示位数为4.9E-324~1.7976931348623157E308
char的表示位数为-128 ~ +127
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+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次方)。
五、
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));
}
}
六、
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
输出结果为
为什么会有这样的输出结果?
Java中的加号有时是连接符,有时是运算符:
1>当左右两边连接的都是非数字型时,则为连接符。
2>当一边是数值类型,另一边是非数值类型时,则为连接符。
3>当两边都是数值类型时,则为运算符,即相加求和的作用。
第一个是连接符,第二个是运算符。