JAVA学习心得
Java语言概述
1.平台无关性
平台无关性包括源代码级和目标代码级,C与C++具有一定程度上的源代码级平台无关性,java语言是靠java虚拟机(JVM)在目标代码级实现平台无关性。
2.java程序比较特殊,首先经过编译过程,然后利用解释的方式来执行,即首先要将源程序(.java文件)通过编译器将其转换成与平台无关的字节码文件(.class文件),然后再通过解释器来解释执行字节码文件。
即:
A[源程序(.java文件)] – 编译器转换 --> B[字节码文件(.class)] – 解释器 --> C[解释执行字节码文件]
3.字节码最大的好处就是可跨平台执行,让程序“编写一次,到处运行”的梦想成真。
4.Application和Applet
Application:JAVA应用程序,可以在JAVA平台上独立运行。
Applet:JAVA小程序,内嵌在HTML文件里,要浏览器的支持才能运行。
JAVA语言基础
1.java语言中的两大类数据类型
基本数据类型(primitive types):由程序设计语言系统所定义,不可再分的数据类型,每个基本数据类型的数据所占内存的大小是固定的,与软硬件环境无关。基本数据类型在内存中存放的是 数据值本身。
引用数据类型(reference types):在内存中存放的是 指向该数据的地址,不是数据值本身,它往往由 多个基本数据类型组成,因此,对引用数据类型的应用称为 对象引用,也被称为 复合数据类型,在有的程序设计语言中被称为 指针。
2.4类8种基本数据类型
·整形:byte,short,int,long
·浮点型:float,double (既有整数部分,又有小数部分的数)
·布尔型:boolea (又称为逻辑型,只有true和false)
·字符型:char (用来储存单个字符)
3.关键字
Java语言中被赋予特定含义的一些单词,不允许用户对关键字赋予其他含义
4.标识符
任何一个变量,常量,方法,对象,类都需要名字,这些名字就是标识符
(1).可以由字母,数字和下划线(_),美元符号($)等组合而成;
(2).必须由字母,下划线或美元符号开头,不能以数字开头;
5.数据类型转换
1.自动类型转换:把占用比特数少的数据(较短的数据)转换成占用比特数较多的数据(较长的数据),都会使用自动类型转换,即类型转换由编译系统自动完成,不需要程序做特别的说明。
2.强制转换类型:如果把较长的数据转换成较短的数据时,就要使用强制类型转换,否则就会产生编译错误。
6.从键盘输入数据
·利用Scanner类从键盘输入多个数据:
import java.util.*; //加载java.util类库里的所有类
public class main {
public static void main(String[] args) {
int num1;
double num2;
Scanner reader =new Scanner(System.in);
System.out.println("请输入第一个数:");
num1 = reader.nextInt(); //把读进来的第一个数做为Int类型的数据赋值给num1
System.out.println("请输入第二个数:");
num2 = reader.nextDouble(); //把读进来的第二个数做为Double类型的数据赋值给num2
System.out.println(num1+"*"+num2+"="+((float)num1*num2));
}
}
·利用Scanner类,使用next()和nextline()方法接收从键盘输入字符串型数据
import java.util.*; //加载java.util类库里的所有类
public class main {
public static void main(String[] args) {
String s1,s2;
Scanner reader2 = new Scanner(System.in);
System.out.println("请输入第1个数:");
s1 = reader2.nextLine();
System.out.println("请输入第2个数:");
s2 = reader2.next(); //按Enter键后next()方法将回车符和换行符去掉
System.out.println("输入的是"+s1+"和"+s2);
}
}
说明:
next()方法:只能先输入有效字符之后,空格键,Tab,Enter键才能读入。
nextline()方法:可以先输入有效字符,空格,Tab,结束符只有Enter键。
7.条件运算符
·三元条件运算符( ?:): 表达式1 ? 表达式2 :表达式3;
用法:
int a = 1,b = 2,max;
max = a>b ? a:b; //max获得a,b之中的较大值
System.out.println("Max = "+max); //输出结果为max=2
8.利用hasNextXXX()和next XXX()方法的配合使用来完成键盘输入
import java.util.*;
public class main {
public static void main(String[] args) {
double sum = 0;
int n = 0;
System.out.println("请输入多个数,每个数之间用enter或者空格或者tab隔开:");
System.out.println("请输入一个非数字做为结束操作");
Scanner reader = new Scanner(System.in);
while(reader.hasNextDouble()) //判断输入流中是否有双精度浮点类型数据
{
Double x = reader.nextDouble(); //读取并转换成double型数据
sum+=x;
n++;
}
System.out.println("一共输入了"+n+"个数字,"+"其和为"+sum);
}
}
该程序运行时,用户在键盘上每次输入一个数值都需要按Enter或Tab键或空格键进行确认,最后输入一个非数字字符结束输入操作,因为当输入一个非数字字符并按Enter键后,reader.hasNextDouble()的值为flase。
8.do-while
do
{
循环体
}
while(条件表达式);
do-while和while的区别主要是两点:一是while循环语句是前判断,循环体有可能一次都不被执行,而do—while循环语句是后判断,循环体至少被执行一次;二是do—while循环的(条件表达式)后必须加一个分号“;”,而while循环的(条件表达式)后面却不能加分号。
9.求1~10的累加和
public class main {
public static void main(String[] args) {
int i,n = 10,s = 0;
for(i = 1;i<n;i++) //从1-10进行累加求和
{
s = s + 1;
}
System.out.println("Sum = 1 + ... +"+ n +"="+s);
s = 0;
System.out.println("Sum = ");
for(i = n;i>1;i--) //从10~2进行累加求和
{
s+= i;
System.out.println(i+"+");//输出数i和"+"
}
System.out.println(i + "="+(s+i)); //输出结果
}
}
执行结果:
Sum = 1+…+10=55
Sum = 10+9+8+7+6+5+4+3+2+1 = 55
10.多重循环
求100以内的素数,并输出
public class main {
public static void main(String[] args) {
final int MAX = 100; //定义常量MAX=100
int j,k,n;
System.out.println("2~"+MAX+"的所有素数为:");
System.out.print("2 "); //2是第一个素数,不用测试直接输出
n=1; //n累计素数的个数
k=3; //k是被测试的数,从最小奇数3开始测试,对所有偶数都不测试
do //外层循环,对3~100的素数测试
{
j=3; //用j去除待测试的数
while(j<Math.sqrt(k)&&(k%j!=0)) //内层循环
j++; //若j小于根号k,且j不能整除k,则j加1,再测试去除k
if(j>Math.sqrt(k))
{
System.out.print(k+"\t");
n++;
if(n%10==0)
System.out.println(); //每行输出10个数
}
k=k+2; //测试下一个奇数
}while(k<MAX);
System.out.println("\n共有"+n+"个素数");
}
}
运行结果:
2~100的所有素数为:
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97
共有25个素数
说明:Math.sqrt(k)方法返回k的平方根值,do-while外层循环用于遍历3-100的奇数;内层循环while,用于判别k是否为素数,当找到一个3~√k的整数 j 可以除尽 k,则 k 不是素数,退出内循环,此时 j<Math.sqrt(k)。内层循环结束后,如果第17行的 j > Math.sqrt(k)条件成立,说明没有一个 j 可以除尽 k,则 k 是素数。外层循环逐个测试100以内的奇数,从3开始,每次递增值为2,可以减少循环的次数,缩短时间,提高程序效率
11.三种循环转跳语句
break
作用是使程序的流程从switch语句的分支中跳出来,或从循环体内部跳出来,并将控制权交给分支语句或循环语句后面的语句。break语句的格式如下:
break;
break语句多用于两种情况:一是使用switch语句终止某个case,二是使一个循环立即结束。
continue
continue语句必须用在循环结构中,它的格式是:
continue;
continue语句的作用是终止当前这一轮的循环,跳过本轮循环剩余语句,直接进入下一轮循环。在while或者do-while循环中,continue语句会使流程直接跳转至条件表达式;在for语句中,continue语句会跳转至表达式2,计算并修改循环变量后再判断循环条件。
return
return语句用来使程序从方法中返回,并为方法返回一个值。格式如下:
return 表达式; //返回表达式的值
如果return语句未出现在方法中,则执行完方法的最后一条语句后自动返回到主程序。
12.switch语句
注意事项以及一些条件请参照一下这篇文章:
作者:张张吖
switch的结构以及注意事项
数组
1.一维数组
定义:
数据类型[ ] 数组名; //声明一维数组
数组名 = new 数据类型[ 个数 ]; //分配内存给数组
关于new运算符:
利用new运算符为数组元素分配内存空间的方式称为动态内存分配方式。
例如:
int [ ] x;
x = new int [10];
合起来:
int [ ] x = new int [10]; //x在这里就是一个应用变量,相当于C语言里的指针
2.利用二维数组计算并输出杨辉三角形
public class main {
public static void main(String[] args)
{
int i,j;
int level=7;
int[][] YH=new int[level][]; //声明7行二维数组,存放杨辉三角形的各数
System.out.println("杨辉三角形");
for(i=0;i<YH.length;i++)
YH[i]=new int [i+1]; //定义二维数组的第i行有i+1列
YH[0][0]=1;
for(i=1;i<YH.length;i++) //计算杨辉三角形
{
YH[i][0]=1;
for(j=1;j<YH[i].length-1;j++)
YH[i][j]=YH[i-1][j-1]+YH[i-1][j];
YH[i][YH[i].length-1]=1;
}
for(int[] row : YH) //利用foreach语句显示出杨辉三角形
{
for(int col : row)
System.out.print(col + " ");
System.out.println();
}
}
}
程序底8行声明了一个7行的二维数组YH,每行的列数由第10行,11行的for循环来定义;第13~19行的for循环利用于计算杨辉三角形并存入数组YH的相应元素中,其中的第15行18行分别是将第i行的第一个元素和最后一个元素置1;第16行定义的内存for循环利用计算第i行的其他元素,其计算方法是第17行的循环体,第20—25行利用了foreach循环将杨辉三角形输出
3.字符串常量和字符常量的区别:
字符常量使用单引号(’)括起来的单个字符,而字符串常量是用双引号(")括起来的字符序列。
创建字符串变量的格式:
String 变量名;
变量名 = new String(“字符串”);
String s; //声明字符串引用s,此时s的值为null
s = new String(“Hello”); //在堆内存中分配空间,并将s指向该字符串的首地址
连起来
String 变量名 = new String(“字符串”);
或者直接利用双引号括起来的字符串直接给新建的String对象赋值,即在声明字符串变量时直接初始化
String 变量名 = “字符串”;
String s = “Hello”;