(1):java基础知识笔记,java基础知识笔记
(1):java基础知识笔记,java基础知识笔记
一:JDK,JRE,JVM三者的区别
JDK:(Java Development Kit)是整个Java的核心,包括了java运行环境JRE,Java工具和Java基础类库。包含JVM标准实现及java核心类库。也可以这么说吧:JDK =JRE +JVM +其他
JRE:(Java Runtime Enviroment)java运行时环境,也就是我们说说的Java平台,所有的java程序都要在jre下才能运行,包括jvm和java核心类库和支持文件。
JVM:Java Virtual Mechinal (Java虚拟机),它是整个Java实现跨平台的最核心的部分,所有的java程序都会首先被编译为.class字节文件,这种类文件可以在虚拟机上执行。
二:Java标识符
标识符:用于给程序中变量,类,方法命名的符合。
规则:必须以字母,下划线,美元符号开头,后面可以跟任意数目的字母,下划线和美元符号。不可以是48个关键字和保留字。不可以包含空格。
类、 变量或方法的命名规则:类的命名,首字母要大写,如果由多个单词组成,那么每一个单词的首字母都要大写。----à驼峰命名法。变量和方法,第一个单词的首字母要小写,后面的要大写,常量,所有的字母要大写。
三:数据类型
Java语言支持的类型分为二类:①:基本数据类型 ②:引用数据类型
基本数据类型:整形类型(byte(占1个字节),short(占2个字节),int(占4个字节),long(占8个字节),char(占2个字节)),浮点类型(float(占4个字节),double(占8个字节))和boolean类型。
引用类型:接口,数组类型,null类型,引用数据类型就是一个对象的引用,对象包括实例对象和数组。
四:数据类型之间的转换
不同类型之间是可以相互转换的,有二种方式:
自动类型转换:小范围的可以向大范围自动进行转换。
---->Byte à short-à int --àlongàfloat-àdouble
----->Char àint à long à float -àdouble
注意了:当任何基本数据类型和字符串进行连接时,都会将其转换为字符串类型。 将不会保存原来的基本数据类型,字符串不是基本数据类型,是一个引用类型。
强制类型转换:大范围的也是可以向下范围的转换,需要进行强制类型转换,在小范围的类型之前加上类型。经典的二句话如下:
所有的byte,short,char类型会自动提升为Int 类型。
整个算术表达式的类型会自动提升到最高表达式类型。
五:流程控制
顺序结构:程序从上到下一行一行地执行,中间没有任何判断和跳转
分支结构:根据条件选择性的执行某段代码,有常见的二种,if语句和switch语句:if语句使用布尔表达式或布尔值作为分支条件来进行分支控制,if之后的括号里只能是一个逻辑表达式,也就是说表达式的返回值只能是true或false,switch语句则用于对多个整形值(jdk1.7后,支持字符串)进行匹配,从而实现了分支控制。
循环结构:根据循环条件重复执行某段代码,循环语句包含4个部分:①:初始化语句。②:循环条件。③:循环体④:迭代语句
循环结构:while循环,do while()循环,for()循环。
注意了:这里有一个很重要的知识:使用continue和Break来控制循环,二者的区别呢?
Continue是终止本次循环,接着开始下一次循环
Break:是完全终止循环。跳出循环体,开始执行循环之后的代码。
当然:这里还讲到了使用return来结束循环,我们知道return 一般是结束一个方法的,显然,方法里是可以写循环结构的,所有return 是可以结束循环的。也就是说结束一个方法也就是结束了循环。
六:数组
除了基本数据类型外,还有一种叫引用数据类型,而数组就是一种引用数据类型,数组里面只能存放一种数据元素的数据类型。
Ø 定义数组:二种方式,但一般推荐使用第一种
① :type[] arrayName;
② :type arrayName[];
注意了:因为数组是一种引用数据类型,当用数组定义一个变量时,仅仅表示定义了一个引用变量(相当于C中的指针变量),这个引用变量没有指向任何有效的内存空间(也就没有什么地址),是不能直接使用的,需要初始化后才能使用,C中的指针也是一样的,也是需要初始化后才能使用的。
Ø 数组的初始化
定义:就是为数组元素分配内存空间,并为每一个数组元素进行赋值
静态初始化:type []arrayName = new type[]{e1,e2,,e3…en};
动态初始化:type[]arrayName = new type[length];
遍历数组:使用foreach循环遍历数组,这个是jdk1.5后新添加的功能。
For(type variableName:arrayName){
System.out.println(variableName);
}
简单的for循环遍历这里就不写了。
Ø 数组在内存中的分配方式
数组是一种引用数据类型,定义了数组名仅仅是定义了一个引用变量,我们访问数组是使用这个引用变量来访问数组的。这个引用变量是分配在内存中的栈内存空间,而初始化后数组元素是在内存中的堆内存空间分配的。这一点要要知道。
当我们定义了一个这样的数组:
int [] p = new int[]{1,2,3,4};
那么为什么会有栈内存和堆内存呢?我们访问堆内存中的数组元素是通过p [index]的形式来访问的。P指向的是堆内存空间的首地址。
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐一放进这块栈内存中(也就是说栈内存通常用来存放变量)。随着方法的执行结束,这个方法的内存栈也将自然销毁。当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复使用(对象的创建成本大),这个运行时数据区就是堆内存,堆内存的对象不会随方法的结束而销毁,即使方法结束后,这个对象还肯能被另一个引用变量所引用(方法的参数传递),则这个对象依然不会被销毁,只有当一个对象没有任何引用时,系统的垃圾回收机制才会在合适的时候进行回收。
Ø 引用类型数组的初始化
引用类型数组的数组元素是引用,每个数组元素里存储的还是引用,它指向另一块内存。这块内存里存储了有效的数据元素。
这里将列举一个例子:
定义一个Person类(所有的类都是引用类型),代码如下;
public class Person {
private int age;
private double height;
public void info(){
System.out.println("Person:"+age+";"+height);
}
}
接下来定义一个Person[] person数组,并动态初始化这个person数组,并为数组中的元素赋值。
public classTestPerson {
public static voidmain(String[] args) {
Person[] person = newPerson[2];//定义一个person数组变量,类型是Person[],并给它动态初始化
Person person1 = new Person();//创建一个Person实例,并把这个Person实例赋给person1引用变量。
person1.setAge(20); //为person1引用变量所指向的Person对象的属性赋值
person1.setHeight(175.0);
Person person2 = new Person();//创建一个Person实例,并把这个Person实例赋给person2这个引用变量
person2.setAge(22);//为person2引用变量所指向的Person对象的属性赋值
person2.setHeight(180.0);
person[0] = person1; //将person1变量的值赋给第一个数组元素
person[1] = person2; //将person2变量的值赋给第二个数组元素
//下面的结果是一样的,person1和person[0]指向的是同一个Person实例对象
person1.info();
person[0].info();
}
}
① :执行Person []person = new Person[2];
② :Person person1 = new Person(),Person person2 = new Person()后,
也就是说定义了person1和person2二个Person实例对象,此时在栈中定义了二个引用变量,在堆中存储了二个Person()对象的实例。
③ :此时,person数组中的二个元素依然是null,直到person[0] =person1,person[1] =person2; person数组里面的二个元素才指向有效的内存空间。
④ :person1和person[0]指向的是同一块内存空间,所以结果都是一样的。
Ø 二维数组
定义:采用 type[][]arrayName的形式来定义二维数组,但它的实质还是一维数组,只是其数组元素也是引用,数组元素里保存的引用指向一维数组。
看下面的程序,将可以彻底明白二维数组到底是怎么一回事。
public class TestErWei{
public static voidmain(String[] args) {
int [][]a;
a = new int[3][];
for(int i=0;i<a.length;i++){
System.out.println(a[i]); //
}
a[0] = new int[2];
a[0][1] = 6;
a[1] = new int[3];
a[1][0] = 7;
a[1][1] = 8;
a[1][2] = 9;
a[2] = new int[3];
a[2][0] = 10;
a[2][1] = 11;
a[2][2] = 12;
for(int i=0;i<a[0].length;i++){
System.out.println(a[0][i]);
}
for(int i=0;i<a[1].length;i++){
System.out.println(a[1][i]);
}
for(int i=0;i<a[2].length;i++){
System.out.println(a[2][i]);
}
}
}
① :定义一个二维数组并初始化 int [][] a = new int[3][];
说明:这里声明并定义了一个二维数组,但和我们的一维数组没什么二样吧,完全可以当成一维数组来处理,一维数组的长度为3。只是这三个数组元素都是引用类型,
② :a数组的元素必须是int[]类型的数组,接下来对三个数组元素进行初始化,
int a[0 ] = new int[2],int a[1] = new int[3], int a[2] = new int[3]。
并且依次给三个数组元素进行赋值。
从上面的程序中可以看出,初始化多维数组时,可以指定最左边维数的大小,当然,也是可以一次性指定每一维数组的大小。
看下面的程序吧,输出的就是3行4列了。输出的默认都是0。
int [][] b = new int[3][4];
for(int i=0;i<b.length;i++){
System.out.println(b);
}
for(int i=0;i<b[0].length;i++){
System.out.print(b[0][i]);
}
System.out.println("\n");
for(int i=0;i<b[1].length;i++){
System.out.print(b[1][i]);
}
System.out.println("\n");
for(int i=0;i<b[2].length;i++){
System.out.print(b[2][i]);
}
练习:
1.对下列代码,若有输出,指出输出结果int x=2;
int y=3;if(x>2)
{
if(y>2)
{ int z=x+y;
System.out.println(“z is ”+z);
}
}else
{
System.out.println(“x is ”+x)
};
=================================
答案:x is 2
==================================
2.使用switch语句改写下列if语句:
int a = 3;
int x = 100;
if(a==1)
x+=5;
else if(a==2)
x+=10;
else if(a==3)
x+=16;
else if(a==4)
x+=34;
else
x += 100;
===========================================
int a = 3;
int x = 100;
switch(a){
case 1:
x+= 5;
break;
case 2:
x+= 10;
break;
case 3:
x+= 16;
break;
case 4:
x+= 34;
break;
default:
x+=100;
break;
}
==================================================
3.编写程序:从键盘上读入一个学生成绩,存放在变量score中,根据score的值输出其对应的成绩等级:
score>=90 等级:A
70=<score<90 等级 : B
60=<score<70 等级: C
score<60 等级:D
======================================================
import java.util.*;
public class TestScore{
public static void main(String []args){
double score;
Scanner in = new Scanner(System.in);
score = in.nextInt();
if(score>=90){
System.out.println("等级A");
}else if(70<score<90){
System.out.println("等级B");
}else if(60<score<70){
System.out.println("等级C");
}else{
System.out.println("等级D");
}
}
}
======================================================
4.编写程序:求1到100之间所有偶数的和。用do/while 、while语句分别完成。
编写程序:从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序
=======================================================
①:while
public class TestSum{
public static void main(String []args){
int sum = 0;
int i=0;
while(i<=100){
if(i%2==0){
sum += i;
}
i++;
}
System.out.println(sum);
}
}
②:do while
public class TestSum{
public static void main(String []args){
int sum = 0;
int i = 0;
do{
if(i%2==0){
sum +=i;
}
i++;
}while(i<=100);
}
}
③:
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
System.out.println("随便输入整数");
int num;
Scanner in = new Scanner(System.in);
num = in.nextInt();
int sum_z = 0;
int sum_y = 0;
while(num!=0){
num = in.nextInt();
if(num>0){
sum_z ++;
}else if(num<0){
sum_y++;
}else{
System.out.println("正常结束!");
}
}
System.out.println("正数的个数:"+sum_z);
System.out.println("负数的个数为:"+sum_y);
}
}
===========================================================
5.(1)定义类Pritimive,在类中定义一个有3个元素的boolean类型的数组t作为其成员变量。数组元素未赋值。
定义类Array1,在Array1的main()方法中创建Pritimive对象d,输出其成员变量t的三个元素值。
练习目的:检验基本数据类型数组创建时的自动赋值。
(2)给对象d的成员变量t赋值为{true,true,true},并输出t的三个元素值。
====================================================
①:
class Pritimive{
boolean[] t = new boolean[3];
}
public class Array1{
public static void main(String []args){
Pritimive d = new Pritimive();
for(boolean t1:t){
System.out.println(t1);
}
}
}
②:
class Pritimive{
boolean[] t = new boolean[]{true,true,true};
}
public class Array1{
public static void main(String []args){
Pritimive d = new Pritimive();
for(boolean t1:t){
System.out.println(t1);
}
}
}
====================================================
6.使用简单数组(1)创建一个名为TestArray的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。(2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
(3)显示array1的内容。
(4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。
======================================================
array[0] = 0;
2,3,5,7,11,13,17,19
0 1 2 3 4 5 6 7
public class Test04 {
public static void main(String[] args) {
int []array1 = new int[]{2,0,5,7,8,3,9,4};
int []array2 = new int[8];
for(int arr1:array1){
System.out.print(arr1);
}
System.out.println("\n");
array2 = array1;
for(int i=0;i<array2.length;i++){
if(array2[i]%2==0){
if(array2[i]<array2.length){
int s = array2[array2[i]];
array2[array2[i]] = array2[i];
array2[i] = s;
}
}
}
System.out.println("\n");
for(int i =0;i<array2.length;i++){
if(array2[i]%2==0){
System.out.println("array2[i]:"+array2[i]);
}
}
System.out.println("\n");
for(int arr1:array1){
System.out.print(arr1);
}
}
}
======================================================
7.
求二维数组(3行3列)的对角线元素的和
======================================================
* * *
* * *
* * *
1 2 3
4 5 6
7 8 9
=1+5+9(15)
=3+5+7(15)
= 30
public class Test03 {
public static void main(String[] args) {
int [][]array = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
int i=0;
int sum = 0;
for(i=0;i<3;i++){
sum = sum +array[i][i]; //斜向右下脚
}
for(i=1;i<=3;i++){
sum = sum +array[3-i][i-1]; //斜向左下脚
}
System.out.println(sum);
}
}
======================================================
相关文章
- 暂无相关文章
用户点评