Java学习手册:Java基础知识点(不断扩充更新中)

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请务必注明出处: https://blog.csdn.net/MaybeForever/article/details/89186089

1、Java中的程序代码可以分为结构定义语句功能执行语句

2、Java程序中一句连续的字符串不能分开在两行书写。如果为了方便阅读,想将一个太长的字符串分在两行书写,可以先将这个字符串分为两个字符串,然后用加号(+)将这两个字符串连起来,在加号(+)处断行

System.out.println("这是第一个"+
		"Java程序");

3、文档注释:文档注释是以/*开头,并在注释内容末尾以/结束。文档注释是一段代码概括性的解释说明,可以使用javadoc命令将文档注释提取出来生成帮助文档。

4、Java命名规则
(1)包名所有字母一律小写。
(2)类名和接口名每个单词的首字母要大写。
(3)常量名所有字母都大写,单词之间用下划线连接。
(4)变量名和方法名的第一个单词首字母小写,从第2个单词开始,每个单词首字母大写。(驼峰命名法)

5、在进行取模(%)运算时,运算结果的正负取决于被取模(%左边的数)的符号,与模数(%右边的数)无关。
例:(-5) % 3 = -2, 5 % (-3) = 2

6、Static关键字
①由static修饰的变量称为静态变量,也称类变量。
②静态变量定义位置在所有方法之外。
③静态变量与静态方法都是在类从磁盘加载至内存后被创建,与类同时存在,同时消亡。
④静态变量又称类的成员变量,在类中是全局变量,可以被类中的所有方法调用。
⑤静态变量的值由JVM自动初始化
整型→0,布尔型→false,浮点型→0.0,字符串型→null,字符型→Unicode编码为0的字符(该字符不可见)

7、JRE(Java运行环境):为Java运行提供运行时环境,包括JVM和Java系统类库。
JDK(Java虚拟机):JDK除了包含JRE之外,还包含开发Java程序所需要的一些命令、工具。
运行一个Java程序所需的最小环境为JRE,开发一个Java程序所需的最小环境为JDK

8、Java Scanner类中next()与nextLine()的区别
(1)next()
①一定要读取到有效字符之后才可以结束输入
②对输入有效字符之前遇到的空白,next()方法会自动将其去掉
③只有输入有效字符后才将其后面输入的空白作为分隔符或结束符
④next()不能得到带有空格的字符串
(2)nextLine()
①以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
②可以获得空白

9、String类型的值不可变(字符串内容不可更改)

public class StringDemo{
	public static void main(String[] args){
		String s1 = "Hello";
		String s2 = s1 + "World!";
		System.out.println(s2);
	}
}
//程序输出结果如下:
Hello World!

对于上述程序进行内存分析:
在这里插入图片描述

10、整数相除结果为整,小数部分无条件舍去(不四舍五入)。
算术运算时,整个结果为最大类型。
正数溢出变为负,负数溢出变为正。

11、int
①int类型范围不够,可使用long型。
②如果要表示long直接量,需要以L或l结尾。

int d = 10000000000;//编译错误,因为整数直接量超过整数范围
//10000000000这个数值写出来就是错误的,因为Java认为所有直接写出的整型都是int类型,而这个数值超过了int的表达范围
//直接量(literal):就是直接写出来的数,整数的直接量默认为int类型。
long d = 10000000000;//错误
long d = 10000000000L;//正确

12、double
①double常用于浮点数
②double无法精确表示1/10,会出现舍入误差

double b1 = 6;
double b2 = 5.9;
System.out.println(b1-b2);
//输出结果如下:
0.099...964

③小数的直接量为double类型
④float类型表示需加“f”或“F”

13、char
①char为字符类型,用于存储单个字符,‘a’,‘王’,‘克’
②char采用Unicode字符编码,实际存储的是字符所对应的编码(16位整数)

char ch = 'a';
System.out.println(ch);//赋值为字符
//程序输出结果为:a
char ch1 = 97;//赋值为整数
System.out.println(ch1);
//程序输出结果为:a
char ch2 = '97';//错误,两个字符

③字符的直接量放在单括号中’ ’
④’a’→97,‘A’→65,‘0’→48,’\n’表示回车,’\r’表示换行符
⑤转义字符:将特殊字符非特殊化,’\‘表示(\),’\“'表示(")

14、boolean
①boolean只能取值true或false(默认false)
②boolean一般用于存储关系运算的结果,常用于条件控制
③在Java中,布尔值和整数不能相互转换
问题:boolean类型占据多少字节?
答案:作为数组中某元素时,boolean类型占据1个字节(8bit);作为单个变量存储数据时,boolean类型占据4个字节(32bit)。

15、在使用+=,-=,*=,/=,%=运算符进行赋值时,强制类型转换会自动完成,程序不需要做任何显示的声明。
(关于强制类型转换,详见)

16、取余(%) 只能用于整数以及char类型。
注意:与例5的取模(%)运算略有差别,原因是:取模运算(“Modulo Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。

17、在JDK7.0中,switch语句的表达式增加了对字符串类型的支持。

switch(整型表达式){
	case (int/char类型):
		语句1;
		语句2;
		break;
}

18、do…while

do{
	语句块;
}while(boolean表达式);
//1、先执行语句块
//2、再计算boolean表达式的值,若为true,再次执行语句块,知道boolean值为false为止
//3、无论boolean表达式是否为true,都先执行一次语句块
注意:while(boolean表达式);最后面的分号一定要有!!!

19、Java在处理基本数据类型(例如int、char、double等)时,都是采用按值传递(传递的是输入参数的复制)的方式执行,除此之外的其他类型都是按引用传递(传递的是对象的一个引用)的方式执行。

20、深复制与浅复制的区别
浅复制(Shallow Clone):被复制对象的所有变量都含有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制(Deep Clone):被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象。而不再是原有的那些被引用的对象。换言之,深复制把复制的对象所引用的对象都复制了一遍。
以下例所示:

class Test{
	public int i;
	public StringBuffer s;
}

在这里插入图片描述
21、for循环
①三个表达式都可以省略,但分号不能省略,示例:for( ;;)
②表达式1、3可用逗号形式(当多条语句时),但2不可以,表达式2中不能有“,”(逗号),若有多个条件,可用(&&)或(||)连接。

22、默认值
基本类型数组创建后,元素是有默认值的:byte、short、int、long、char为0,而float和double为0.0,boolean默认值为false。
数组new之后,元素也有默认值。引用数组创建后,其元素的默认值为null,不创建元素对象。

23、数组的排序
JDK提供了Arrays.sort()方法封装了数组的排序算法。Arrays.sort()用的是快速排序。

package com.haobi;

import java.util.Arrays;
/*
 * Arrays.sort()的使用
 */
public class Test {
	public static void main(String[] args) {
		int[] arr = {49,45,65,21,37};
		Arrays.sort(arr);
		for(int i=0;i<arr.length;i++) {
			if(i == arr.length-1) {
				System.out.print(arr[i]);				
			}else {
				System.out.print(arr[i] + " ");
			}
		}
	}
}
//程序输出结果如下:
21 37 45 49 65

24、字符串与数字的相互转化

//1、将数字转换为字符串
int num = 5;
String s = String.valueOf(num);
//结果:s="5";

//2、将字符串转换为数字
String s = "55";
int num = Integer.parseInt(s);
//结果:num=55;

25、匿名对象
匿名对象就是没有名字的对象,如果程序中只是用一次该对象,就可以使用匿名对象的方式。

package com.haobi;
/*
 * 匿名对象
 */
class Student{
	public void tell() {
		System.out.println("Hello");
	}
}
public class Test1 {
	public static void main(String[] args) {
		new Student().tell();
	}
}
//程序输出结果如下:
Hello

26、引用型变量
①引用类型变量可以存储该类对象的地址信息,通常称为“指向该类的对象”,当一个引用类型变量指向该类的对象就可以通过这个变量对对象实施访问。
②除8种基本类型外,用类名、接口、数组等声明的变量都称为“引用类型变量”,简称引用变量。
当创建了引用类型的变量之后,就可以通过引用来访问对象的成员变量或调用方法。
(1)引用类型之间画等号:指向同一个对象,对其中一个修改,会影响到另一个。
(2)基本类型之间画等号:赋值,对其中一个修改,不会影响到另外一个。
关于堆空间、栈空间、方法区,详见

27、Null和NullPointerException
Null:空,意为不再指向任何对象
NullPointerException:当一个引用的值为Null的时候,如果通过引用访问对象成员变量或者调用方法是不合逻辑的,会产生NullPointerException

28、方法的签名
方法的签名包括方法名和参数列表。(方法名+参数列表)
注:一个类中不能出现两个方法签名一样的方法。参数列表只看类型,与参数名无关。

29、构造方法
主要用于为类中的属性初始化操作。
①常常用于给成员变量赋初值
②与类同名,没有返回值类型,也不写void
③在创建对象时被自动调用
④若自己不写构造,则编译器默认提供一个无参构造;若自己写了构造,则编译器不再默认提供。
⑤构造方法可以重载(构造常常需要重载),一个构造方法可以通过this关键字,方可调用另一个重载的构造方法
在一个类中定义的方法如果同时满足了以下3个条件,该方法称为构造方法。具体如下:
①方法名与类名相同
②在方法名的前面没有返回值类型的声明
③在方法中不能使用return语句返回一个值,但是可以单独写return语句作为方法的结束

30、在一个文件中只能存在一个public class XXX{}

31、static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错。

32、内部类可以在外部类中被使用,并能访问外部类的成员
如果想通过外部类去访问内部类,则需要通过外部类对象去创建内部类对象,创建内部类对象的具体语法格式如下:

外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

33、在一个静态方法中只能访问static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在调用时可以不创建任何对象。

34、成员变量和局部变量

- 成员变量 局部变量
类中位置 类中方法外 在方法定义中或者方法声明上
内存中位置 在堆内存 在栈内存
生命周期 随着对象的创建而存在,随着对象的消失而消失 随着方法的调用而存在,随着方法的调用完毕而消失
初始化值 有默认值初始化 没有默认值初始化,必须定义、赋值,然后才能使用

35、访问控制级别

访问范围 Private Default Protected Public
同一类中
同一包中 -
子类中 - -
全局范围 - - -

类的访问修饰只有2种。对于类,只能用public或默认方式修饰。(1)public修饰的类可被任一类使用;(2)默认访问控制的类只可以被同一个包中的类使用;
类成员的访问修饰:4种都可以。

36、Package
提供了一种命名机制,用于管理类名空间:
①避免类的命名冲突
②包名可以有层次结构,建议所有字母小写
③完全限定名:包名.类名
④同包类不能同名

37、import
①同包中的类可以直接访问
②不同包中的类:(1)import声明类,再直接访问(2)完全限定名:包名.类名

38、对象转型
(1)对象向上转型
父类 父类对象 = 子类实例 (程序自动完成
(2)对象向下转型
子类 子类对象 = (子类)父类实例 (强制类型转换

39、如果把0-65535范围内的一个int类型数直接量赋给char类型变量,系统会自动把这个int类型整数当成char类型来处理。

char ascii = 98;//等价于 char ascii = 'b';
System.out.println(ascii);
//程序输出结果如下:
b
//系统会将‘98’认定为两个字符,而char用于存储单个字符
char ascii = '98';//出错

40、byte、char、short三种类型参与运算时,先一律转换为int类型再进行运算。int直接量可以直接赋给byte、char、short三种类型,只要不超过其表示范围。

41、+
“+”有两种运算规则,一种是两端为数字则为数学加法运算,另一种是实现字符串连接,也可以实现字符串与其他数据类型的相连。

42、Math.round(double s)用于实现对浮点数值进行四舍五入的计算,返回long类型的整型数据

43、构造器
当调用子类构造器来初始化子类对象时,父类构造器总会在子类构造器之前执行。
子类构造器调用父类构造器分为如下几种情况:(A、B、C)
A、子类构造器执行体的第一行使用super显示调用父类构造器,系统将根据super调用里传入的实参列表调用父类对应的构造器。
B、子类构造器执行的第一行代码使用this显式调用本类中重载的构造器,系统将根据this调用里传入的实参列表调用父类对应的构造器。
C、子类构造器执行体中既没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参数的构造器。

44、子类的构造方法中必须通过super关键字调用父类的构造方法,这样可以妥善的初始化继承自父类的成员变量。如果子类的构造方法中没有调用父类的构造方法,Java编译器会自动加入对父类无参构造方法的调用。(如果父类没有无参构造方法,会有编译错误。)

45、String
java.lang.string使用了final修饰,不能被继承。(String是不可变对象:字符串创建后,内容不可改变)
字符串底层封装了字符数组及针对字符数组的操作算法。
字符串一旦创建,对象永远无法改变,但字符串引用可以重新赋值。
Java字符串在内存中采用Unicode编码方式,任何一个字符(算一个字符长度)对应两个字节的定长编码。
String常量值:静态字符串在常量池中创建,并尽量使用同一对象,重用静态字符串。对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果存在即返回对象。
若要修改String,则会创建新的对象。
(1)单独使用“ ”引号创建的字符串都是常量,编译期就已经确定存储到String Pool中。
(2)使用new String(" ")创建的对象会存储到heap(堆)中,是运行期新创建的。
(3)使用只包含常量的字符串连接符如“aa”+"aa"创建的也是常量,编译期就已经确定存储到String Pool中。
(4)使用包含变量的字符串连接符“aa”+s1创建的对象是运行期间才创建的,存储在heap中。

46、toString
Java语言中很多地方会默认调用对象的toString方法:
——字符串对象,自动调用对象的toString方法
——System.out.println(任意对象),直接调用toString方法
如果不重写toString方法,将使用Object类的toString方法,其逻辑为:

类名@散列码
//String重写toString就是将自身返回了
public String toString(){
	return this;
}

47、包装类
在进行类型转换的范畴内,有一种特殊的转换,需要将int这样的基本数据类型转换为对象。
所有基本类型都有一个与之对应的类,即包装类。
包装类用于解决基本类型不能参与面向对象开发:①包装类中封装了一些很实用的方法和常量;②包装类在集合中用来定义集合元素的类型;
包装类是不可变类,在构造了包装类对象后,不允许更改包装类在其中的值。
包装类是final的,不能定义它们的子类。

基本类型 包装类 父类
int java.lang.Integer java.lang.Number
long java.lang.Long java.lang.Number
double java.lang.Double java.lang.Number
short java.lang.Short java.lang.Number
float java.lang.Float java.lang.Number
byte java.lang.Byte java.lang.Number
char java.lang.Character java.lang.Object
boolean java.lang.Boolean java.lang.Object

6个数字类型的包装类都有两个常量:MAX_VALUE获取基本类型最大值;MIN_VALUE获取基本类型最小值。
Number的子类必须提供将表示的数值转换为byte、double、float、int、long和short方法:
——doubleValue():以double形式返回指定的数值
——intValue():以int形式返回指定的数值
Integer常用的功能:Integer的静态方法parseInt用于将字符串转换为int。

String str = "123";
int i = Integer.parseInt(str);//123

包装类都支持一个静态方法,允许将字符串转换为对应的基本数据结构,前提是,该字符串必须正确描述该基本类型可以保存的值。若不能准确描述则会抛出异常。

48、当一个字符串与一个字面量进行比较时,应当使用:字面量.equals(变量),这样可以避免空指针的发生。

49、新循环
增强for循环,又叫做新循环。

for(元素类型 e : 集合或数组){
	循环体
}

例如:

for(String str : array){
	//循环体
}

该循环不能替代传统for循环的工作,其只为了遍历集合或数组,不能对其中元素进行修改。
新循环是编译器认可,Java虚拟机不认可。
新循环在遍历集合的过程中就是迭代器,所以不能通过集合的方法删除元素。

50、遍历Map
遍历Map有三种方式:
(1)遍历所有的key

Set keySet()

该方法会将当前Map中所有的key存入一个Set集合后返回。所以遍历该集合就相当于遍历了所有的key。
(2)遍历所有的key-value

Set entrySet()

该方法会将当前Map中每一组键值对应的Entry实例存入一个集合后返回。所以遍历集合中的每一个Entry实例,再分别获取key、value,就达到了遍历每一组键值对的目的。
(3)遍历所有的value(不常用)

Collection values()

该方法会将所有的value存入一个集合后返回。
注:在Map中,每一组键值对由一个Map的内部类Entry的实例表示。Entry提供了两个方法分别是getKey(),getValue()用来获取这一键值对中的key和value。

猜你喜欢

转载自blog.csdn.net/MaybeForever/article/details/89186089