Java笔记补充
第一章 入门
-
Java不依赖于平台,是因为java虚拟机的存在。
-
JVM:JVM是(Java Virtual Machine)Java虚拟机的简称,我们如果想和计算机交流,那JVM就是这两者交流中的介质。
-
JDK和JRE的区别:
- JRE(Java Runtime Environment)是Java运行环境的简称。JRE由JVM和Java程序中所需的核心类库组成。JRE=JVM+类库
- JDK(Java Development Kit)Java开发工具包的简称。其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就不用再单独安装JRE。JDK=JRE+Java开发工具。
- 关系:使用JDK开发完成java程序,交给JRE运行
-
Java是纯粹的面向对象的程序设计语言,C++是面向对象和面向过程都支持的程序设计语言,这是因为C语言是C++的子集,而C语言是面向过程的程序设计语言。
-
Java应用程序开发步骤:
(1)编写源文件。文件扩展名必须是.java。
(2)编译源文件。使用javac.exe编译。得到字节码文件。
(3)使用Java SE平台中的Java解释器(java.exe)来解释字节码文件。 -
一个java文件只能有一个public class
-
反编译:把编译器得到的字节码文件还原为源文件。C语言生成的是机器码,所以很难在反编译。java的反编译器是:javap.exe。不能反编译出方法内容,只能反编译出方法名。
-
如果控制台显示“无法加载主类”的问题,应该看看我们的CLASSPATH的配置前面有没有加“.;”,这个点表示当前路径。也可以在控制台设置
set classpath=.
来解决问题。 -
Java中的数组,它的[]可以放在类型后面,也可以放在形参后面。有一点点小区别。
-
在控制台使用
javac Hello.java
来编译源文件,使用java Hello
来执行文件。
(1)javac命令可以将java源文件编译为class字节码文件。
(2)java命令可以运行字节码文件。 -
使用文本编辑器写Java代码时,一定要用ANSI码保存文件。
-
javac是JDK提供的编译器。
-
javac为编译器,javap为反编译,javadoc为生成帮助文档。jjava为解释器。
-
Java命名规则是类的首字母大写。方法和变量首字母小写,例:setName。标识符不能以数字打头,可以用_,不能用-。
-
byte short int long 在赋值数字是不区分精度大小,但使用变量赋值时,是区分精度的。
-
byte的范围是:-128~127
-
Java语言使用Unicode标准字符集,最多可以识别65536个字符
-
低精度的可以隐式的转为高精度。高精度不能隐式的转换,只能强制类型转换。
-
JDK1.5新增了和C语言中printf函数类似的输出数据的方法。
- 格式如下:
System.out.printf(“格式控制部分”,表达式1,表达式2,…表达式n) - 格式控制部分由格式控制符号:%d、%c、%f、%s和普通的字符组成,普通字符原样输出。格式符号用来输出表达式的值。
- %d输出int类型数据值;%c输出char型数据;%f输出浮点型数据,小数部分最多保留6位;%s输出字符串数据。
- 输出数据时也可以控制数据在命令行的位置,例如:%md输出的int型数据占m列;%m.nf输出的浮点型数据占m列,小数点保留n位。
- 格式如下:
-
System.out.printf("%20.8f",x);
。20为域宽,8为保留小数位数。 -
输入基本型数据,可以使用Scanner类创建一个对象。
Scanner reader=new Scanner(System.in);
。- 其中:reader对象调用下列方法,读取用户在命令行输入的各种基本类型数据:nextBoolean()、 nextByte()、 nextShort()、 nextInt() 、 nextLong()、nextFloat()、nextDouble()。
- 上述方法执行时都会堵塞,程序等待用户在命令行输入数据回车确认。
-
数组:
(1)声明一维数组有下列两种格式:- 数组的元素类型 数组名[];
- 数组的元素类型 [] 数组名;
- 例如:
float boy[];
char[] cat;
(2)声明二维数组有下列两种格式:
- 数组的元素类型 数组名[][];
- 数组的元素类型 [][] 数组名;
- 例如:
float a[][];
Char [][] b;
-
为一维数组分配元素的格式如下:
- 数组名 = new 数组元素的类型[数组元素的个数];
- 例如: boy = new float[4];
- 数组的声明和分配空间可以在声明时同时完成:
float boy []=new float[4];
1.1 IDEA真香
- IDEA的一个实用功能:Split Vertically,对照其他代码修改代码很方便
- Run:Alt+Shift+X
- 修改变量或方法名:Alt+Shift +r
- 查找替换:Ctrl+f或Ctrl+h
- 查找方法在哪被调用过:Ctrl +Shift+h
- 快捷操作:
(1)Run:Alt+Shift+X
(2)main方法:psvm(可以在Live Templates修改,main)
(3)输出:sout+回车。或者"Hello".sout。
(4)循环:fori
(5)遍历数组:itar
(6)在文件的settings的Live Templates查看模板。
(7)可以在Live Templates中自定义模板。
第二章 运算符、表达式、语句
- 如果表达式中最高精度是double(float、long)类型,则按double(float、long)运算。
- 如果表达式最高精度低于int型,则按int精度进行运算。
- java允许把不超出byte,short,char的取值范围的算术表达式的值赋值给byte,short,char。例如:(byte)30+'a"是结果为127的int型。a为97。
int m=1;
byte x;
x=1+'a';//x=98.
//x = m+'a';是错的
- 关系运算符只能得到true或false。和C不一样,C得到的是1或0。
- 尽量把常量写左边。j
- java逻辑运算符&&,||,!两边只能是布尔类型表达式(即:只能是true&&false之类的。)。java不能是4&&5之类的,C则可以。
- 位运算:按位与,按位或,按位异或(^)。二进制。
- in
- java的条件表达式只能是布尔类型的。if,while,
- switch语句的括号里面不能是long类型的值。
- for(声明循环变量:数组名){……}。循环变量依次与数组的每一个元素。这个循环变量不能在外面声明。
第三章 类和对象
-
类的组成:
(1)成员变量。和声明位置无关。- 有默认值
- 有效范围是整个类。
- 声明成员变量给初值不是赋值语句。
- 不能在类中定义变量之后再给赋值语句。即:类体中没有语句,只能在方法体内。
(2)方法。方法中有局部变量。
- 局部变量与声明位置有关。
- 局部变量和成员变量同名,则在方法体内,成员变量被隐藏,暂时失效。
- 使用this关键字使用成员变量。
- 局部变量没有默认值,不是C语言中的垃圾值。
-
构造方法:创建对象时使用。
(1)名字和类名完全相同,没有类型。
(2)默认构造方法:我们没有写构造方法,编译器会自动加一个构造方法。
(3)自定义构造方法。我们写了构造方法,编译器不会加默认构造方法。可以有多个构造方法(重载)。 -
创建对象:类是一种数据类型。
(1)声明对象:类声明的变量叫对象变量。相当于给对象起个名。
(2)创建对象:使用new关键字为对象分配变量。即:实例化。相当于把这个对象造出来。
(3)对象声明之后只是个空对象。只有在new之后才是一个完整的对象。我们要避免使用空对象,不然会出现编译通过,但是运行出错。 -
使用对象:
(1)对象.变量。对象.方法。 -
对象的引用和实体:
(1)对象本身中存放着引用,自己可以操作分配给自己的变量,调用类提供的方法。
(2)分配给对象的变量称为对象的“实体”。
(3)两个类型相同的对象,如果二者的引用相同(赋值),那么二者就具有完全相同的“实体”。例:obj1 = obj2
-
类与程序的基本结构:
(1)一个Java程序(工程)由若干个类构成。
(2)这些类可以在一个源文件中,也可以分布在多个源文件中。提倡一源文件一个类。
(3)有main方法的类叫主类。一个源文件只能有一个public类。public类的类名必须和源文件名一样。 -
参数传值:
(1)传值机制:方法中参数变量的值是调用者指定的值的拷贝。
(2)基本数据类型参数的传值。
(3)引用类型参数的传值。- 比如:数组
int [] a;a = new int[4];
,对象都是引用类型。 - 方法的参数是数组或对象时,把实参的值拷贝到形参中,实参和形参就指向同一个东西,即:可以通过形参改变实参的值。
- 比如:数组
-
对象的组合:
(1)一个类可以把某个对象作为自己的一个成员变量。 -
组合与复用:
(1)如果一个对象a组合了对象b,那么对象a就可以委托对象b调用其方法,即对象a以组合的方式复用对象b的方法。
(2)通过组合对象来复用方法有以下特点:- 通过组合对象来复用方法也称为“黑盒”复用,因为当前对象只能委托所包含的对象调用其方法,这样一来,当前对象对所包含的对象的的方法的细节一无所知。即:在类的内部使用这个对象成员的方法。
- 当前对象随时可以更换所包含的对象,即:对象与所包含的对象属于弱耦合的关系。
- 【注意】一个类声明的两个对象如果具有相同的引用,二者就具有完全相同的变量(实体)。
-
实例变量和类变量:在类成员中加static修饰符的是类变量,否则就是类变量(静态变量)。
(1)区别:- 不同对象的实例变量互不相同。
- 所有对象共享类变量。
- 通过类名可以直接访问类变量。不需要通过对象。而实例变量只能通过对象访问。
-
实例方法和类方法的定义:使用static关键字。
(1)实例方法:没有使用static关键字修饰的方法叫实例方法。
(2)类方法:使用static关键字修饰的方法叫类方法。
(3)区别:- 通过对象调用实例方法,只能通过对象。实例方法可以操作所有变量。
- 可以通过类名调用类方法。也可以通过对象。类方法只能操作类变量(静态变量)。
- 如果不需要操作成员变量,就可以将这样的方法写成静态的。比如:库函数Arrays.sort(a);,就是直接使用Arrays这个类名调用sort这个方法。
- 不能在静态方法中直接使用非静态的方法。如下,
void fun1()
{
System.out.println("oio");
}
static void fun()
{
fun1();
System.out.println("he");
}
编译出错。
- 方法重载:Java中有两种多态:重载和重写。
(1)重载:一个类中可以有多个相同名字的方法,但必须保证方法的参数不同。不能以方法返回值区分。 - this关键字:表示某个对象。用来访问本类成员。
(1)this可以出现在实例方法和构造方法中,但不能出现在类方法(静态方法)中,但是可以使用类名来访问静态成员,如下。。
(2)因为实例方法一定是对象来调用,当一个对象调用实例方法时,那么该实例方法中的this就代表当前正在调用该方法的对象。
class AAA{
static int c;
static void set(int b)
{
AAA.c=b;//不能使用this.c=b;
}
}
-
包:类似与文件夹。包语句:package。
(1)用【.】分隔。作为源文件的第一条语句。
(2)按照包名形成的目录来存放字节码文件。 -
import语句:引入包中的类。不引入包,则写类的全称。
(1)引入自定义包:把程序使用的自定义的包所形成的目录都放在同一文件夹中,import引入即可。 -
访问权限:是指对象是否可以通过【.】运算符去操作自己的变量或方法。private,public、protected、友好。
(1)注意:在编写类的时候,类中的实例方法总是可以操作该类中的实例变量和类变量、类方法总是可以操作自己的类变量,与修饰符无关。 -
不同包不能访问友好类。
-
基本类型的类封装:Byte、Integer、Short、Long、Float、Double和Character类。Character中有很多实用的类,类似于C中的String.h头文件的作用。
-
对象数组:数组元素的对象。
(1)创建对象数组:例:Demo [] arr = new Demo[10];
,这只是创建了对象的数组,即:每个对象还都是空对象。
(2)创建对象:例:arr[0] = new Demo();
。