查看原文
其他

Java基本程序设计结构——数据类型

高司令的小迷弟 Java规途 2023-07-04
  • 注释

  • 数据类型

    • 基本数据类型概述

    • 整型

    • 浮点类型

    • char类型

    • boolean类型

Java应用程序

下面看一个最简单的应用程序,它的作用是发送一条消息到控制台窗口中:

public class FirstSample{
    public static void main(String[]args){
        
   System.out.println("We will never say  'HelloWorld!'");
       
    }
    
}

让我们来看看运行结果:

搞错了,重新来!

图一  运行结果

虽然很简单,但是所有的Java程序都具有这种结构。但同时也需要注意以下几点:

  1. Java区分大小写
  2. 关键字public被称为访问修饰符,表示公共访问权限,即:所有类都可以访问该程序。
  3. 关键字class表示这是一个类,即Java程序中所有的内容都包含在该类中。我们也可以将其想象为一种容器
  4. 类名 class Name是紧跟于class后的,主要规则是要以大写字母开头,后面可跟字母与数字,如果名字由多个单词组成,则每个单词的第一个字母都需要大写,不过长度没有限制。但不能使用**Java保留字**作为类名。
  5. 源代码的文件名与公共类名的名字相同,并且源代码的扩展名为.Java

(下面列出刚刚书写的程序的源代码文件名)

        图二 First Sample源代码文件

没错,就是这个logo  ⏭

  1. 程序的运行需要编译,编译后为.class后缀的文件(以我的Linux为例,在 /home/Ideaproject/ Javaprograme/out/production/javaprograme/com/company/下)

上图更直观

图三  First Sample字节码文件

  1. 运行编译的程序,JVM(虚拟机)总是从main方法(函数)处开始执行。因此必须要有main方法。
  2. 源代码中存在“{}”,即用“{}”来区分程序的各个部分,也被叫做
  3. Java中空白符号会被忽略,因此不必在意风格。
  4. 同时每个句子必须要以“;”结束,因此回车可不是语句结束的标志哦!
  5. 同时我们需要注意到System .out对象实际上是调用了一个println()方法,调用方式也比较独特,用“.”表示方法调用。

仔细看以下代码:

{
    System.out.println("We will never say 'HelloWorld!'");
    
}

println()中有一些用双引号括起来的字符串参数。我们运行它最终能够得到图一。

同时,println()方法可以直接输出

{
    System.out.println();
    
}

只是我们得不到任何东西,打印空字符。当然println()也有兄弟方法,如:print()printf()相信对于第二个(格式化输出字符),学习C语言的一定不会陌生的,因为我们的第一个C语言程序就有它。

int main(){
    
    printf();
}

注释

再进入下一个话题之前,我想引用鲁迅先生的至理名言来引出主题:

那么鲁迅先生所说的注释究竟是什么样的呢?我想应该是这样的

 /*
                           _ooOoo_
                          o8888888o
                          88" . "88
                          (| -_- |)
                          O\  =  /O
                       ____/`---'\____
                     .'  \\|     |//  `.
                    /  \\|||  :  |||//  \
                   /  _||||| -:- |||||-  \
                   |   | \\\  -  /// |   |
                   | \_|  ''\---/''  |   |
                   \  .-\__  `-`  ___/-. /
                 ___`. .'  /--.--\  `. . __
              ."" '<  `.___\_<|>_/___.'  >'"".
             | | :  `- \`.;`\ _ /`;.`/ - ` : | |
             \  \ `-.   \_ __\ /__ _/   .-` /  /
        ======`-.____`-.___\_____/___.-`____.-'======
                           `=---='
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
           佛祖保佑          万事胜意 
        */

佛曰:只渡有缘人。希望看到这段符号的小伙伴暴富走上人生巅峰 、万事胜意!见者有份。

相信很多小伙伴都读过高中的文言古文,一连串的不合逻辑的字词揉捏在一块,简直是头大,记得当初自己一到语文考试之前,都会默默祈祷,古文下的注释能够多点。这样能够帮助自己多理解一下文章。

从这里我们就可以看出注释是真的不能够少的,不然对于难理解的事物真的是云里雾里的。

当然说到注释,就不得不提我们Java代码的注释了。也许很多人会说,上面的第一个程序不也是没有注释的吗?就算再多的字,跟着程序慢慢走,也能走完吧。感觉可有可无啊。

这里我不做评论,给各位看一下Plus版本的程序:

/**
 * A {@code BufferedInputStream} adds
 * functionality to another input stream-namely,
 * the ability to buffer the input and to
 * support the {@code mark} and {@code reset}
 * methods. When  the {@code BufferedInputStream}
 * is created, an internal buffer array is
 * created. As bytes  from the stream are read
 * or skipped, the internal buffer is refilled
 * as necessary  from the contained input stream,
 * many bytes at a time. The {@code mark}
 * operation  remembers a point in the input
 * stream and the {@code reset} operation
 * causes all the  bytes read since the most
 * recent {@code mark} operation to be
 * reread before new bytes are  taken from
 * the contained input stream.
 *
 * @author  Arthur van Hoff
 * @since   1.0
 */

public class BufferedInputStream extends FilterInputStream {
    //java io

    private static int DEFAULT_BUFFER_SIZE = 8192;

    /**
     * As this class is used early during bootstrap, it's motivated to use
     * Unsafe.compareAndSetObject instead of AtomicReferenceFieldUpdater
     * (or VarHandles) to reduce dependencies and improve startup time.
     */

    private static final Unsafe U = Unsafe.getUnsafe();

    private static final long BUF_OFFSET
            = U.objectFieldOffset(BufferedInputStream.class, "buf");

    /**
     * The internal buffer array where the data is stored. When necessary,
     * it may be replaced by another array of
     * a different size.
     */

   

别指望着我,我是不会翻译的(各位如果觉得自己英语还行的话,可以尝试一下)

当然懒人有懒办法

好了现在终于知道要写注释的原因了。当然写注释不难,把注释写好还是有难度的,最基本的要掌握它固定的格式:

  • // 单行注释,从“//”开始直到这一行结束都是注释的内容,示例见Plus程序的23行
  • /* */ 多行注释 ,可以很清楚看到这是一个范围的概念。适用于注释内容较长时使用,毕竟一个一个打也浪费时间。
  • /** */文档注释,顾名思义,就是一片小文档,集中来解释这段程序或这一段代码要表达的意思。但是Java知道为我们减负,可自动生成。简直懒人福音。

当然也许有人会这么想:/* 和*/ 好像区别不大,可以这么做,岂不是更美滋滋

/*
XXXXX
 */

*/
    

很遗憾,/* */注释不能嵌套,不能够简单地把代码用 他们括起来,可能代码本身也含有   */界定符。

好了,现在已经知道了一个简单程序最基本的结构以及怎样为自己代码锦上添花,让我们继续走……

数据类型

在上一期的初始介绍中,我们知道了Java是一种强类型的语言,顾名思义:Java特别看中你所使用及你想做的事究竟是什么,具体长什么样。

需要提前说明的是Java类型可以分为两种:基本类型引用类型。今天我们从简单的开始

简单点

基本数据类型概述

上面说到Java是一种强类型的语言,因此程序中必然十分重视类型,类型就好像法律一般,限制某些程序或者组织某些不合语言规范的行为。

总的来说,Java一共有8种基本类型,4种整型 byte short int long 、2种浮点型float double、1种字符型char和1种用于表示真假值boolean类型。

那让我们从多到少来介绍吧!

整型

整型,从名字中可以看出它表示整数,不能够带小数点,同时能够允许是负数,因此Java没有任何无符号的类型。

Java提供了四种类型:

我愿称之为四大天王 🀄🀄🀄🀄🀄🀄

四大天王

上表:

类型存储需求取值范围
int4字节-2147483648~2147483647
short2字节-32768~32767
long8字节-9223372036854775808~9223372036854775807
byte1字节-128~127

一般情况下

  • int最常用,使用频率最高
  • shortbyte用于特定的场合
  • long主要使用在处理较大的场景时才会使用

在这里,Java有一个十分让人欣喜的地方:可移植性,即:你不必担心你所使用的平台或处理器是否会限制Java整型的发挥。

学习过C/C++的小伙伴肯定曾经被各种形式的整数溢出所困扰过。在Java中所有的整型的范围都必须是固定的,与机器平台无关。

注意:

凡事都不是绝对的,如果想要使用不可能为负的整数值且确实需要一位,也可以把有符号的数解释为无符号的数。不过得分情况讨论:

  • 对于byte来说,可以表示为0~255的范围,只要保证不溢出,加减乘法都可以正常计算。其他运算需要用到其包装类Byte的toUnsignedInt()方法来得到一个int值,处理之后再将其转回byte类型。
  • Integer和Long类(int和long包装类)都提供了处理无符号除法和求余数的方法。

好了大致了解了整型,接下来认识一下小数吧。

小鸭子

浮点类型

见名知义,点即表示小数点,浮点说明小数点的位置是不断变化的。当然这似乎与Java关系不太大,我们只需要知道Java中浮点数有2个:float和double

类型存储需求取值范围
float4字节大约3.402823 47 E+38 F(有效位数6~7位)
double8字节大约1.79769313486231570 E+308(有效位数为15位)

从表中可以看出float需要4字节,double需要8字节存储,因此有人称float为单精度浮点型,称double为双精度浮点型

什么乱七八糟的数字?

但在一般实际情况中,float只有很少的情况下用到,主要用的是double。

同时需要注意的是所有浮点数值计算都遵循IEEE754规范,并且浮点数的计算不适用于舍入误差运算,因为二进制无法精确地表达某些数。

很不幸,人们在设计程序时总是不能够十全十美,以下有3种表示溢出和出错情况的3个特殊浮点常量数值:

  • 正无穷大 Double.POSTIVE_INFINITY
  • 负无穷大        Double.NEGATIVE_INFINITY
  • Na N(不是一个数字)  Double.NaN

这就是浮点数的内容,是不是很简单?不过接下来介绍的这个类型可是有点复杂的,一起来看看吧!

char类型

char类型又名字符型,表示单个字符,用单引号''来将内容(字面量)表示起来以示区分。

这个字符型的特殊之处在于可以与Unicode编码相对应,有些一个char值描述一个Unicode值,有些需要两个char值才能描述一个Unicode值这样听起来似乎有点模棱两可,所以我先介绍Unicode编码。

Unicode编码机制

起因

在正式了解Unicode编码机制之前,请允许我给你们举个例子:

假设你是一名民族学的学生,你班上有很多少数民族同学,其中有一个跟你关系还不错的回族哥们(姐妹)。有一天你们一起出去游玩,到了饭点,一起去往一个餐馆准备大吃一顿,到了点菜的时候,你可能就会很犯难,自己明明喜欢吃猪肉,但是不能够点。这是因为猪肉在不同民族之间所代表的含义有着天壤之别。同样矛盾是具有普遍性的,编码也存在类似的问题。

现在回到编码问题,开始上历史课:

不想背历史

早在Unicode出现之前,世界上很多国家就已经针对编码问题并结合了本国的实际制定了相应的编码标准,比较著名的有:美国的ASCII码,西欧的ISO 8859-1,俄罗斯的KO I -8,还有就是我们中国的GB 18030和BIG-5等。

既符号本国实际,又制定了相应的标准,这样不是挺好的吗?也许有人会这么想。

但其实不然,这样的多编码标准容易导致两个问题:

  1. 对于给定的代码值,不同的编码方案对应着不同的字母

这就好比我明明想表达的意思是你好,在对方的编码标准下可能意思变为烦死了。这就阻碍了交流。

  1. 采用大字符集的语言其编码长度可能有所不同,有些字符采用单字节编码,有些采用多字节编码。
问题
发展

当然有这些问题,自然也就有相应的解决办法,于是就有人在1991年发布了Unicode 1.0,当时仅用了65536个代码值中不到一半的部分。

当然我们还是想的太简单了,世界这么大,设计者应该多出去看看,不只有ABC,还有表意文字。因此,Unicode 字符很快便超出了65536个字符。像比较著名的当然首推我们的汉字。

字符
结果

Java的设计者当然也能够意识到这样的问题

因此Java采用了UTF-16的编码格式,用来表示所有的Unicode码点。在这里我们不需要深究UTF-16到底长什么样,只需要知道在Java中char类型描述的是UTF-16编码中的一个代码单元就可以了

同时强烈建议不要在程序中使用char类型,除非需要处理UTF-16代码单元

好了,说完了字符类型,接下来轮到最简单的角色登场了!

boolean类型

相信你肯定见过别人吵架,这种事情经常发生在初中或者小学,A同学与B同学因为某些小事就大打出手,又是干架,又是展现中华文化的独特的“家人文化”,好了,事情越闹越大,最后都被叫到办公室去了。相信这一幕你也是司空见惯:A同学说自己是为了维护自己的权利,错在B同学,当然B同学也不甘示弱。最后会怎么样呢?老师也知道肯定是有一个先犯错的,只是需要慢慢去查证。

好了,回到正题,boolean类型就是这样的一种形式,也许上面的例子有点不太恰当。但是表达的主题思想是一样的。

boolean类型只有两种值:一种是true

正确

一种是false

错误

是不是有点像在做判断题?没错,它就是用来判断逻辑条件。

我相信一定有小伙伴曾经学过C++语言,,在C++中,数值甚至是指针都可以代替boolean值,0代表false,其他非0值代表true。这看起来似乎好像也很合理,但在具体的实践中就会出现问题:

if(x=0){
    xxxxx;
}

这个程序在C++中可以运行,但在Java中却不可以被运行,因为x=0不能够转换成boolean值来判断条件真假。

好了,这就是我们今天先需要了解的数据类型基础,这些是Java语言的根基。

最后各位小伙伴万事胜意,心想事成!

人物-心想事成


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存