一、Windows长用快捷键
ctrl+C:复制 , alt+f4:关闭窗口
ctrl+V:粘贴 , shift+delete:永久删除
ctrl+X:剪切 , ctrl+shift+esc:打开任务管理器(死机可以结束运行)
ctrl+A:全选 , windows+E:打开我的电脑
ctrl+Z:撤销 , windows+R:运行
ctrl+S:保存 ctrl+鼠标前推:放大屏幕(ctrl+0:恢复)
ctrl+alt+A:截图, ctrl+D:复制当前行到下一行
二、基本的Dos命令
1.开启DOS控制台的几种方式
打开CMD的方式
- 开始+系统+命令提示符
- windows+R(快捷键)->输入CMD(推荐使用)
- 在任意的文件夹下面,按住shift键+鼠标右键点击:在此处打开Powershell窗口
- 资源管理器的地址栏前面加上CMD 路径
以管理员方式运行
- 开始+系统+鼠标右击命令提示符->点击更多->以管理员方式运行
2.常用的DOS命令
- 盘符切换 D:
- 查看当前目录下的所有文件 dir
- 切换目录
cd/d f: --跨盘切换,切换到f盘,要用/d参数
cd+盘中的文件名–同盘目录查看
cd…–返回上一级目录 - 清理屏幕 cls
- 退出 exit
- 查看电脑ip ipconfig
- 打开应用
cals计算机
mspaint画图工具
notepad记事本 - ping命令(获得一些网站的ip信息)
ping www.baidu.com(获得百度的ip地址)(dos命令窗口鼠标右击就是粘贴) - 文件操作命令
md+文件夹名–创建文件夹(cd可以进去)
rd+文件夹名–删除目录(文件夹)
cd>+文件名–创建一个文件
del+文件名–删除文件
三、Java基础
1、注释、标识符、关键字
(1)java中注释有三种:(书写注释是一个好习惯)
- 单行注释 //
- 多行注释 /* 注释 */
- 文档注释 /** JavaDoc:文档注释 */
(2)标志符由字母、下划线、数字、美元符号$组成
- 第一个字符不能是数字
- 标志符不能是关键字
- 标志符也不能是null、false、true
- 大小写敏感
(3)关键字
abstract | assert | bolean | break | byte |
---|---|---|---|---|
case | catch | char | class | const |
contune | default | do | double | else |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | strictfp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
2、数据类型
java的数据类型分为两大类:
(1)基本数据类型
布尔类型:boolean(1位,true、false)
数值类型:
- 整数类型:
int(4字节)、byte(1字节)、short(2字节)、long(8字节)(long a=30L;//赋值时要在数字后面加上L) - 浮点型:
float(4字节)、double(8字节) - 字符型:
char(2字节)
(2)引用数据类型
- 类
- 接口
- 数组
3、数据类型扩展
public class Example{
public static void main(String args[]){
//整数拓展:进制 二进制 十进制 八进制0 十六进制0x
int i=10;
int i2=010; //八进制0
int i3=0x10; //十六进制0x
System.out.println(i);
System.out.println(i2);
System.out.println(i3);
//===========================================
//浮点数拓展 银行业务怎么表示?钱( 不用浮点数,使用BigDecimal 是一个数学工具类)
//===========================================
//float 有限 离散 有舍入误差 大约接近但不等于
//double
//最好完全避免使用浮点数进行比较
float f=0.1f; //0.1
double d=1.0/10; //0.1
System.out.println(f==d); //false
System.out.println(f); //0.1
System.out.println(d); //0.1
float d1=2131312312312312f;
float d2=d1+1;
System.out.println(d1==d2); //true
//===========================================
//字符拓展
//===========================================
char c1="a";
char c2="中";
System.out.println(c1);
System.out.println((int)c1);//强制转换
System.out.println(c2);
System.out.println((int)c2);
//所有的字符本质还是数字
//编码 unicode表(97=a 65=A) 2字节 0~65536
//转义字符
// \t 制表符
// \n 换行
System.out.println("hello\tword");
System.out.println("hello\nword");
}
}
10
8
16
==========================================
false
0.1
0.1
true
============================================
a
97
中
20013
hello word
hello
word
4、类型转换
精度低--------------------------------------------高:
byte,short,char->int->long->float->double
-
运算中,不同类型的数据先转化为同一类型,然后在进行运算
-
强制转换:(类型)变量名 高—低
自动转换: 低–高int money=10_0000_0000; int years=20; int total=money*years; //-1474836480,计算的时 候溢出了 long total2=money*years; //默认是int,转换之前已经存在问题了 long total3=money*((long)years); //先把一个数转换为long System.out.println(total3); //20000000000
-
不能对布尔值进行转换
-
不能把对象类型转换为不相干的类型
-
在把高容量转换到低容量的时候,强制转换
-
转换的时候可能存在内存溢出,或者精度问题
-
JDK7新特性,数字之间可以用下划线分割
int money=10_0000_0000;
4、变量、常量、作用域
(1)变量
type varName = value;
//数据类型 变量名 = 值
- 每一个变量都有类型,类型可以是基本类型,也可以是引用类型
- 变量名必须是合法的标识符
- 变量声明是一条完整的语句,必须以分好结束
(2)变量作用域
- 类变量
- 实例变量
- 局部变量
public class Variable{
static int allclicks=0; //类变量,用static 修饰的变量
String str="hello word"; //实例变量,从属于对象
public void method(){
int i=0; //局部变量,必须声明和初始化
}
}
(3)常量
final 常量名=值;
final double PI=3.14; //数据类型前都叫修饰符,修饰符不存在先后顺序
static final double PI=3.14; //final static double PI=3.14;
- 常量初始化后不能再改变值,不会变动的值
- 它的值被设定后,在程序运行过程中不允许被改变
- 常量名一般用大写字符
5、 运算符
Java语言支持如下运算符
- 算数运算符:+,-,*,/,%,++,–
- 赋值运算符:=
- 关系运算符:<,>,<=,>=,==,!=instanceof
- 逻辑运算符:&&(与and),||(或or),!(非)
- 位运算符:&,|,^,~,>>,<<,>>>(了解)
- 条件运算符:?:
x?y:z //如果x==true,则结果为y,否则为z
- 扩展赋值运算符:+=,-=,*=,/=
6、包机制
- 包语句的语法格式:
package pkg1;//一个包相当于一个文件夹
- 为了能够使用一个包的成员,需要在java程序中明确导入该报。使用import语句可完成此功能
import package1; //.*表示导入包中的所有类
参考书籍:《阿里巴巴Java开发手册》
7、JavaDoc生成文档(文档注释)
- JavaDoc命令是用来生成自己API文档的
- 参数信息
@author 作者名
@version 版本号
@since指明需要最早使用的jdk版本
@param参数名
@return返回值情况
@throws异常抛出情况 - 加载类上面就是类的注释,加在方法上面就是方法的注释
/**
*@author YuQing
*@version 1.0
*@since 1.8
*/
public class Doc{
String name;
/**
*@author YuQing
*@param name
*@return
*@throws Exception
*/
public String test(String name) throws Exception{
return name;
}
}
- 通过命令生成JavaDoc文档
鼠标右击所写的程序–>点击Show in Exporer–>在资源管理器地址加上cmd(Doc命令窗口)
–>写上 javadoc -encoding UTF-8 -charest UTF-8 Doc.java (javadoc+一些参数+java文件,上例的参数是为了更好识别中文)–>打开文件夹中index.html文件
–>可以看到生成的JavaDoc文档(文档注释的作用)
- 使用IDEA生成JavaDoc文档
五、Java流程控制
1、用户交互Scanner
- java提供的工具类:java.util.Scanner,通过Scanner类来获取用户的输入
- 基本语法
Scanner s=new Scanner(System.in);
- 通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据
- next()
1、一定要读取到有效字符后才可以结束输入
2、对输入有效字符之前遇到的空白,next()方法会自动将其去掉
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
4、next()不能得到带有空格的字符串 - nextLine()
1、以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
2、可以获得空白
import java.util.*;
public class N1 {
public static void main(String args[]){
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner=new Scanner(System.in);
System.out.println("使用next方式接受:");
//判断用户有没有输入字符串
if(scanner.hasNext()){
//使用next方式接收
String str=scanner.next();
System.out.println("输出的内容为:"+str);
}
//凡是属于IO流的类如果不关闭会一直占用资源, 要养成好习惯,用完就关掉
scanner.close();
}
}
/*从键盘依次输入若干数字,最后从键盘输入一个非数字字
符串结束整个输入操作过程,程序计算这些数的和和平均值*/
import java.util.*;
public class Example {
public static void main (String args[]){//快捷键:psvm回车
Scanner reader=new Scanner(System.in);
double sum=0;
int m=0;
while(reader.hasNextDouble()){
double x=reader.nextDouble();
m=m+1;
sum=sum+x;
}
System.out.printf("%d个数的和为%f\n",m,sum);
System.out.printf("%d个数的平均值为%f\n",m,sum/m);
}
}
2、顺序结构
- java的基本结构就是顺序结构,按照顺序一句一句执行,是最简单的算法结构
- 顺序结构是任何一个算法都离不开的一种基本算法结构
3、选择结构
- if单选择结构
if(布尔表达式){ }
//扩展:s.equals("h")判断s和h两个字符串是否相等
- if双选择结构
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
- if多选择结构
if(布尔表达式1){
}else if(布尔表达式2){
}else if(布尔表达式3){
}else{
}
- 嵌套的if语句
if(布尔表达式1){
if(布尔表达式2){
}
}
- switch多选择结构
1、switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支
switch(expression){
case value:
//语句
break;//可选
case value:
//语句
break;//可选
//可以有任意数量的case语句
default: //可选,找不到可以匹配的值就执行default语句
//语句
}
4、循环结构
- while循环
- do…while循环
- for循环(快捷键:5.for回车)
打印九九乘法表 - 增强for循环
1、在java中引入了一种主要用于数组或集合的增强型for循环
2、语法格式
for(声明语句:表达式)
{
//代码句子
}
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等
表达式:表达式是要访问的数组名,或者是返回值为数组的方法
5、break&continue
-
break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
-
continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
-
关于goto关键字(了解)
goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用: Java没有goto。然而,在break和continue这两个关键字的身 上,我们仍然能看出-些goto的影 子—带标签的break和continue.“标签” 是指后面跟一个冒号的标识符。例如: label: .
-
对Java来说唯- -用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。
6、练习
- 打印三角形
六、Java方法
1、何为方法
- Java方法是语句的集合,它们在一起执行一个功能
- 设计方法的原则就是一个方法只完成一个功能
public class N1 {
public static void main(String[] args) {
int sum=add(1,2);//add方法是类方法可以直接用类名调用
System.out.println(sum);
}
public static int add(int a,int b){//如果不加static则不能直接用类名调用
return a+b;
}
}
2、方法的定义及调用
Java的方法类似于其他语言的函数,一般情况下,定义一个方法包含一下语法:
(1)方法包含一个方法头和一个方法体,一个方法的所有部分:
- 修饰符(public、static、final…)
是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。 - 返回值类型
方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType是关键字void。 - 方法名
是方法的实际名称。方法名和参数表共同构成方法签名。 - 参数类型
参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
◆形式参数:用来定义作用的
◆实参:调用方法时实际传给方法的数据。 - 方法体
方法体包含具体的语句,定义该方法的功能。
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
(2)方法的调用
- 调用方法:对象名.方法名(实参列表)
- 当方法返回一个值时,方法调用通常被当作一个值
int large=max(30,40);
- 如果方法返回值是void,方法调用一定是一条语句
System.out.println("hello,word");
public class N2 {
public static void main(String[] args) {
int max=max(10,20);
System.out.println(max);
}
public static int max (int a,int b){
int result=0;
if(a==b){
System.out.println("a==b");
return 0; //终止方法
}
if(a>b){
result=a;
}else{
result=b;
}
return result;
}
}
拓展:值传递和引用传递(java都是值传递)
3、方法的重载
重载就是在一个类中,有相同的函数名称,但形参不同的函数。
(1)方法的重载的规则:
- 方法名称必须相同。
- 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)
- 方法的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为方法的重载。
(2)实现理论:
- 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
4、命令行传参
- 有时候希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现
public class CommandLine {
public static void main(String args[]){
//args.length数组长度
for(int i=0; i<args.length; i++){
System.out.println( "args[" + i + "]: " + args[i]);
}
}
}
5、可变参数
- JDK 1.5开始,Java支持传递同类型的可变参数给一个方法。
- 在方法声明中,在指定参数类型后加一个省略号(.…)。
- 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
public static void printMax( double. . . numbers) {
if (numbers.length == 8) {
System.out.print1n("No argument passed") ;
return;
}
double result = numbers[0];
/排序!
for ( int i =1; i <numbers.length; i++){
if (numbers[i] > result) {
result =numbers[i];
}
}
system.out.println( "The max value is " + result);
}
6、递归
- A方法调用B方法,我们很容易理解!
- 递归就是:A方法调用A方法!就是自己调用自己
- 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
- 递归结构包括两个部分:
(1)、递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
(2)、递归体:什么时候需要调用自身方法。
七、Java数组
1、数组概述
- 数组是相同类型数据的有序集合.
- 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
- 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们.
2、数组声明创建
- 首先必须声明数组变量,才能在程序中使用数组。
- 声明数组变量的语法:
dataType[] arrayRefVar; //首选的方法
或
dataType arrayRefVar[]; //效果相同,但不是首选方法
- Java语言使用new操作符来创建数组,语法如下:
dataType[ ] arrayRefVar = new dataType[arraysize];
- 数组的元素是通过索引访问的,数组索引从О开始。
- 获取数组长度:
arrays.length
- 静态初始化
int[] a = (1,2,3);
Man[] mans =(new Man(1,1),new Man(2,2)];
- 动态初始化
int[] a = new int[2];
a[0]=1;
a[1]=2;
- 数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
3、数组使用
(1)数组的四个基本特点
- 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 其元素必须是相同类型,不允许出现混合类型。
- 数组中的元素可以是任何数据类型,包括基本型和引用类型。
- 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
- 数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组
- 对象本身是在堆中的。
(2)数组的边界 - 下标的合法区间:[0, length-1],如果越界就会报错;
public static void main(String[ ] args) {
int[] a=new int[2];
system.out.println(a[2]);
}
- ArrayIndexOutOfBoundsException:数组下标越界异常!
- 数组是相同数据类型(数据类型可以为任意类型)的有序集合
- 数组也是对象。数组元素相当于对象的成员变量
- 数组长度的确定,不可变的。如果越界,则报:ArrayIndexOutofBounds
(3)数组的使用 - For-Each循环
- 数组作方法入参
- 数组作返回值
4、多维数组
- 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
- 二维数组
int a[][]= new int[2][5];
- 解析:以上二维数组a可以看成一个两行五列的数组。
- 思考:多维数组的使用?
num[1][0];
5、Arrays类
- 数组的工具类java.util.Arrays
- 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
- 查看JDK帮助文档
- Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"“不用"使用对象来调用(注意:是"不用”而不是“不能”)
- 具有以下常用功能:
a、给数组赋值:通过fil方法。
b、对数组排序:通过sort方法,按升序。
c、比较数组:通过equals 方法比较数组中元素值是否相等。
d、查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。
6、稀疏数组
- 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
- 稀疏数组的处理方式是:
(1)记录数组一共有几行几列,有多少个不同值
(2)把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模 - 左边是原始数组,右边是稀疏数组
八、面对对象
1、初识面向对象
- 面向对象编程(Object-Oriented Programming, OOP)
- 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
抽象
2、方法回顾和加深
- 方法的定义
修饰符、返回类型、break和return的区别、方法名、参数列表、异常抛出 - 方法的调用
静态方法、非静态方法、形参和实参、值传递和引用传递、this关键字
3、对象的创建分析
- 使用new关键字创建对象
- 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
class stu {
int age;
String name;
//age 和name 都是属性
public void say(){//方法
System.out.println(name+"is studying!");
}
}
stu xiaoming =new stu();//实例化xiaoming这个对象
- 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下俩个特点:
1.必须和类的名字相同
2.必须没有返回类型,也不能写void - 构造器必须要掌握
4、面对对象三大特性
(1)封装
-
我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部
-
干涉;低耦合:仅暴露少量的方法给外部使用。
封装(数据的隐藏) -
通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
(2)继承
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
- extands的意思是“扩展”。子类是父类的扩展。
- JAVA中类只有单继承,没有多继承!
- 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
- 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
- 子类和父类之间,从意义上讲应该具有"is a"的关系.
- object类
- super
用法
(1)子类想使用被隐藏的方法,必须使用关键字super
(2)子类使用super调用父类的构造方法
注意
a、super调用父类的构造方法,必须在构造方法的第一个
b 、super 必须只能出现在子类的方法或者构造方法中!
c 、super和 this 不能同时调用构造方法!
//super调用属性
public class Person {//Person类
protected String name = "xixi";//保护属性name
}
public class Teacher extends Person{//继承Person类
private String name = "haha";
public void test(){
System.out.println(this.name);//haha
System.out.println(super.name);//xixi,通过super关键词调用
}
}
//super调用方法
public class Person {
void print(){
System.out.println("Person");
}
}
public class Teacher extends Person {
void print() {
System.out.println("Teacher");
}
public void test() {
//正常的没有写出来的时候就是调用this,而且this关键字很多时候可以省略
print();//Teacher
this.print();//Teacher
super.print();//Person
}
}
- 方法重写
注意
需要有继承关系,子类重写父类的方法!
一旦子类重写了父类的方法f(),就隐藏了继承的的方法f()
要求
1、 方法名必须相同
2、参数列表必须相同
3、修饰符:范围可以扩大但不能缩小: public>Protected>Default>private
4、抛出的异常:范围,可以被缩小,但不能扩大;ClassNotFoundException --> Exception(大)
5、重写,子类的方法和父类必要一致;方法体不同!
(3)多态
- 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
- 多态存在的条件
a、有继承关系
b、子类重写父类方法
c、父类引用指向子类对象 - 注意:多态是方法的多态,属性没有多态性。
- instanceof
5、抽象类和接口
(1)抽象类
- abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
- 抽象类中可以有抽象方法,也可以有非抽象方法,对于抽象方法只允许声明,不允许实现
- 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。
- 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类
(2)接口
用法
- 接口通过关键字interface来声明
interface 接口的名字
- 接口体:包含常量定义和方法定义两部分。接口体只进行方法的声明,不允许提供方法的实现,所有方法的定义没有方法体
interface printable{
final int max=100;
void add();
float sum(float x,float y);
}
- 接口的使用用关键字implements
class A implements printable
- 如果一个类实现某个接口,那么这个类就必须实现该接口的所有方法
注意 - 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有!
- 接口:只有规范!
- 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。如果你是天使,则必须能飞。如果你是汽车,则必须能跑。如果你好人,则必须干掉坏人;如果你是坏人,则必须欺负好人。
- 接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。
- OO的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。
public interface Userinterface {//interface 定义接口
int timer = 0;//相当于 public static final int timer = 0;
void speed();//相当于 public abstract void speed();
}
public class Phone implements Userinterface{
@Override
public void speed() {
}
}
6、内部类及OOP实践
- 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。
1.成员内部类
⒉静态内部类
3.局部内部类
4.匿名内部类
九、异常
1、异常体系结构
2、Java异常处理机制
- 抛出异常
- 捕获异常
- 异常处理五个关键字
try、catch、finally、throw、throws - 对于异常的处理一般是捕获(try…catch)或者在方法上抛出(throws):
1.捕获,直接在catch方法中对异常进行处理(输出等),输出可以使用System.out(不建议)或printStackTrace方法
2.在方法中抛出,则需要在调用该方法时使用捕获或者抛出来处理异常
3、处理异常
4、自定义异常
- 使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。
- 在程序中使用自定义异常类,大体可分为以下几个步骤:
1.创建自定义异常类。
2.在方法中通过throw关键字抛出异常对象。
3.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
4、在出现异常方法的调用者中捕获并处理异常。
//捕获异常
public static void main(String[] args) {
int a = 1,b =0;
try {
System.out.println(a/b);
}catch (ArithmeticException e){//catch里面的是捕获异常的类型,可以多个捕捉异常
System.out.println(e);//把ArithmeticException异常视作e,输出e
}finally {
System.out.println("finally");//每次最后都会有finally执行
}
}
//要领,如果能遇到异常,不会一下子停止,而是会继续进行下去