Java学习笔记
一、计算
1.计算机与编程语言
-
计算机与编程语言
-
计算机的思维方式
算机的编程语言与思维方式较为笼统,本篇中不再一一赘述
2.第一个Java程序
- 准备Java编辑软件
请在自行寻找渠道下载
- 编写第一个Java程序
首先在创建新的Java文件 File - New - Java Project
在src中创建编写源代码
如下
package hello;
import java.util.Scanner;
public class Hello {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello World");
}
}
在下方运行窗口便可以看到程序的运行结果
TIPS:
Java的可以的双引号中可以输出中文字
编写出现错误是左边框会出现红叉提醒,并指出错误所在
在双引号之外出现的中文字包括中文字符都不能被Java语言所识别
3.计算与变量
- 输入输出
在Java中,我们用定义的变量来帮助我们实现数据的输入输出
Scanner in = new Scanner(System.in);
用in中的函 in.nextLine() 可以读取我们的输入值,实现最简单的程序输入输出
System.out.println(in.nextLine());
绿色字体是输入的值
系统读取后,在下一行实现输出
在 System.out.println 中若想输出固定内容,可用双引号,不同形式的输出内容之间用 + 号连接
System.out.println("echo:"+in.nextLine());
System.out.println("2+3="+2+3);
System.out.println("2+3="+(2+3));
}
注意一上三种表达的输出的不同
echo:hell0
2+3=23
2+3=5
Tips:
terminared 代表程序已经运行完成,Java中若程序未完成时又运行了另一个程序会造成卡顿,需要注意
- 变量
在读取输入内容之前,先定义一个 int 型的变量 price 来接受读取的值
int price;
price=in.nextInt();
System.out.println("100-"+price+"="+(100-price));
运行结果如下
53
100-53=47
变量定义的一般形式就是:
<类型名称><变量名称>;
int paice;
int amount;
int price,amount;
Tips:
Java中有一部分字符属于保留字符,不可被用作变量名称,如 if,when 等等
- 赋值
Tips:
计算机语言中的 = 符号与数学中有所不同
计算机中的 = 符号表示将右边的值赋给左边变量
final int amount=100;
final 会使定义的值 amout 的值无法再进行改变
用赋值写一个简单的程序
int amout;
int price;
System.out.print("请输入票面:");
amout=in.nextInt();
System.out.print("请输入金额:");
price=in.nextInt();
System.out.println(amout+"-"+price+"="+(amout-price));
其运行结果为
请输入票面:100
请输入金额:50
100-50=50
4.浮点数的计算
- 浮点数
以英尺与米制之间的转化为例,若就按平常算法如下
int foot;
int inch;
Scanner in = new Scanner(System.in);
foot = in.nextInt();
inch = in.nextInt();
System.out.println((foot+inch/12)*0.3048);
输出结果为
5 7
1.524
与实际不符
由于 int 是整型的变量,所以在计算 inch/12 在计算机中会被当做整型变量计算,导致运算错误
修改如下
System.out.println((foot+inch/12.0)*0.3048);
将 12 改为 12.0 后,除法算式中出现了浮点数,从而得到的结果也会为浮点数
结果如下
5 7
1.7018
或
可以把 int 型的变量 inch 改为 double 型也可实现目的,读取时可使用函数
inch=in.nextDouble();
- 计算的优先级
一般符合正常思维,加括号可以解决大部分优先级的问题
- 类型的转换
从 int 转换为 double 会由程序自动完成
将 double 转换成 int 型则需要手动转换
方法为
int foot=(int)(30/3.0)
double b=10.3;
int a = (int)b;
二.判断
1.比较
- 比较
// 初始化
Scanner in = new Scanner(System.in);
// 读入投币金额
System.out.print("请投币:");
int amount = in.nextInt();
// 打印车票
System.out.print("****************");
System.out.print("* Java城市铁路专线 *");
System.out.print("* 无指定座位票 *");
System.out.print("* 票价10元 *");
System.out.print("****************");
// 计算并打印找零
System.out.println("找零:???");
我们需要判断投币金额与10的关系从而得到收到的钱是正好,多了还是少了。在上面程序中加入如下代码
System.out.println(amount>=10);
我们可以发现
当输入的值为小于10时,程序的输出结构为
falsa
当输入的值大于10时,程序的输出结果为
true
- 关系运算
Java会对例如 > , < , == , != , >= , <= 等关系做出判断,为真则返还 true ,为假返还 falsa
== 与 != 的优先级较低
连续的关系的运算一般从左到右进行
true 和 falsa 不能比较大小
6>3>1;
a==b==6;
a==b>falsa;
这三种表达皆为错位的
注
浮点数和整数之间可以比较大小,但浮点数与浮点数之间的比较可能会产生误差
例:
double a = 1.0;
double b = 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
System.out.println(a==b);
得到结果为
falsa
一般判断两个浮点数大小用其差的绝对值与一个较小的数进行比较得到
Math.abs(a-b)<1e-6;
2.判断
在两个数中取较大值的程序
Scanner in = new Scanner(System.in);
int x = in.nextInt();
int y = in.nextInt();
int max;
if( x>=y )
{
max = x;
}
else
{
max = y;
}
3.分支
- 级联和嵌套判断语句
判断三个数的大小
int x;
int y;
int z;
if( x>y )
{
if( x>z )
{
max = x;
}
else
{
max = z;
}
}
else
{
if( y>z )
{
max = y;
}
else
{
max = z;
}
}
else总是和最近的 if 匹配
还可以表达为
if( )
{
...;
}
else if( )
{
...;
}
else
{
...;
}
- 分支
switch( type ){
case 1:
...;
break;
case 2:
...;
break;
case 3:
...;
break;
case 4:
...;
break;
}
switch 语句会一直往下执行直到遇到 break
4.判断语句常见错误
- if 后面不能加 " ; "
- " = "是赋值语句, " == " 是判断语句,二者不同
- 代码的格式,如大括号,语句缩进
三.循环
1.循环
- 循环
大部分程序都不是运行一次就结束的,所以大多数时候,我们要用到循环
while(true)
{
...;
}
- 数数字
读入一个正整数,然后输出这个数的位数
Scanner in = new Scanner( System.in );
int number = in.nextInt();
int count = 0;
while( number>0 )
{
number = number / 10;
count = count + 1;
}
System.out.println( count );
在循环中,不断去除个位数,判断 number<0 后退出循环,达到统计位数的效果
运行结果如下:
1343256425
10
- do while循环
可用 debug 跟踪观察循环的动向
do
{
...;
} while( ''' );
do while 会使得循环必定执行一次
可用小循环测试大循环
- 随机数的算法
int number = Math.random();
产生的随机数在 [0,1) 区间上,可以通过乘除加减使其表示任意区间的数。
[a,b] 的整数区间可表示为
int number = ( int )( Math.random() * ( b - a ) + a);
四.循环控制
1.for循环
- for循环
计算 1 到 n 的阶乘
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int factor = 1;
for( int i=1; i<=n; i++)
{
factor = factor * i;
}
System.out.println(factor);
if 语句括号中用 " ; " 相隔开
- 复合赋值
a = a + 6 -> a += 6
a = a - 6 -> a -= 6
a = a * 6 -> a *= 6
a = a / 6 -> a /= 6
a = a * ( b + 6 ) -> a *= b+6
i = i + 1 -> i++
//区别
a = i++ -> a = 6 ,i = 7
a = ++i -> a = 7 ,i = 7
2.循环控制
- 循环控制
判断素数
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int isPrime = 1;
for( int i = 2; i < n; i++)
{
if( n % i == 0 )
{
isPrime = 0;
break;
}
}
if( isPrime == 1 )
{
System.out.println(n+"是素数");
}
else
{
System.out.println(n+"不是素数");
}
运行结果
14
14不是素数
break : 跳出循环
continue : 跳过循环这一轮剩下的语句进入下一轮
五.数组
1.数组
- 初识数组
创建长度为100的数组
int [] number = new int[100];
所有的元素是一个类型的
一旦创建无法改变大小
数组编号是从 0 开始的
- 数组的元素
数组的长度可以由输入的值决定
int n = in.nextInt();
int [] number = new int [n];
大小依旧无法改变
number.length
可以表示数组长度,用于遍历数组
- 数组变量
直接初始化数组
int[] scores = {87,98,69,54,65,76,87,99}
System.out.println( scores.length );
for( int i=0;i<scores.length;i++ )
{
System.out.print( scores[i]+"");
}
具有一定拓展性
- 数组变量的赋值
int [] a1 = {1,2,3,4,5};
int [] a2 = a1;
for( int i=0; i<a2.length;++i )
{
a2[i]++;
}
输出 a1 为
2 3 4 5 6
数组赋值是地址的传递
2.数组计算
- 投票统计
Scanner in = new Scanner( System.in);
int x;
int [] number = new int[10];
x = in.nextInt();
while(x!=-1)
{
if( x>=0&&x<=9)
{
number[x]++;
}
x = in.nextInt();
}
for( int i=0;i<number.length;i++)
{
System.out.println(i+":"+number[i]);
}
运行结果
1
2
1
2
4
6
-1
0:0
1:2
2:2
3:0
4:1
5:0
6:1
7:0
8:0
9:0
boolean n = false;
boolean定义的变量表示判断真假
- for each循环
for( int k : date)
{
...;
}
用于遍历一个数组
只有值的对应关系,没有位置的对应关系,也不能修改数组
3.二维数组
int [][] a = new int[3][5];
三行五列
int [][] a = {
{1,2,3,4},
{1,2,3},
};
六.使用对象
1.字符类型
- 字符类型
单个的字符时一种特殊的类型
char c1 = 'a';
char c2 = '1';
char c3 = '汉';
char 类型可以与整数类型换算,每个字符都有对应的编码
可以进行
c1++;
c1-c2;
等运算
- 大小写转化
char c = 'A';
char d = (char)(c+'a'-'A');
- 逃逸字符
2.包裹类型
- 包裹类型
- 包裹类型具有基础类型的功能
int i = 10;
Integer k = 10;
k = i;
包裹类型有一些自带函数
System.out.println(Integer.MAX_VALUE);
运行结果
2147483627
- Math类
Math.abs //绝对值
Math.pow //幂次
Math.random //随机数
Math.round //四舍五入
3.字符串
- 字符串变量
String s = new String( "a string" );
String s = "hello";
用加号可以连接两个字符串
String s = new String( "Hello" );
System.out.println(s+" Java");
运行结果
Hello Java
- 字符串的赋值与比较与数组类似
String s = "hello";
System.out.println( s== "hello" );
System.out.println( s.equals("hello") );
运行结果
false
true
- 字符串操作
s.equals() //判断是否相等
s.compareTo() //判断大小
s.length() //获得长度
s.charAt(index) //访问某个字符
s.substring(n,m) //获得从n到m之前的字符
s.indexOf(c) //得到c字符的所在位置,-1表示不存在
s.indexOf(c,n) //从n号位置开始寻找c字符
s.indexOf(t) //找到字符t所在的位置
......
这些操作均不可改变本身的值
七.函数
1.函数定义与使用
- 函数的定义
用函数判断素数
package hello;
import java.util.Scanner;
public class factor {
// 判断素数函数
public static boolean isPrime(int i)
{
boolean isPrime = true;
for( int k = 2; k < i; k++)
{
if( i % k == 0 )
{
isPrime = false;
break;
}
}
return isPrime;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int cnt = 0;
int sum = 0;
for( int i=n;i<m;i++)
{
if(isPrime(i))
{
cnt++;
sum+=i;
}
}
System.out.println("在"+m+"和"+n+"之间有"+cnt+"个素数,总和为"+sum);
}
}
运行结果
1
100
在100和1之间有26个素数,总和为1061
在一个程序中有相似的运算就可以使用函数,可以提高程序的质量
函数时一块代码,接受零个或多个参数,做一件事情。并反汇零个或一个值
- 函数的调用
函数名(参数值)
函数
public static int max( int a, int b )
{
int ret;
if( a>b )
{
ret = a;
}
else
{
ret = b;
}
return ret;
}
调用
c = max( 10,12 );
c = max( a,23 );
c = max( a,b );
c = max(max( c,a ),max( 5,a ));
System.out.println( max( a,b ));
max( 12,23 );
不带值的函数
void 函数名(参数表)
2.函数参数与函数内的变量
- 函数的参数
类型不匹配可以部分转化
char->int->double
Java语言在调用返回函数时传递的是值,无法改变变量的值
- 函数内的变量——本地变量
递归函数
publi static int factor(int i)
{
if(i==1)
return i;
return i*factor(i-1);
}
- 本地变量是定义在块里的
- 它可以是定义在函数的块内
- 也可以定义在语块内
- 甚至可以随便拉一对大括号定义变量
- 程序运行进入这个块前,其中的变量不存在,离开这个快,其中的变量就消失了
- 本文为本人学习Java时所作笔记,学习资源来自 mooc 浙江大学 翁恺 零基础Java语言