Java——基本程序设计结构

目录

一、最简单的Java应用程序

程序解析

二、注释

三、数据类型

3.1整型

3.2浮点类型

3.3char类型

3.4boolean类型

四、变量与常量

4.1变量

4.2常量

五、运算符

5.1数据类型之间的转换

5.1.1隐式类型转换

5.1.2强制类型转换

5.2赋值运算符

5.3自增自减运算符

5.4位运算符

5.5括号与运算符优先级

5.6枚举类型

六、字符串

6.1拼接

6.2空串与null串

七、大数值

八、数组

8.1for each 循环

8.2一维数组部分操作

8.2.1数组初始化

8.2.2数组拷贝

8.3多维数组

另:中断控制流程语句


一、最简单的Java应用程序

/**
 * This is a very easy program
 * @version 22:15 2019-03-21
 * @auther 云烟成雨yycy
 */

public class First{
	public static void main(String[] args){
		System.out.println("I won't use \"Hello World!\"");
	}
}

测试结果:

I won't use "Hello World!"

程序解析

  1. Java区分大小写
  2. 关键字 public 称为访问修饰符,用于控制程序其他部分对这段代码的访问级别
  3. 关键字 class 表明Java程序中的全部内容都包含在类中
  4. First 是类名,类是构建所有Java应用程序和applet的构建块,类名必须以字母开头,后面可以跟字母和数字的任意组合
  5. main 方法必须声明为 public
  6. 源代码的文件名必须与公共类的名字相同,并用 .java 作为扩展名

该程序 main 方法中只包含一条语句,其功能是:将一个文本行输出到控制台上,通过使用 System.out 对象并调用其 println 方法实现(注意,点号(.)用于调用方法)

System.out 还有一个 print 方法,它在输出之后不换行

如果已经正确地命名了该文件,且源代码中没有录入错误,编译该源代码后得到一个包含这个类的字节码的文件,Java编译器将其命名为 First.class,并与源文件存储在同一目录下

 

 

二、注释

在Java中有三种标记注释的方式:

  1. 最常用的是 // ,其注释内容从 // 开始到本行结束
  2. 使用 /*...*/ ,将一段比较长的注释括起来;这种注释不能嵌套,因为代码中可能也包含一个 */
  3. /** 开头,以 */ 结尾,可以用来自动地生成文档
/**
 * this is the first example in Java
 * @version 10:52 2019-03-22
 * @author 云烟成雨yycy
 * 第三种注释
 */

public class First{
    public static void main(String[] args){ //main 方法必须声明为 public 第一种注释
        System.out.println("I won't use \"Hello World!\"");
        /* System.out 还有一个 print 方法,它在输出之后不换行 第二种注释 */
    }
}

测试结果:

I won't use "Hello World!"

 

 

三、数据类型

3.1整型

(后期配图 P32)

在Java中,整型的范围运行Java代码的机器无关,这就解决了软件从一个平台移植到另一个平台,或者在同一个平台的不同操作系统之间进行移植给程序员带来的诸多问题

  • 最常用类型是 int 类型
  • 长整型数值有一个后缀 Ll,如 4000000000L
  • 十六进制数值有一个前缀 0x0X,如 0xCAFE。八进制数值有一个前缀 0,如 017
  • Java7开始,加上前缀 0b0B可以表示二进制,如 0b1001;还可以为数字字面量加下划线,如 1_000_000,表示一百万

 

3.2浮点类型

(后期配图 P33)

double 类型的数值精度是 float 的两倍,因此很少情况使用 float 类型,如需要单精度数据的库,需要存储大量数据等

  • 浮点数值不适用于无法接受舍入误差的金融计算,若在数值计算中不允许有任何舍入误差应该使用 BigDecimal 类
  • 可以使用十六进制表示浮点数据,如 0.125=2^(-3) 可以表示成 0x1.0p-3。在十六进制表示法中,用 p 表示指数,而不用 e;尾数采用十六进制,指数采用十进制;指数的基数是2,不是10
  • 所有的浮点数值计算遵循 IEEE 754 规范,用于表示溢出和出错情况的三个特殊的浮点数值是:正无穷大,负无穷大,NaN(非数值),分别用常量Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITYDouble.NaN(Float.NaN)表示,例如一个正整数除以0结果为正无穷大,0/0或复数的平方根结果为NaN

特别说明:

  1. 不能这样检测一个特定值是否等于Double.NaN:if(x == Double.NaN) // is never true
  2. 所有"非数值"的值都认为是不相同的,但可以使用Double.isNaN方法:if(Double.isNaN(x)) // check whether x is "not a number"

 

3.3char类型

char类型的字面量值要用单引号括起来;其值可以表示为十六进制值,范围从 \u0000 到 \Uffff

(后续配图 P34)

警告!

  1. Unicode转义序列会在解析代码之前得到处理,如 "\u0022+\u0022" 是由引号包围加号构成的字符串,实际上, \u0022 会在解析之前转换为 " ,这会得到 " "+" ",即一个空串
  2. 当心注释中的 \u:
  • 注释 // \u00A0 is a newline 会产生一个语法错误,因为读程序时 \u00A0 会替换成换行符
  • 注释 // Look inside c:\users 会产生一个语法错误,因为 \u 后并未跟着4个十六进制数

强烈建议:

  1. 不要在程序中使用char类型(因为它已经不能满足描述所有Unicode字符的需要),除非确实需要处理UTF-16代码单元
  2. 最好将字符串作为抽象数据类型处理

 

3.4boolean类型

boolean类型有两个值:false 和 true

整型值和布尔值之间不能相互转换

 

 

四、变量与常量

4.1变量

逐一声明每个变量可以提高程序可读性

变量的声明尽可能地靠近变量第一次使用的地方

 

4.2常量

习惯上,常量名使用全大写

利用关键字 final 指示常量,表示该变量只能赋值一次

某个常量可以在一个类中的多个方法中使用,成为类常量,使用关键字 static final 设置;类常量的定义位于 main 方法的外部

/**
 * This is a program about constant
 * @version 22:25 2019-03-25
 * @auther 云烟成雨yycy
 */

public class Constant{
    public static final double CM_PER_INCH=2.54; //类常量

    public static void main(String[] args){
        final double paperWidth=8.5; //常量
        double paperHeight=11;
        System.out.println("Paper size in centimeters:"+paperWidth*CM_PER_INCH+" by "+paperHeight*CM_PER_INCH);
    }
}

测试结果:

Paper size in centimeters:21.59 by 27.94

 

 

五、运算符

5.1数据类型之间的转换

5.1.1隐式类型转换

当两个不同数据类型的数值进行二元操作时,先转换为同一数据类型再进行运算

  • 若两个操作数有一个是 double 类型,另一个就会转换成 double 类型
  • 否则,若其中一个操作数是 float 类型,另一个就会转换成 float 类型
  • 否则,若其中一个操作数是 long 类型,另一个就会转换成 long 类型
  • 否则,两个操作数都将转换为 int 类型

(后续配图 P41)

5.1.2强制类型转换

浮点类型转换为整型通过截断小数部分实现

如果试图讲一个数值从一种类型强制转换为另一种类型,又超出了目标类型的表示范围,结果会大不相同,如 (byte)300 的实际值是44

 

5.2赋值运算符

若运算符得到一个值,其类型与左侧操作数的类型不同,会发生强制类型转换,若 x 是一个 int,则以下语句合法:x+=3.5,将把 x 设置为 (int)(x+3.5)

 

5.3自增自减运算符

自增(++),自减(--)

运算符可以放在操作数前面(++n / --n),也可以放在后面(n++ / n--)

区别:前缀形式先加 1,再执行当前语句;后缀形式先执行当前语句,再加 1

int m=7;
int n=7;

int a=2* ++m; //now a is 16,m is 8
int b=2* n++; //now b is 14,n is 8

 

5.4位运算符

处理整型类型时,可以直接对组成整型数值的各个位进行操作;可以使用掩码技术得到整数中的各个位

位运算符包括:

  • &运算符:对应位都为1,结果值对应位才为1,如:0110 & 1011=0010
  •  | 运算符:对应位都为0,结果值对应位才为0,如:0110 | 1011=1111

应用在布尔值上时,& 和 | 运算符也会得到一个布尔值

它们与 && 与 || 运算符类似,但前者不采用 "短路" 方式求值,即运算符两侧的操作数都需要计算

  • ^ 运算符:对应位相同结果值对应位为0,对应位不同结果值对应位为1,如:0110 ^ 1011=1101
  • ~ 运算符:结果值与初始值正好相反,如:~ 1011=0100
  • << 运算符:左移,N << S 的值是将 N 左移 S 位,右边空出来的位填充0,相当于乘以2的 S 次方,如:11111000 << 1=11110000
  • >> 运算符:右移,N >> S 的值是将 N 右移 S 位,左边空出来的位如果是正数则填充0,如果是负数则填充1,相当于除以2的 S 次方,如:00010111 >> 2=00000101,11110110 >> 3=1111110
  • >>> 运算符:无符号右移,无论正数还是负数,无符号右移后左边空出来的位都填充0,如:11111000 >>> 2=00111110

移位运算符的右操作数要完成模32的运算(除非左操作数是 long 类型,此时需要对右操作数模64),如1 << 32的值等于1 << 3或8

 

5.5括号与运算符优先级

(后续配图 P44)

 

5.6枚举类型

有时候,变量的取值只在有限集合中。如果分别对其编码存在一定隐患,变量中很可能保存的是一个错误的值,因此设置枚举类型


例如,披萨的尺寸有小,中,大,超大4种,可自定义枚举类型:

enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE };

声明这种类型的变量:

Size s = Size.MEDIUM;

Size类型的变量只能存放这个类型中给定的某个枚举值,或者 null 值(null 表示该变量没有设置任何值)

 

 

六、字符串

Java没有内置的字符串类型,而是在标准Java库中提供了一个预定义类String

6.1拼接

与绝大多数程序设计语言一样,Java语言允许使用 + 号连接两个字符串

当一个字符串与一个非字符串的值拼接时,后者被转换成字符串(任何一个Java对象都可以转换成字符串)

 

6.2空串与null串

空串是一个Java对象,有自己的串长度(0)和内容(空)

String变量可以存放一个特殊值,名为NULL,表示目前没有任何变量与该变量关联

若要检查一个字符串既不是null也不是空串,需要使用语句 if(str != 0 && str.length() != 0),首先要检查 str 不为 null

 

 

七、大数值

如果基本的整数和浮点数精度不能满足需求,可以使用 Java.math 包中的 BigInteger 类和 BigDecimal 类,处理包含任意长度数字序列的数值

特别注意,大数值的计算中不再使用简单运算符,而是使用方法

import java.util.*;
import java.math.*;

/**
 * This program discribes big number that is about luck draw
 * @version 12:27 2019-03-27
 * @auther 云烟成雨yycy
 */

public class BigNumberTest{
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        System.out.println("总共几个数?");
        int total=in.nextInt();
        System.out.println("要抽几个数?");
        int number=in.nextInt();

        BigInteger lotteryOdds=BigInteger.valueOf(1);
        for(int i=1; i<=number; ++i)
            lotteryOdds=lotteryOdds.multiply(BigInteger.valueOf(total-i+1)).divide(BigInteger.valueOf(i));
        /**
         * 中奖概率 n*(n-1)*(n-2)*...*(n-k+1)/(1*2*3*...*k)
         */
        System.out.println("你的中奖率为1/"+lotteryOdds);
    }
}

测试结果:

总共几个数?
490
要抽几个数?
60
你的中奖率为1/716395843461995557415116222540092933411717612789263493493351013459481104668848

 

 

八、数组

声明数组有两种方式,int[] a;int a[]; ,多数人喜欢使用第一种,它将类型 int[] (整型数组)与变量名分开

Java中,数组长度可以是变量:new int[n] 表示创建一个长度为 n 的数组;还可以是0,但与null不同

  • 创建数字数组时,所有元素默认初始化为0
  • 创建 boolean 数组时,所有元素默认初始化为 false
  • 创建对象数组时,所有元素默认初始化为 null,表示这些元素未存放任何对象

8.1for each 循环

1. 一维数组

for(value: collection)
    do something with value

collection 集合表达式必须是一个数组或者是一个实现 Iterable 接口的类对象

2. 二维数组

for(double[] row : a)
    for(double value : row)
        do something with value

for each 语句不能自动处理二维数组的每一个元素,它是按照行,也就是一维数组处理的

 

8.2一维数组部分操作

8.2.1数组初始化

(1)静态初始化:初始化时显式指定每个数组元素的初始值,系统决定数组长度:arrayName = new type[]{ element1, element2, element3... }

int[] intArr;
intArr = new int[]{1,2,3,4,5,9};

(2)简化的静态初始化:type[] arrayName =  {element1, element2, element3... };

String[] strArr = {"张三","李四","王二麻"};

(3)动态初始化:初始化时指定数组的长度,由系统初始化每个数组元素的默认值:arrayName = new type[length];

int[] price = new int[4];

注意:不要同时使用静态初始化和动态初始化,即不要在进行数组初始化时,既指定数组的长度,又为每个数组元素分配初始值

8.2.2数组拷贝

Java中允许将一个数组变量拷贝给另一个数组变量,这时两个变量引用同一个数组

int[] luckNumber=intArr; //接上面的数组
luckNumber[5]=12; //now kakaka[5] is also 12

若想把一个数组的所有值拷贝到新的数组,可使用 Arrays 类的 copyOf 方法,该方法通常用来增加数组大小

int[] copyLuckNumber= Arrays.copyOf(luckNumber, luckNumber.length);

 

8.3多维数组

import java.util.*;

/**
 * This program demonstrates a YanghuiTriangle arrey
 * @version 21:29 2019-03-27
 * @auther 云烟成雨yycy
 */

public class YanghuiTriangle{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入杨辉三角的行数:");
        int n = in.nextInt();

        int[][] triangle = new int[n][];
        for (int i=0; i<triangle.length; i++) {
            triangle[i] = new int[i+1];

            for (int j = 0; j < triangle[i].length; j++) {
            if (i == 0 || j == 0 || i == j) {
                    triangle[i][j] = 1;
                } else {
                    triangle[i][j] = triangle[i - 1][j] + triangle[i - 1][j - 1];
                }
                System.out.print(triangle[i][j] + " ");
            }
            System.out.println();
        }
    }
}

测试结果:

请输入杨辉三角的行数:8
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 

 

另:中断控制流程语句

  1. break:跳出当前所在循环,执行循环后面的语句
  2. continue: 中断正常的控制流程,将控制转移到最内层循环的首部;若用于 for 语句,跳到循环变量的更新部分
  3. 带标签的 break 语句:类似 goto 语句,用于跳出多重循环;标签必须放在希望跳出的最外层循环之前,并且紧跟一个冒号
  4. 带标签的 continue 语句:跳到与标签匹配的循环首部
import java.util.*;
import java.math.*;

/**
 * This program discribes special "break" statements
 * @version 11:15 2019-03-27
 * @auther 云烟成雨yycy
 */

public class SpecialBreak{
    public static void main(String[] args) {
        int[] score = new int[10];
        int total=0;
        for (int i = 0; i < 10; ++i){
            score[i] = (int) (1 + Math.random() * 100); //随机产生学生分数
            total+=score[i]; //计算总分
        }
        double average=1.0*total/10; //计算平均分
        int counter=0;
        /**
         count 用来记录第一个低于平均分的学生的序号,且必须要初始化
         */

        read_data:
        while(average<total){
            for(int i=0; i<10; ++i){
                if(score[i]>average)
                    System.out.println("Congratulations! You are ok!"); //对超过平均分的学生鼓励
                else{
                    System.out.println("\nThe first student who doesn't get an average score appears.");
                    counter=i;
                    break read_data;
                }
                System.out.println(score[i]);
            }
        }
        System.out.println("\nThe average is "+average+"\nThis student's score is "+score[counter]);
    }
}

测试结果:

Congratulations! You are ok!
92
Congratulations! You are ok!
85

The first student who doesn't get an average score appears.

The average is 61.6
This student's score is 39

 

by   云烟成雨yycy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值