开发者社区> 徐洲更> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: Java的数据类型 $$ 2 + 5 $$ Java是一门纯粹的面向对象编程语言,除了8个基本数据类型不是对象以外,其他的一切的都是对象。那么问题来了,这8个数据类型分别是啥? 基本数据类型 不难发现,Java的数据类型和C语言基本上都是一致的,两者都不包含字符串这种数据类型。
+关注继续查看

Java的数据类型

$$
2 + 5
$$

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

img_636eebd786b4af2e00adb902a2805f1b.png
基本数据类型

不难发现,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):是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。

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

img_c004153db2bb81d8974ccf721874e650.png
数组在内存中的形式

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

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

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]);
        }
    }
}

img_469de60f01c4b90268b529766faa796b.gif
基本类型赋值

数组的拓展和用途

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');
        }
    }
}

结果咋那么丑呢。。

img_6e31024fae172e419e15c1d09c36bd04.png
Mandelbrot

参考资料:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java8语法最佳实践-什么是对象(下)
计算机革命起源机器。编程语言就像是那台机器。它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程语言就是创建应用程序的思想结构。
37 0
Java8语法最佳实践-什么是对象(上)
计算机革命起源机器。编程语言就像是那台机器。它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程语言就是创建应用程序的思想结构。
68 0
基于java SSM医药住院管理系统设计和实现
主要功能设计:入院管理,登记、出院登记、查询、转房、病房管理、病房价格调整、缴费和记录、护理、住院历史、统计、药品管理、医生、用户、系统 springMVC spring mybatis jquery js css tomcat mysql
82 0
基于Java SSM springboot健身管理系统设计和实现
主要功能设计:用户登录、会员管理、教练管理、课程管理、器材管理、会员充值、物品遗失、商品管理、信息统计、修改密码 主要技术:springmvc、 springboot 、mybatis、mysql 、jQuery、layui、css、jsp shiro权限控制
63 0
基于java Springmvc+mybatis 电影院售票管理系统设计和实现以及文档
主要技术:Java springmvc mybatis jquery spring js css mysql tomcat等 主要功能描述: 客户端主要功能有: 1.用户登录注册、
67 0
基于java springboot+mybatis OA办公自动化系统设计和实现
java springbootOA办公自动化系统: 主要功能模块:系统、用户、角色、考勤、流程、公告、邮件、任务、日程、计划、文件、笔记、通讯录、讨论区等多个模块管理 使用Maven进行项目管理,基于springboot框架开发的
93 0
基于Java jsp+mysql+Spring的汽车出租平台租赁网站平台设计和实现
主要功能说明: 管理员角色包含以下功能:管理员登录, 用户管理,管理员管理, 订单管理和审核,利润统计, 交易流水管理车辆管理, 汽车品牌管理等功能。
41 0
基于java SSM的房屋租赁系统设计和实现
主要功能描述: 1.登录管理:主要有管理员登录和租客登录 2.房源列表以及添加房源功能: 3.租赁合同管理以及在租房源和已退租房源
52 0
基于java(springboot+mybatis)汽车信息管理系统设计和实现以及文档
主要实现技术:Java、springmvc、springboot、mysql、mybaits、jQuery、js、css等、使用eclipse/idea运行。 主要功能模块
58 0
+关注
徐洲更
生信媛公众号编辑、生信必修课之软件安装课程作者
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Java开发手册1.3.0
立即下载
Java开发手册1.2.0
立即下载
Java开发手册1.0.0版
立即下载