本篇主要是自己学习Javase的笔记,参考B站视频课程https://www.bilibili.com/vide...
第一章:Java语言概述
1.1基础常识
- 常用dos命令:
dir: 列出当前目录下的文件以及文件夹
md: 创建目录
rd: 删除目录
cd: 进入指定目录
cd..: 退回到上一级目录
cd: 退回到根目录
del: 删除文件
exit: 推出dos命令行
1.2Java语言的特性
- Java语言的特性:面向对象,健壮性和完善性,跨平台性(一次编写,处处运行,Java虚拟机)。
- 面向对象:把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
- 面向过程:就是分析出解决问题的步骤,然后用函数把这些过程一步一步的实现,使用的时候一个一个调用就可以了。
- 面向对象能够更好的在抽象的层面来分析问题,在程序实现上可以极大的复用之前的代码,这些是面向过程编程很难实现的。
- Java语言是一个纯粹的面向对象的程序设计语言,它继承了c++面向对象技术的核心。Java舍弃了C语言中容易引起错误的指针(以引用取代),运算符重载,多重继承(以接口取代)等特性,增加了垃圾回收机制用于回收不再被引用的对象所占据的内存空间。jdk1.5又引入了泛型编程,类型安全的枚举,不定长参数和自动拆装箱。
- Java技术体系平台:
Java SE:标准版(J2SE),提供了完整的Java核心API
Java EE:企业版(J2EE),主要针对web应用开发
Java ME:小型版
Java Card:支持一些Java小程序
1.3Java语言运行机制及运行过程
Java的两种核心机制:
- JVM:Java虚拟机。JVM是一个虚拟的计算机,具有指令集,并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器。对于不同的平台,有不同的虚拟机。Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”。
- GC:垃圾回收机制:
c,c++内存回收由程序员手动编写代码回收,优点是:能够在内存不使用时及时回收,准确高效。缺点是:容易失误产生bug,例如:忘记编写回收内存的代码,进而使得内存一直不回收,产生内存泄漏。
Java垃圾回收是自动的,开了一个系统级的线程自动去检测哪些内存不使用了需要回收。优点是:自动的回收,意味着不会忘记回收;缺点是:回收不及时。一般的观点是:宁可回收不及时但一定要回收。使用自动的垃圾回收机制更为合适方便。
1.4jdk,jvm,jre之间的关系
JDK:Java开发工具包。
- JDK是提供给Java开发人员使用的,其中包含了Java的开发工具,Java的核心API,也包括了jre。其中的开发工具有:编译工具(javac.exe),打包工具(jar.exe)等。
jre:是Java运行环境。
- 包括Java虚拟机和Java程序所需要的核心类库。如果只是需要运行Java程序,则只需要安装jre即可。
关系:JDK包含JRE包含JVM。
1.5第一个Java程序helloworld
步骤:
- Java程序编写在
.java
文件中; - 通过
javac
命令对Java文件进行编译; - 通过
java
命令对生成的class
文件进行运行。
public class HelloWorld{
public static void main(){
System.out.println("hello world");
}
}
1.6注释
用于注解说明解释程序的文字就是注释。
提高了代码的阅读性;调试程序的重要方法。
Java注释分类:
- 单行注释://
- 多行注释:/ /
- 文档注释:/* /Java特有。
第二章:Java基本语法1
2.1关键字
- 定义:被Java语言赋予看特殊含义,用作专门用途的字符串(单词)。
- 特点:关键字中所有字母都为小写。
eg:int,long,class,interface,enum,byte,true,false,if,null等
Java保留字:现有Java版本尚未使用,以后版本可能会作为关键字使用,自己命名标识符时要注意避开这些保留字。byValue,cast,future,generic,inner,operator,outer,rest,var,goto,const
2.2标识符
标识符:Java对各种变量,方法和类等要素命名时使用的字符序列称为标识符。凡是可以自己起名字的地方都叫标识符。
规则:
- 由26个英文字母大小写,数字0-9,_或者$组成
- 数字不可以开头
- 不可以单独使用关键字和保留字,但能包含关键字和保留字。
- Java中严格区分大小写,长度无限制。
- 标识符不能包含空格。
- 注意:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
Java中的命名规范
- 包名:多单词组成时,所有单词字母都小写;例如:xxxyyyzzz。
- 类名、接口名:多单词组成时,所有单词首字母大写。XxxYyyZzz。
- 变量名、方法名:多单词组成时,第一个单词的首字母小写,第二个单词开始首字母大写;xxxYyyZzz。
- 常量名:所有字母都大写。多个单词时,每个单词之间使用下划线隔开:XXX_YYY_ZZZ。
- 命名规范是约定俗称的。
2.3变量的概念与定义
概念:
- 内存中的一个存储区域;
- 该区域有自己的名称和类型也就是变量名和变量的数据类型;
- Java中的每个变量必须先声明,后使用;
- 该区域的数据可以在同一类型范围内不断变化(变量的值可以改变)。
- 定义变量的格式:
数据类型 变量名 = 变量的值;
使用变量时注意:
- 变量的作用域:在一对{}之间有效。
- 初始化值。
变量是通过变量名来访问这块区域的。
2.4数据类型
2.4.1基本数据类型
整数类型:
定义long类型的变量赋值的时候要在值的后面加上“l”或者‘’L‘。
浮点类型:
Java中浮点类型默认是double,声明float类型时,后面需要加'f','F'
字符类型:
字符:用英文的单引号括起来的单个的字母、数字、符号;比如:char c1 = 'a';char c2 = '2';char c3 = '*';
转义字符:
布尔类型:
boolean类型数据只允许取值true或者false,没有null;
- 注意:不能用0或者非0的整数替代false和true,这点和c不一样。
2.4.2引用数据类型
String类
- 值null可以赋值给任何引用类型(类、接口、数组)的变量,用以表示这个引用类型变量中保存的地址为空。
- String类属于引用类型,可用nulI赋值。
- String类是一个典型的不可变类,String对象创建出来就不可能被改变。创建出的字符串将存放在数据区,保证每个字符串常量只有一个,不会产生多个副本。
- 假设"hello"的内存地址xxxxx,声明s0变量时给s0赋值"hello"实际上让s0变量引用"hello"的内存地址xxxxx;当我们再声明 变量s1也赋值"hello"的时候实际上也是直接把已经存在的"hello"的内存地址给s1引用 。
String sO = "hello"; String s1 = "hello"; Strings2 ="he" +"!"+"o"; (多级拼接)
2.4.2数据类型转换
- 自动类型转换:容量小的类型自动转换为容量大的数据类型。
- 数据类型按容量大小排序为:
- ASCII码: 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII 码。ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32 (二进制00100000),大写的字母A是65 (二进制01000001 )。
- 注意:char类型的字符在参与整数运算时,是转化成ASCII码值后再进行计算的。
- 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
- byte,short.char之间不会相互转换,他们三者在计算时首先转换为int类型。
- 当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型。
eg: String str = "err" + 1+ 2+3;输出结果是err123
System.out.println(3+4+"hello");输出结果是7hello
2.4.3强制类型转换
- 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符(),但可能造成精度降低或溢出, 格外要注意。
- 通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
如: Stringa="43"; int j= Integer.parselnt(a);
- boolean类型不可以转换为其它的数据类型。
- 隐式转换类型和强制转化类型。
- 数字类型的运算中,多个相同类型变量参与的运算,变量要先转换为相对应的数据类型的默认类型(比如两个byte类 的变量相加,会先把两个byte类型的变量转换成默认的int类型之后再计算,得到的结果是int类型) 。注意是数据类型的默认类型。
2.5运算符
2.5.1算术运算符
注意:
- 如果对负数取模,可以把模数负号忽略否记,如:
5%-2=1
。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。 - 对于除号“/", ,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 例如:
int x=3510;x= x/1000*1000; x的结果是?
- “+”除字符串相加功能外,还能把非字符电转换成字符串。例如:
System.out.printIn("5+5="+5+5); //
`打印结果是? 5+5=55` - 以下二者的区别:
//这个是数学运算System.out.println('*'+ t'+'*"); //字符串拼接System.out.println("*"+ "t' +'*);
2.5.2赋值运算符
- 符号: = 。当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则 进行处理。 支持连续赋值。
- 扩展赋值运算符:
+=,-=, *=, /=, %=;
在使用扩展赋值运算符时,变量在参与运算时会把结果自动强制转换为当前变量的类型。
2.5.3比较运算符
注意:比较运算符的结果都是boolean型,也就是要么是true,要么是false。比较运算符“==”不能误写成“=”。
2.5.4逻辑运算符
- 逻辑运算符用于连接布尔型表达式,在Java中不可以写成
3
, 应该写成 x>3 & x<6
。 - “&”和“&&”的区别: 单&时,左边无论真假,右边都进行运算; 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
- "|”和“||”的区别同理,||表示: 当左边为真,右边不参与运算。.
- 异或(^)与或( | )的不同之处是:当左右都为true时,结果为false。
- 理解:异或,追求的是“异”!
2.5.5位运算
2.5.6三元运算符
- 格式:
(条件表达式)?表达式1:表达式2;
条件表达式为true,运算后的结果是表达式1; 为false,运算后的结果是表达式2。
第三章:程序流程控制
注意:
- switch(表达式)中表达式的返回值必须是下述几种类型之一: byte, short, char, int,枚举,String;
- case子句中的值必须是常量,且所有case子句中的值应是不同的;
- default子句是可任选的,当没有匹配的case时, 执行default ;
- break语 句用来在执行完一个case分支后使程序跳出switch语句块;如果没有 break,程序会顺序执行到switch结尾。
特殊流程控制语句1
break语句 :break语句用于终止某个语句块的执行
{
.....
break;
}
特殊流程控制语句2
- continue语句 :continue语句用于跳过某个循环语句块的一次执行 ;
- continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是 哪一层循环 。
- continue语句用法举例:
public class ContinueTest {
public static void main(String args[]){
for (inti=0;i< 100;i++){
if (i%10==0)
continue;
System.out.println();
}
}
}
特殊流程控制语句3
- return:并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。
- 与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内 。
第四章:数组
4.1一维数组
4.1.1声明与初始化
一维数组的声明方式: type var[]或type[] var;
- 动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行
int[] arr = new int[3];
arr[0] = 3;
arr[1] = 9;
arr[2] = 8;
- 静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
int a[] = new int[]{ 3,9, 8};
int[] a = {3,9,8};
4.1.2数组元素的引用
- 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;
- 数组元素的引用方式:数组名[数组元素下标]
- 数组元素下标可以是整型常量或整型表达式。如
a[3],b[i],c[6*i];
- 数组元素下标从0开始;长度为n的数组合法下标取值范围:0—>n-1;如
int a[]=new int[3]
;可引用的数组元素为a[0]、a[1]、 a[2];
- 每个数组都有一个属性
length
指明它的长度,例如:a.length
指明数组a的长度(元素个数) - 数组一旦初始化,其长度是不可变的 。
数组元素的默认初始化
数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。例如:
public class Test {
public static void main(String argv[]){
int a[]= new int[5];
System.out.println(a[3]); //a[3]的默认 值为0
}
4.2多维数组
4.3数组常见问题
第五章: 面向对象编程
5.1面向对象与面向过程
5.1.1概念
- 面向对象(OOP)与面向过程(POP) :①二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为。面向对象,将功能封装进对象,强调具备了功能的对象。② 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽 象、分类、继承、聚合、多态等。
- 面向对象的三大特征 ①封装(Encapsulation) ②继承(Inheritance) ③多态(Polymorphism)。
5.1.2Java类及类的成员
- Java代码世界由诸多不同功能的类构成。
- 属性:对应类中的成员变量
- 行为:对应类中的成员方法
类的语法格式 :
修饰符class类名{
属性声明;
方法声明;
}
说明:修饰符public: 类可以被任意访问
类的正文要用{括起来
举例:
public class Person{
public int age ;//成员变量,类的成员变量可以先声明,
//不用初始化,类成员变量是有默认值,
//int的默认值是0,String是null
//声明公有变量age
public void showAge() { //声明方法showAge( )
System.out.println(age);
}
}
创建Java自定义类
- 步骤:
- 定义类(考虑修饰符、类名) ;
- 编写类的属性(考虑修饰符、属性类型、属性名、初始化值) ;
- 编写类的方法(考虑修饰符、返回值类型、方法名、形参等) 。
5.1.3 对象的创建和使用
- 使用
new +构造器
创建一个新的对象; - 使用“
对象名.对象成员
”的方式访问对象成员(包括属性和方法) ;
5.1.4类的成员属性
- 语法格式: 修饰符类型属性名=初值; 说明:修饰符private:该属性只能由该类的方法访问。 修饰符public:该属性可以被该类以外的方法访问。 类型:任何基本类型,如int、 boolean或任何类。
- 举例:
public class Person{
private int age; //声明private变量age
public String name = "Lila"; //声 明public变量name
}
补:
- 变量的分类:成员变量与局部变量 ;
- 在方法体外,类体内声明的变量称为成员变量。
- 在方法体内部声明的变量称为局部变量。
注意:
public static string sex = "男"://static,意思是静态的,这样的变量不需要类实例话成对象就可以使用,
//直接就可以通过类名.属性这样的方式直接调用,这样的变量叫做类变量
成员变量(属性)和局部变量网区别
- 成员变量:成员变量定义在类中,在整个类中都可以被访问。 成员变量分为类成员变量和实例成员变量,实例变量存在于对象所在的堆内存 中。 成员变量有默认初始化值;成员变量的权限修饰符可以根据需要,选择任意一个 。
- 局部变量:局部变量只定义在局部范围内,如:方法内,代码块内等。 局部变量存在于栈内存中。 作用的范围结束,变量空间会自动释放。 局部变量没有默认初始化值,每次必须显式初始化。 局部变量声明时不指定权限修饰符 。
5.1.5 类的成员之二:方法
- 语法格式:
修饰符 返回值类型 方法名(参数列表) { 方法体语句; }
说明:修饰符: public, private, protected
等。 返回值类型:return
语句传递返回值。没有返回值:void
。举例:
public class Person{
private int age;
public int getAge() {
return age;
} //声明方法getAge
public void setAge(int i) {
//声 明方法setAge,
age=i; //将 参数j的值赋给类的成员变量age
}
}
- 对象的创建和使用 举例:
如果创建了一个类的多个对象,对于类中定义的属性, 每个对象都拥有各自的一套副本,且互不干扰。
public class Zoo{
public static void main(String args[]){
Animal xb=new Animal();Animal xh=new Animal();
xb.legs=4;
xh.legs=0;
System.out.println(xb.legs); //4
System.out.println(xh.legs); //0
xb.legs=2; System.out.println(xb.legs); //2
System.out.println(xh.legs); //0
}}
方法(method)
- 什么是方法(函数)
方法是类或对象行为特征的抽象,也称为函数。
Java里的方法不能独立存在,所有的方法必须定义在类里。
修饰符 返回值类型 方法名(参数类型形惨1,参数类型形参2, ... {
程序代码
return返回值;
}
其中:
形式参数:在方法被调用时用于接收外部传入的数据的变量。
参数类型:就是该形式参数的数据类型。
返回值:方法在执行完毕后返还给调用它的程序的数据。
返回值类型:方法要返回的结果的数据类型。
实参:调用方法时实际传给函数形式参数的数据。
- 方法的调用
方法只有被调用才会被执行;
- 方法调用的过程分析:
注意:
- 没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。
- 定义方法时,方法的结果应该返回给调用者,交由调用者处理。
- 方法中只能调用方法,不可以在方法内部定义方法。
方法的重载
- 重载的概念:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
- 重载的特点:
与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时, 根据方法参数列表的不同来区别。
- 重载示例:
//返回两个整数的和
int add(int x,int y){return X+V;}
//返回三个整数的和
int add(int x.int y.int z){return x+V+Z;}
//返回两个小数的和
double add(double x,double y){return x+y;}
方法的可变个数形参
//下面采用数组形参来定义方法
public static void test(int a ,String[] books);
//以可变个数形参来定义方法
public static void test(int a ,tring..books);
说明:
1.可变参数:方法参数部分指定类型的参数个数是可变多个
2.声明方式:方法名(参数的类型名...参数名)
3.可变参数方法的使用与方法参数部分使用数组是一致的
4.方法的参数部分有可变形参,需要放在形参声明的最后
/**
用java特有的...的方式来传递可变个数的参数,这种参数在使用时与数组的使用方式相同
@param args
*/
public void printInfol (String... args) {
for(inti= 0; i < args.length; 1++) {
System. out. println (args [i]);
}
方法的参数传递
- 方法,必须有其所在类或对象调用才有意义。若方法含有参数:
形参:方法声明时的参数
实参:方法调用时实际传给形参的参数值
- Java的实参值如何传入方法呢?
Java里方法的参数传递方式只有一种:值传递。即将实际参 数值 的副本(复制品)传入方法内,而参数本身不受影响。
jvm内存模型
基本数据类型值保存在栈中,引用对象值保存在堆中,栈中存的是值在堆中的地址。
总结:方法的参数传递
1、如果方法的形参是基本数据类型,那么实参(实际的数据)向形参传递参数时,就是直接传递值,把实参的值复制给形参;
2、如果方法的形参是对象,那么实参(实际的对象),向形参传递参数 的时,也是把值给形参,这个值是实参在栈内存中的值,也就是引用对象 在堆内存中的地址 ;
3、基本数据类型都是保存在栈内存中,引用对象在栈内存中保存的是引|用对象的地址,那么方法的参数传递是传递值(是变量在栈内存的当中的值)。
5.2对象
5.2.1对象的产生
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型,如上面的Person及前面讲过的数组。
5.2.2 匿名对象
我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。 如: new Person().shout();
使用情况 :
- 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
- 我们经常将匿名对象作为实参传递给一个方法调用。
5.3包和引用
5.3.1关键字package
- package语句作为Java源文件的第一条语句, 指明该文件中定义的类所在的包。 (若缺省该语句,则指定为无名包)。它的格式为:
package顶层包名.子包名;
举例:
packTest.java
package p1; //指 定类Test属于包p1
public class Test{
public void display(){
System.out.println("in method display()");
}
- 包对应于文件系统的目录,package语句中, 用“.” 来指明包(目录)的层次;
- 包通常用小写单词,类名首字母通常大写。
- Java中的包package等同于文件夹,有多级,也就是包下可以由包和文件。
5.3.2关键字 import
- 为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类或全部类(.*)。import语句告诉编译器到哪里去寻找类。
- 语法格式:
import包名[子包名...]. <类名|*>
- 应用举例:
import p1.Test; //import p1.*;表示引入p1包中的所有类
public class TestPackage{
public static void main(String args[]){
Test t = new Test(); //Test类在p1包中定义
t.display(); }}
注意:
若引入的包为:java.lang,则编译器默认可获取此包下的类,不需要再显示声明。
import语句出现在package语句之后、类定义之前
一个源文件中可包含多个import语句
可以使用import lee.* ;语句,表明导入lee包下的所有类。而lee包下sub子包内 的类则不会被导入。import lee.sub.;
import语句不是必需的,可坚持在类里使用其它类的全名
JDK 1.5加入import static语句
5.3.3jdk中的主要包介绍
java.lang
---包含一些Java语言的核心类,如String、 Math、 Integer、 System、Thread,提供常用功能。java.net
--包含 执行与网络相关的操作的类和接口。java.io
---包 含能提供多种输入/输出功能的类。java.util
---包含一些实用工具类, 如定义系统特性、接口的集合框架类、 使用与日期日历相关的函数。-
java.text
---包含了一些java格式化相关的类 java.sql
---包含了java进行JDBC数据库编程的相关类/接口java.awt
---包含了构成抽象窗口工具集(abstract window tookits)的 多个类,这些类被用来构建和管理应用程序的图形用户界 面(GUI)。java.applet
---包含applet运行所需的一些类。
5.4面向对象特征之一:封装和隐藏
5.4.1封装实现
Java中通过将数据声明为私有的(private)
,再提供公共的 ( public)
方法:getXxx()和setXxx()
实现对该属性的操作, 以实现下述目的:
- 隐藏一个类中不需要对外提供的实现细节;
- 使用者只能通过事先定制好的方法来访问数据,可以方便地 加入控制逻辑,限制对属性的不合理操作;
- 便于修改,增强代码的可维护性;
5.4.2四种访问权限修饰符