JAVA语法02之课程问题解决

(一)示例程序+运行结果:

①EnumTest.java

 1 public class EnumTest {
 2
 3     public static void main(String[] args) {
 4         Size s=Size.SMALL;
 5         Size t=Size.LARGE;
 6         //s和t引用同一个对象?
 7         System.out.println(s==t);  //
 8         //是原始数据类型吗?
 9         System.out.println(s.getClass().isPrimitive());
10         //从字符串中转换
11         Size u=Size.valueOf("SMALL");
12         System.out.println(s==u);  //true
13         //列出它的所有值
14         for(Size value:Size.values()){
15             System.out.println(value);
16         }
17     }
18
19 }
20  enum Size{SMALL,MEDIUM,LARGE};

运行结果:

②Addition.java

 1 // An addition program
 2
 3 import javax.swing.JOptionPane;  // import class JOptionPane
 4
 5 public class Addition {
 6    public static void main( String args[] )
 7    {
 8       String firstNumber,   // first string entered by user
 9              secondNumber;  // second string entered by user
10       int number1,          // first number to add
11           number2,          // second number to add
12           sum;              // sum of number1 and number2
13
14       // read in first number from user as a string
15       firstNumber =
16          JOptionPane.showInputDialog( "Enter first integer" );
17
18       // read in second number from user as a string
19       secondNumber =
20          JOptionPane.showInputDialog( "Enter second integer" );
21
22       // convert numbers from type String to type int
23       number1 = Integer.parseInt( firstNumber );
24       number2 = Integer.parseInt( secondNumber );
25
26       // add the numbers
27       sum = number1 + number2;
28
29       // display the results
30       JOptionPane.showMessageDialog(
31          null, "The sum is " + sum, "Results",
32          JOptionPane.PLAIN_MESSAGE );
33
34       System.exit( 0 );   // terminate the program
35    }
36 }

运行结果:

    

③InputTest.java

 1 import java.util.*;
 2
 3 public class InputTest
 4 {
 5    public static void main(String[] args)
 6    {
 7       Scanner in = new Scanner(System.in);
 8
 9       // get first input
10       System.out.print("What is your name? ");
11       String name = in.nextLine();
12
13       // get second input
14       System.out.print("How old are you? ");
15       int age = in.nextInt();
16
17
18     /* int i;
19      String value="100";
20      i=Integer.parseInt(value);
21      i=200;
22      String s=String.valueOf(i);*/
23
24       // display output on console
25       System.out.println("Hello, " + name + ". Next year, you‘ll be " + (age + 1));
26
27
28    }
29 }

输出结果:

④TestDouble.java

1 public class TestDouble {
2
3     public static void main(String args[]) {
4         System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
5         System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
6         System.out.println("4.015 * 100 = " + (4.015 * 100));
7         System.out.println("123.3 / 100 = " + (123.3 / 100));
8     }
9 }

运行结果:

1 public class Test {
2
3     public static void main(String args[]) {
4         int X=100;
5         int Y=200;
6         System.out.println("X+Y="+X+Y);
7         System.out.println(X+Y+"=X+Y");
8     }
9 }

运行结果:

结论:引号里输出原有的。

(二)课后练习:

    1.阅读相应教材,或者使用互联网搜索引擎,弄清楚反码、补码跟原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的。

①原码:原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

②反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

③补码:正数的补码与其原码相同;负数的补码是符号位不变,剩下的对其原码逐位取反,最后加1。

如1的原码:0000 0001,其反码和补码都为:0000 0001。

-1的原码:1000 0001,其反码:1111 1110,补码:1111 1111.

因为正数的反码、补码都与原码相同,所以直接对复数进行操作。

原始结果:

位运算1(左移<<)

位运算2(右移>>)

位运算3(位或|)

位运算4(位与&)

位运算5(位异或^)

经查询并排除原码和反码,JAVA中的数是用补码表示的。

 2.Java变量遵循“同名变量的屏蔽原则”,请课后阅读相关资料弄清楚相关知识,然后自己编写一些测试代码,就象本示例一样,有意识地在不同地方定义一些同名变量,看看输出的到底是哪个值。

1 public class Test2 {
2
3     private static int value=1;
4
5     public static void main(String[] args) {
6         // TODO Auto-generated method stub
7         int value=2;
8        System.out.println(value);
9     }

输出结果:2

1 public class Test2 {
2
3     public static void main(String[] args) {
4         // TODO Auto-generated method stub
5         int value=2;
6        System.out.println(value);
7     }
8    private static int value=1;
9 }

输出结果:2

 1 public class Test2 {
 2
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         int x=1;
 6         while(x>0)
 7         {
 8             int value=1;
 9             x--;
10         }
11         int value=2;
12        System.out.println(value);
13     }
14 }

输出结果:2

结论:如果类里面定义一个x,在这个类的函数中也定义一个x,这种情况不会冲突,默认会优先使用函数中的x,类中的x要加上this.来区分,这算是有冲突但是用默认谁优先来解决,这算是的特殊情况。

如果一个函数中(最外层)定义了x,在函数中的另外一处也定义了x,或者说在函数的某个循环中定义了x,就会引起冲突。

如果在一个函数的一个循环A中定义了x,循环B中也定义了x,只要A,B不是相互包含的,那么也不会有冲突

   3.为什么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,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。

  4.在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。(为什么会这样呢?)

Double,不能准确地代表16位有效数以上的数字,在使用BigDecimal时,应用 BigDecimal(String)构造器创建对象才有意义。另外,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算 符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。

时间: 2024-10-19 05:08:04

JAVA语法02之课程问题解决的相关文章

JAVA字符串05之课程问题解决

(一)古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:请编写一个程序,使用上述算法加密或解密用户输入的英文字串. 1.设计思想:首先选择是加密字符串还是解密字符串,两种算法相似.如果要加密字符串,则需要考虑特殊字符,就是XYZ这三个字符:相应的解密字符串类似,也需要考虑ABC这三个字符. 2.程序流程图 3.源代码 import java.util.Scanner; public class work1 { public static void main(String[] args) {

程序员带你学习安卓开发,十天快速入-对比C#学习java语法

关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到熟悉的效果. 上次课程:.程序员带你学习安卓开发,十天快速入门-开发工具配置学习讲的是java环境的配置以及as安装工具的安装. 其中有网友@鹅鹅鹅_说道,其实jdk的环境变量配置,不用配置的那么麻烦了.当前的jdk版本只要设置一个变量javahome就可以了,其他的可以不需要配置.在这里提一下.

Java架构师VIP课程一期共89G视频教程 luban it教程

集数合计:14讲Java视频教程详情描述: A0505<Java架构师VIP课程一期共89G视频教程>Java架构师VIP课程一期共89G视频教程 鲁班学院 课件资料全Java视频教程目录: 百度网盘下载点击 ├─撸搬架构├─01.并发专题(一)│      2018-09-11(1)-Java内存模型│      2018-09-13(2)-synchronized原理│      2018-09-16(3)-volatile实现机制│      2018-09-18(4)-DCL-单例模式

鲁班 Java架构师VIP课程一期共89G视频教程 luban it教程

Java视频教程详情描述: A0505<Java架构师VIP课程一期共89G视频教程>Java架构师VIP课程一期共89G视频教程 鲁班学院 课件资料全Java视频教程目录 ├─撸搬架构├─01.并发专题(一)│      2018-09-11(1)-Java内存模型│      2018-09-13(2)-synchronized原理│      2018-09-16(3)-volatile实现机制│      2018-09-18(4)-DCL-单例模式│      2018-09-21(

鲁班学院最新架构师资料《Java架构师VIP课程》

鲁班学院最新架构师资料<Java架构师VIP2019课程一期> 课程目录: ├─01.并发专题(一) │ 2018-09-11(1)-Java内存模型 │ 2018-09-13(2)-synchronized原理 │ 2018-09-16(3)-volatile实现机制 │ 2018-09-18(4)-DCL-单例模式 │ 2018-09-21(5)-并发基础-AQS.CAS2 │ 2018-09-25(6)-并发集合 │ 2018-09-27(7)-原子操作-基本类型 │ 2018-09-3

eclipse使用与java语法规则

eclipse的使用 1.运行点击"三角图标"或右键Run As运行2.3. java语法规范 1.括号要成对出现2.每句代码应该有分号结束3.java语法区分大小写4.一个文件只能写一个带有public的class声明,还必须和文件名一致.一个文件中不可以有多个带有public的修饰符号5.名称写的时候不要包含关键字和非法字符(字母和下划线开头可以,也可以用数字结尾)6.java代码的语法全部都是半角符号7.学会规范的写代码. 写代码的好习惯: 1.常按保存,写完一句或几句就按一次C

There is insufficient memory for the Java Runtime Environment to continue问题解决

在linux系统下长时间进行性能测试,连续几次发生服务器假死无法连接上的情况,无奈只能重启服务器.在测试路径下发现hs_err_pid17285.log文件,打开文件查看其主要内容如下: # There is insufficient memory for the Java Runtime Environment to continue.# Cannot create GC thread. Out of system resources.# Possible reasons:#   The sy

Java语法基础

Java语法基础 1.  关键字 某些单词对编译器有着特殊的含义,并且不能作为标示符使用,全部是小写字母 Java语言关键字 abstract boolean break byte case catch char class try do default continue double else extends assert final finally float for If implement import instanceof int interface long native new g

深入理解java虚拟机(十二) Java 语法糖背后的真相

语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言的功能产生任何影响,却能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会.但是如果只是大量添加和使用语法糖,却不去了解他,容易产生过度依赖,从而无法看清语法糖的糖衣背后,程序代码的真实面目. 总而言之,语法糖可以看做是编译器实现的一些"小把戏",这些"小