Java学习笔记(二)Java基本语法

Java的数据类型

$$
2 + 5
$$

Java是一门纯粹的面向对象编程语言,除了8个基本数据类型不是对象以外,其他的一切的都是对象。那么问题来了,这8个数据类型分别是啥?

基本数据类型

不难发现,Java的数据类型和C语言基本上都是一致的,两者都不包含字符串这种数据类型。尽管Java可以使用String str=Hello World!"这种方法来定义字符串,但其实和char str[] = "Hello World!"本质是一样的,也就是通过组合字符数据类型和数组来保存字符串。因此就对单引号和双引号进行了区分,而在Python里面没有单个字符,只有长度为1的字符串。

这几种基本数据类型可以相互转换,分为强制转换和自动转换两种类型,如下代码

//强制转换
int a = (int) (3.14 * 2.13)
// a =6
// 自动转换
float b = a
// b = 6.0

除了基本数据类型外,Java还有一种称之为引用类型,包括类、接口和数组类型以及特殊的null类型。所谓引用类型就是对一个对象的引用,听起来好像是C语言的指针一样,其实就是,只不过Java不再使用指针这个说法。

Java的运算符

Java的运算符有如下几种

  • 算术运算符: +, -, *, , %
  • 赋值运算符: =, +=, -= ...
  • 比较运算符: >, >=, <, <=, ==
  • 逻辑运算符: &&, ||, !
  • 位运算符: &, |, ~, ^, <<, >>, >>>. 从来没有用过,我很尴尬,只知道效率很高。
  • 三目运算符:(expression) ? 条件为真时 : 条件不为真时

通过将运算符和数据结合就构成了赋值表达式,而当使用多个类型的运算符时需要注意运算符之间的优先级关系。不过真实的编程世界不会存在多个运算符同时登场让你怀疑人生,以为自己在参加什么证书考试。如果有哪个程序员闲的蛋疼真的要这样做,直接开除好了,否则留着心累吗。

将运算符和不同数据类型进行结合就是运算表达式,运行结果不会直接丢掉,而是保存在变量中。

Java的变量

编程的本质可以认为就是对内存中的数据的访问和修改。计算机在内存中开辟空间用于存放数据,那么程序如何访问这些数据并进行修改呢?尽管每个数据在内存上都有一个确定的位置,但是程序员肯定是不会通过手动输入地址的方式来获取数据,而是为存放在内存中的数据赋予一个变量名,通过访问变量名的方式来对数据做一系列的修改。

Java和C都是强类型的编程语言,强类型有两种特征:1. 所有的变量都必须先声明后才能使用;2. 指定类型的变量只能接受类型与之匹配的值。也就是说下面这段Python代码在Java编译时会出错。

c = 1
c = 'abc'

在Java和C这种强类型语言中,你需要这样写:

int num = 1
char str[] = "abc"

强类型有一定的优点,能够提高运行速度,降低一些编码错误。对于我这种没有好好深入学习强类型语言的人而言,目前还在思索如何读取不定行数字符串输出成一个。不难发现Java中的变量定义由3部分组成:基本数据类型 + 变量名(声明符) + 变量值(可选)。当然后面指针的定义会稍微复杂。

Java的三种程序结构

1996年,计算机科学家Bohm和Jacopini证明了“无论一个算法是否简单,还是足够复杂,都可以用顺序结构,选择结构和循环结构这三种基本结构组合而成”。因此所有计算机编程语言都会具备这三个基本结构,以我浅显码代码生涯,还没有遇到一门语言不存在这三个基本组合。

顺序结构:顺序结构就是从上到下运行,行云流水,没有犹豫(条件语句),没有彷徨(循环语句),一直到程序运行结束为止。之前的HelloWorld祷告与就是如此。非常直白,不需要多余的解释。

分支结构:Java提供了两种常见的分支控制结构:if语句和switch语句。Python之父觉得switch没啥必要,所以Python里只有if-else。

循环结构:循环有三种,while, do while,for. 并且循环可以套循环。谈及循环结构就一定要说说breakcontinue两者的区别,前者是彻底不干,后者是当前循环内容不做,继续搞下一个循环。

数据结构:数组

基本数据类型的元素在内存中随机存放,数组是一种最常见的数据结构,用于将相同类型的数据存放在同一块内存区。在C/C++里面,数组一般都要和指针联系在一起。Java没有说指针这个概念,提出了引用类型。

数组定义

Java支持两种方式定义数组:

type[] arrayName;
type arrayName[];

我看的书里面推荐Java里使用数组时建议以第一种格式进行。因为第一种有着更好的可读性,一看就知道int和int[]是两种不同的数据类型,int是基本类型,而int[]就是引用类型。但是在C/C++里面,似乎只能用第二种格式。为什么不能用第一种格式呢?当我看到int *(&arry)[10] = ptrs,我觉得这就是一个原因吧。

还有Java定义数组不能指定数组的长度。因为定义数组只是定义了一个引用变量,并未指向任何有效的内存空间,也就是说没有内存空间来存储数组元素。只有当数组进行初始化后才能使用这个数组。

数组初始化

数组初始化意味着在内存中开辟一个空间,这个空间存放数组元素,每个数组元素都需要被赋值。这个值可以手动指定,也可以系统自动赋予,或者就是null数据类型。Java初始化数组由两种方式:静态初始化和动态初始化。

  • 静态初始化:程序员显式指定每个数组元素的初始值,系统决定数组长度
  • 动态初始化: 程序员显式指定数组长度,系统分配初始值

首先是静态是初始化的定义方法:

//方法1
int[] intArr //定义好一个int数组类型的变量,也就是引用变量
intArr = new int[] {5,6,7,8} // 将这个引用变量指向一个int数组
// 方法2,两步一起来
int[] intArr = {5,6,7,8}

动态初始化方法

// 方法1
int[] prices
price = new int[5]
// 方法2
price = new int[5]

数组使用

数组的常见用法就是访问数组元素,包括对数组元素进行赋值和取出数组元素的值。可以单独访问一个元素,也可以通过for循环和foreach循环的方式对数组进行遍历。当然foreach是Java5之后出现的特性,举个例子

public class forEachTest
{
    public static void main(String[] args)
    {
        int[] prices;
        prices = new int[5];
        for (int i =0; i < prices.length; ++i)
        {
            prices[i] = i;
        }
        //price是形参,prices则是数组名
        for (int price : prices)
        {
            System.out.println(price);
        }
    }
}

:foreach只能用于遍历数组,而不能对数组赋值。

数组的一些机制

为了更好理解的数组,你需要知道两个新的概念:堆(heap)和栈(stack)。

(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
(heap):是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。

我觉得你肯定会一脸懵逼的,所以看下图直观感受下数组在内存的存放形式。

数组在内存中的形式

数组分为数组引用变量和数组的实际对象,这两个存放在不同的位置。编程时通过数组引用变量对实际的数组对象进行修改。

基本数据类型的数组定义,初始化和数组操作的代码和内存中的变化如下

public class BasicArrayTest
{
    public static void main(String[] args)
    {
        int[] numArry;
        numArry = new int[8]
        for (int i = 0; i < numArry.length; ++i)
        {
            numArry[i] = i + 1;
            System.out.println(numArry[i]);
        }
    }
}

基本类型赋值

数组的拓展和用途

Java8增加一个工具类Arrays用于处理数组,可以在https://docs.oracle.com/javase/8/docs/api/index.html学习用法。

数组的用途也很广,比如说你可以编一个命令行围棋工具,但是目前的用途就是做题目。在知乎上有一个提问是一行Python能实现什么丧性病狂的功能,几个小例子告诉你, 一行Python代码能干哪些事. 我们要根据本次学习的Java基本语法实现

  • 输出特定字符"Love"拼成的心形
  • 输出Mandelbrot图像
  • 打印九九乘法表
  • 输出斐波那契数列

让我们用Java代码根据Mandelbrot的定义利用数组生成一副Mandelbrot图.先说一件很尴尬的事情,Java的基本数据类型里面没有复数,且我学Java时间合起来也不到3天,所以我就通过搜索引擎找到了一个复数类凑合用。代码如下,比起代码更重要的是对数学公式的理解。

public class Mandelbrot
{
    public static void main(String[] args)
    {
        // define the iteration
        int maxIterations = 100;
        // define the position range
        int xstart = -80;
        int xend   =  40;
        int ystart = -40;
        int yend   =  40;
        // define the scale
        double scalingFactor = 1.0 / 40;
        //define the two dimension array
        char[][] mandelbrot = new char[xend - xstart][yend-ystart];
        for (int x = xstart; x < xend; ++x)
        {
            for (int y = ystart; y < yend; ++y)
            {
                // whether the mod in the iteration will be large than 2
                Complex current = new Complex(x * scalingFactor, y * scalingFactor);
                Complex temp = current;
                for (int iter = 0; iter < maxIterations; ++iter)
                {
                    temp = temp.times(temp).plus(current);
                    if (temp.mod() > 2){
                        mandelbrot[x-xstart][y-ystart] = ' ';
                        break;
                    }else
                    {
                        mandelbrot[x-xstart][y-ystart] = '*';
                    }
                }
            }
        }
        // output the result
         for (int y = ystart; y < yend; ++y)
        {
            for (int x = xstart; x < xend; ++x)
            {
                System.out.print(mandelbrot[x-xstart][y-ystart]);
            }
            System.out.print('\n');
        }
    }
}

结果咋那么丑呢。。

Mandelbrot

参考资料:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,623评论 18 399
  • 有不少朋友在学习思维导图后都觉得思维发散很重要,但也比较难以掌握。其实这里是有技巧的:利用好联想的三个方向(相似、...
    礼明阅读 5,316评论 0 1
  • 习惯晨跑,跑步的时候觉得身边的事物很少停留在眼中。长长的街道,街道两旁的小店,小店里演绎的故事就像翻页一样,翻过就...
    沐子青少年心智培优教练阅读 401评论 0 2
  • 200 OK400 BadRequest 服务器无法解析请求的语法404 Not Found 找...
    莫_名阅读 315评论 0 0