Ps.博主大二学生,这学期开始学习java,下面内容全是自己理解和一些想法,如果有什么出入,请大家指出。
选用的教材:清华大学出版社的《java程序设计基础(第六版)》和《Java从入门到精通》,中国农业出版社的《java程序设计》,中国电力出版社的《Head First Java》。
java语言的概述
①什么是java虚拟机?
A:java虚拟机即JVM(java virtual machine),是用软件虚构出来的计算机,可以在真正的电脑上虚拟出一个计算机用来编译java程序,体现了java的平台无关性。
②什么是平台无关性?
A:平台无关性即java语言写出的程序在任何电脑上都可以运行,与操作系统没有关系,因为java的代码都是在java虚拟机里面运行。
③什么是字节码,采用字节码有什么好处?
A:字节码(Byte-code)是一种二进制的中间码,是java编译器将源代码编译后产生的独立于机器平台的字节码文件(.class文件)。字节码可以被java解释器执行,由解释器将字节码文件再翻译为二进制码,使得程序可以运行。好处是:可以克服不同平台编译器的差别,有利于调试器对原码的反编译。
④java语言程序有几种?每种程序的结构包含哪几个方面?
A:大致分为两种:Application(java应用程序)和Applet(java小程序)。前者指可以在java平台上独立运行的一种程序,且应用程序的主类要求是包含main()方法的类,但不一定要求是public类;后者则是内嵌(qian)在HTML文件里,需要浏览器的支持才能运行,小程序的主类是继承自系统类的JApplet类,且该类必须是public类。
java语言开发环境
Ps.当源文件中有public类时,要求文件名和public类名相同(不区分大小写,但最好相同),源文件名是由操作系统管理的,所以在使用javac命令编译源文件时,文件名是不区分大小写的。
① 什么是JDK?什么是JRE?二者的关系是什么?
A:JDK(Java Development Kit) 是Java开发人员的软件开发工具包。JDK 是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库,针对开发人员。JRE(Java Runtime Environment)包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的,针对用户。
② 环境变量Path和ClassPath的作用是什么?
当编译器找不到源代码时,会去Path的路径去寻找,而找不到类文件时,会去ClassPath寻找。
java语言基础
java中的数据类型分为两大类:基本数据类型(primitive types)和引用数据类型(reference types)简称引用数据类型,也叫符合数据类型。引用数据类型在内存中存放的是指向该数据的地址,不是数据本身,往往由多个基本数据类型组成,因此对引用数据类型的应用称为对象引用。在有些程序设计语言中叫指针。
①一个整数隐含为整型(int),即声明long型变量的值超过int的取值范围时,如果数的后面不加 l 或L系统就会认为int型出错。
②浮点数则隐含为double型,float须加 F 或 f。
③布尔型(boolean)也称为逻辑型,用于表示逻辑,false和true不能转换为数字表达形式。默认为false。
④字符型,java中采用unicode(两字节,16字符,无符号),前128位是ASCII码。
自动类型转换:将占用比特数少的转换为占用比特数多的数据。反之叫强制转换。
①转换前的数据类型与转换后的数据类型兼容。
②转换后的数据类型表示范围更大。byte
④>>右移;<<左移;>>>0填充右移。
A:由键盘输入数据的几种基本格式
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class EnterTest {
public static void main(String[] args) { //主方法
CharTest(); //调用System.in方法
ReadTest(); //调用ReadTest方法
ScannerTest();//调用ScannerTest方法
}
/**
* System.in和System.out方法
* 缺点一: 该方法能获取从键盘输入的字符,但只能针对一个字符的获取
* 缺点二: 获取的只是char类型的。如果想获得int,float等类型的输入,比较麻烦。
*/
public static void CharTest(){
try{
System.out.print("Enter a Char:");
char i = (char)System.in.read();
System.out.println("Yout Enter Char is:" + i);
}
catch(IOException e){
e.printStackTrace();
}
}
/**
* InputStreamReader和BufferedReader方法
* 优点: 可以获取键盘输入的字符串
* 缺点: 如何要获取的是int,float等类型的仍然需要转换
*/
public static void ReadTest(){
System.out.println("ReadTest, Please Enter Data:");
InputStreamReader is = new InputStreamReader(System.in); //new构造InputStreamReader对象
BufferedReader br = new BufferedReader(is); //拿构造的方法传到BufferedReader中
try{ //该方法中有个IOExcepiton需要捕获
String name = br.readLine();
System.out.println("ReadTest Output:" + name);
}
catch(IOException e){
e.printStackTrace();
}
}
/**
* Scanner类中的方法
* 优点一: 可以获取键盘输入的字符串
* 优点二: 有现成的获取int,float等类型数据,非常强大,也非常方便;
*/
public static void ScannerTest(){
Scanner sc = new Scanner(System.in);
System.out.println("ScannerTest, Please Enter Name:");
String name = sc.nextLine(); //读取字符串型输入
System.out.println("ScannerTest, Please Enter Age:");
int age = sc.nextInt(); //读取整型输入
System.out.println("ScannerTest, Please Enter Salary:");
float salary = sc.nextFloat(); //读取float型输入
System.out.println("Your Information is as below:");
System.out.println("Name:" + name +"\n" + "Age:"+age + "\n"+"Salary:"+salary);
}
}
Ps.
Java中不能使用
String str1 = "droid";
String str2 = "droid";
声明两个内容相同的字符串,这样会使得str2指向str1(即两者是同一个实例),必须要用new;
流程控制
检测Scanner实例中是否有双精度浮点型数据,可以使用reader.hasNextDouble()方法(无参)
查:Scanner类有什么方法及其参数。
①Java语言注释的方法:
1.//
2./* */
3.利用JDK的javadoc.exe命令所生成的扩展名为.html的注释文档。
数组与字符串
数组元素可以由基本数据类型的量组成,也可以由对象组成。
Java语言把内存分为两种:栈内存和堆内存。
在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配,当在一段代码中定义一个变量时,Java就在栈内存中为这个变量分配内存空间,当超出这个变量的作用域时,Java会自动释放掉为该变量所分配的内存空间。
堆内存用于存放由new运算符创建的数组和对象,在堆中分配的内存,由Java虚拟机的垃圾回收器来自动管理。在堆中创建了一个数组或对象后,还同时在栈中定义了一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数字或对象在堆内存的首地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量来访问堆中的数组或对象,引用变量就相当于是为数组或对象起的一个名称。
Java比较消耗内存,因为堆内存中的对象或数组,在没有引用变量指向它的时候(引用变量是栈内存中的,会及时释放),会在一个不确定是时间内被垃圾回收器收走(释放掉)。
Java中有一个特殊的引用型常量null,如果将一个引用变量赋值为null,则表示该引用变量不指向(引用)任何对象。引用变量的意思相当于C语言里面的指针。
使用java数组得到三步:1.声明数组 eg. int[] x; 2.分配空间 eg. x=new int[10];(也可以将前面两步合并成一行int [] x=new int [10];)3.创建数组元素并赋值。
? 这个表情有点萌
※foreach循环:JDK5后引入的新的for循环,不需要下表也可以遍历整个数组,需要提供三个数据1.元素类型,2.循环变量的名字(用于存储连续的元素),3.用于从中检索元素的数组。格式如下:
for(type element :array)
{
System.out.println(element);
...
}
其功能时每次从数组array中取出一个元素,自动赋值给变量element,用户不需要判断是否超出了数组的长度,需要注意的是element的类型必须与数组array中的元素类型相同。
二维数组分配内存的格式如下:
int [] []数组名;
数组名=new 数据类型[行数][列数];
Ps.Java中定义的数组不一定是规则的矩形数组。
对于定义不规则的二维数组,在定义时只需要给出高层维数即可,eg.
int[][]x=new int [3][];
它表示定义了一个数组引用变量x,第一个元素为x[0],第n个元素为x[n-1],x中从x[0]到x[n-1]的每个元素变量正好又是一个整数类型的数组引用变量。需要注意的是,这里只是哟啊求每个元素都是一个数组引用变量,并没有要求它们所引用数组的长度是多少,也就是每个引用数组的长度可以不一。
上面代码相当于定义了3个数组引用变量,分别是int [] x[0],int [] x[1],int [] x[2],完全可以把x[0],x[1],x[2]当中普通变量名来理解(数组引用变量),因此必须对他们赋值,指向真正的数组对象,才可以引用这些数组中的元素。eg.
x[0]=new int [3];
x[1]=new int [2];
x[2]=new int [4];
如果要定义一个n X m的规则矩阵,可以这样写:
int [][]x=new int [2][3];
通过x.length可以计算数组x的行数
x[0].length可以计算数组x的第一行的元素个数
在使用new来申请内存空间时,二维数组必须要求指定高层维数。
//正确示例
int[][]myarray=new int[10][];
int[][]myarray=new int[10][3];
//错误示例
int[][]myarray=new int[][3];
字符串
字符串有两种:一种是创建后允许经常修改和变动的字符串变量,,另一种是创建之后不会再做修改和变动的字符串变量。前者由于程序中经常需要对它进行添加插入修改之类的操作,所以这种字符串变量一般都存放在StringBuilder类的对象中;而后者由于程序中经常需要对它作比较,搜查之类的操作,所以通常把它放在一个具有一定名称的变量中,由程序完成对该对象的上述操作,在Java中存放这种字符串的变量是String类对象。
声明字符串的几种方法:
//first
String s;
s=new String("hello");
//second
String s= new String ("hello");
//third
String s="hello";
前面说过 String类的字符串不可以改变,如果硬要改变的话,会重新生成一个新的字符串。
String str="java";
str=str+"good";
这看起来是重新赋值,实际上在程序的解释过程不是这样。原本产生的str的一个字符串对象并且在内存中申请了一段空间,由于发现又需要重新赋值,在原来的空间已经不可能再追加新的内容,系统不得不将这个对象抛弃,再生成第二个新的对象str并重新申请一个新的内存空间,虽然str指向的内存地址(句柄)是同一个,但是对象已经不再是同一个了。
String类中的方法调用:字符串变量名.方法名();