java学习 一 、基础语法 创建文件 HelloWorld.java(文件名需与类名一致)
输入pvsm回车自动创建主函数,sout输出打印
1 2 3 4 5 pvsm-》public static void main(String[] args) { } sout->System.out.println();
编写 Java 程序时,应注意以下几点:
大小写敏感 :Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
类名 :对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
方法名 :所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
源文件名 :源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java 。(如果文件名和类名不相同则会导致编译错误)。
主方法入口 :所有的 Java 程序由 public static void main(String[] args) 方法开始执行。
###注释类型
1 2 3 4 5 6 7 8 9 10 11 单行注释// 多行注释/**/ 文档注释/** *1 *1 *1 */
标识符和关键字 Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
关于 Java 标识符,有以下几点需要注意:
所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始
首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合
关键字不能用作标识符
标识符是大小写敏感的
合法标识符举例:age、$salary、_value、__1_value
非法标识符举例:123abc、-salary
可以使用中文,但不建议使用,拼音也少用,显得不咋好
面列出了 Java 关键字。这些保留字不能用于常量、变量、和任何标识符的名称。
类别
关键字
说明
访问控制
private
私有的
protected
受保护的
public
公共的
default
默认
类、方法和变量修饰符
abstract
声明抽象
class
类
extends
扩充、继承
final
最终值、不可改变的
implements
实现(接口)
interface
接口
native
本地、原生方法(非 Java 实现)
new
创建
static
静态
strictfp
严格浮点、精准浮点
synchronized
线程、同步
transient
短暂
volatile
易失
程序控制语句
break
跳出循环
case
定义一个值以供 switch 选择
continue
继续
do
运行
else
否则
for
循环
if
如果
instanceof
实例
return
返回
switch
根据值选择执行
while
循环
错误处理
assert
断言表达式是否为真
catch
捕捉异常
finally
有没有异常都执行
throw
抛出一个异常对象
throws
声明一个异常可能被抛出
try
捕获异常
包相关
import
引入
package
包
基本类型
boolean
布尔型
byte
字节型
char
字符型
double
双精度浮点
float
单精度浮点
int
整型
long
长整型
short
短整型
变量引用
super
父类、超类
this
本类
void
无返回值
保留关键字
goto
是关键字,但不能使用
const
是关键字,但不能使用
数据类型 java是一种强类型语言,所有变量必须定以后才能使用,更安全
java数据类型可以分为两大类:
基本类型
引用类型
每个变量都有类型,必须对应
基本类型
boolean
布尔型
byte
字节型
char
字符型
double
双精度浮点
float
单精度浮点
int
整型
long
长整型
short
短整型
区别去long,数字后面一般加一个L
float数字后加F
什么是字节
###数据类型拓展
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public class demo02 { public static void main (String[] args) { int i=10 ; int i1=010 ; int i2 = 0x10 ; System.out.println(i); System.out.println(i1); System.out.println(i2); float f=0.1f ; double d=1.0 /10 ; System.out.println(f==d); float d1=123123123123f ; float d2=d1+1 ; System.out.println(d1=d2); char c1='a' ; char c2 = '中' ; System.out.println(c1); System.out.println((int )c1); System.out.println(c2); System.out.println((int )c2); char c3='\u0061' ; System.out.println(c3); System.out.println("hello\tworld!" ); } }
转义字符
n
换行 (0x0a)
\r
回车 (0x0d)
\f
换页符(0x0c)
\b
退格 (0x08)
\0
空字符 (0x0)
\s
空格 (0x20)
\t
制表符
"
双引号
'
单引号
\
反斜杠
\ddd
八进制字符 (ddd)
\uxxxx
16进制Unicode字符 (xxxx)
类型转换 由于java是强类型语言,所以要进行有些运算的时候,需要用到类转换
低——————>高
byte,short,char->iny->long->float->double(小数优先级比较高)
运算中,不同类型的数据会先转化为同一类型,然后进行运算
强制类型转换 (类型)变量名 高–》低
自动类型转换 低–》高
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public static void main (String[] args) { int i = 128 ; byte b=(byte )i; System.out.println(i); System.out.println(b); System.out.println((int )23.7 ); System.out.println((int )-45.89f ); char c='a' ; int d=c+1 ; System.out.println(d); System.out.println((char )d); }
变量 java是一种强类型语言,每个变量必须声明其类型
java变量是程序中最基本的存储单元,其要是包括变量名,变量类型和作用域
1 2 type varName [=value][{,varName[=value]}] //数据类型 变量名=值;可以用逗号隔开来声明多个同类型变量。
####注意事项:
常量 常量(Constant):初始化(initialize)后不能再改变值!,不会变动的值
所谓常量可以理解为一种特殊的变量,他的值被设定以后,在程序运行过程中不允许改变
final 常量名=值;
final double PI=3.14;
常量名一般使用大写名字符。
1 2 3 4 5 6 7 8 9 public class demo07 { static final double PI=3.14 ; public static void main (String[] args) { System.out.println(PI); } }
变量命名规范 所有变量,方法,雷名:见名知意
类成员变量:首字母小写和驼峰原则:monthSalary 出了第一个字母以外后面每隔字符首字母大写
局部变量:首字母小写和驼峰原则
常量:大写字母和下划线MAX_VALUE
类名:首字母大写和驼峰原则
方法名:首字母小写he驼峰原则
运算符 算术运算符:+, -,*,l,%,++, –
赋值运算符= 关系运算符:>,<,>=,=,==,!= instanceof
逻辑运算符: &&,||,! 位运算符:&,|,^,~,>>,<<,>>>(了解! ! ! )条件运算符?︰ 扩展赋值运算符:+=,-=,*=,/=
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 package operator; public class Demo01 { public static void main(String[] args) { int a=10; int b=20; int c=25; int d=25; System.out.println(a+b); System.out.println(a-b); System.out.println(a*b); System.out.println(a/(double)b); } } package operator; public class Demo02 { public static void main(String[] args) { long a=123124151123L; int b=123; short c= 10; byte d=8; System.out.println(a+b+c+d);//long System.out.println(b+c+d);//int System.out.println(c+d);//int } } package operator; public class Demo03 { public static void main(String[] args) { //关系运算符返回的结果: 正确 错误 布尔值 int a=10; int b=2; int c=21; System.out.println(c%a); System.out.println(a>b); System.out.println(a<b); System.out.println(a==b); System.out.println(a!=b); } }
自增运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package operator;import org.w3c.dom.ls.LSOutput;public class Demo04 { public static void main (String[] args) { int a=3 ; int b=a++; System.out.println(a); int c = ++a; System.out.println(a); System.out.println(a); System.out.println(b); System.out.println(b); System.out.println(c); System.out.println(c); double pow = Math.pow(2 ,3 ); System.out.println(pow); } }
位运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package operator;public class Demo06 { public static void main (String[] args) { System.out.println(2 <<3 ); } }
三元运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package operator;public class Demo07 { public static void main (String[] args) { int a=10 ; int b=20 ; a+=b; a-=b; System.out.println(a); System.out.println(a+b); System.out.println("" +a+b); System.out.println(a+b+"" ); } } package operator;public class Demo08 { public static void main (String[] args) { int score = 80 ; String type=score<60 ?"不及格" :"及格" ; System.out.println(type); } }
运算优先级
类别
操作符
关联性
后缀
() [] . (点操作符)
左到右
一元
expr++ expr–
从左到右
一元
++expr –expr + - ~ !
从右到左
乘性
* /%
左到右
加性
+ -
左到右
移位
>> >>> <<
左到右
关系
> >= < <=
左到右
相等
== !=
左到右
按位与
&
左到右
按位异或
^
左到右
按位或
|
左到右
逻辑与
&&
左到右
逻辑或
| |
左到右
条件
?:
从右到左
赋值
= + = - = * = / =%= >> = << =&= ^ = | =
从右到左
逗号
,
左到右
包机制 为了更好的组织类,java提供了包机制,用于区别类名的命名空间。
包语句的语法格式为:
1 package pkg1[.pkg2[.pkg3...]];
一班利用公司域名倒置作为包名;
为了能够使用某一个包的成员,我们需要在java程序中明确导入该包。使用“import”完成此功能
1 import package [.package2...].(ckassname|*);
包就像文件夹一样
javaDoc javaDoc命令是用来生成自己Api文档的
命令行生成javadoc文档 1 javadoc -encoding UTF-8 -charset UTF-8 Demo.java
点开index.html
IDEA生成javadoc文档
第一步:选择生成JavaDoc文档的范围,我只对一个源文件生成Doc,所以选择文件。 第二步:输出目录最好新建一个文件夹,比较有条理和整洁 第三步:区域设置,决定文档的语言,简体中文就是zh_CN、繁体(台湾)zh_tw、繁体(香港)zh-hk、英语(香港)en-hk、英语(美国)en-us、英语(英国)en-gb、英语(全球)en-ww 第四步:其他命令行参数:如果区域设置为中国,参数一般为-encoding UTF-8 -charset UTF-8 第五步:设置完成后点击确定即可生成Doc文档
Java流程控制 ###Scanner对象
基本语法
Scanner s =new Scanner(System.in)
通过Scanner 类的next()与newxtLine()方法获取输入的字符串,在读取钱我们一般需要是hasNext()与NextLine()判断是否还有输入的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package com.qingchuan.Scanner;import java.util.Scanner;public class Demo01 { public static void main (String[] args) { Scanner scanner = new Scanner (System.in); System.out.println("使用next方式接收:" ); if (scanner.hasNext()){ String str = scanner.next(); System.out.println("输出的内容为:" +str); } scanner.close(); } }
next() 与 nextLine() 区别 next():
1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next() 不能得到带有空格的字符串。
nextLine():
1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。
如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package com.qingchuan.Scanner;import java.util.Scanner;public class Demo02 { public static void main (String[] args) { Scanner scanner=new Scanner (System.in); System.out.println("使用next方式接收:" ); if (scanner.hasNext()) { String str = scanner.nextLine(); System.out.println("输入数据为:" +str); } scanner.close(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package com.qingchuan.Scanner;import java.util.Scanner;public class Demo05 { public static void main (String[] args) { Scanner scanner=new Scanner (System.in); double sum=0 ; int m=0 ; while (scanner.hasNextDouble()) { double x = scanner.nextDouble(); m = m + 1 ; sum = sum + x; System.out.println("你输入了第" +m+"个数据" +",然后当前数据是" +sum); } System.out.println(m+"个数的和为" +sum); System.out.println(m+"个数的平均值是" +(sum/m)); scanner.close(); } }
顺序结构 代码依次执行的结构
任何一种结构的基本结构
if选择结构 语法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 if (布尔表达式){} else {} if (布尔表达式1 ){} else if (布尔表达式2 ){} else if (布尔表达式3 ){} . . .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package com.qingchuan.struct;import java.util.Scanner;public class IFDemo03 { public static void main (String[] args) { Scanner scanner = new Scanner (System.in); System.out.println("请输入考试成绩:" ); int sorce=scanner.nextInt(); if (sorce==100 ){ System.out.println("恭喜你,成绩满分!太棒了" ); }else if (sorce<100 &&sorce>90 ){ System.out.println("!还不错呦" ); }else if (sorce<90 &&sorce>80 ){ System.out.println("继续努力,你可以变得更好" ); } else if (sorce<80 &&sorce>70 ) { System.out.println("有点落下了,快点跟上啊!!!!" ); } else if (sorce<70 &&sorce>60 ) { System.out.println("不要灰心,相信你可以的!!" ); } else { System.out.println("别学了,回家种地吧!!!" ); } } }
if嵌套结构 1 2 3 4 5 if(布尔表达式){ if(布尔表达式){ }}
####switch多选择结构
switch语句中变量类型可以是:
byte,short,int char
从javaSE7开始
switch支持String类型
同事case标签必须为字符串常量或字面量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 switch (expression){case value:break :case value:break ;default :}
###循环结构
while循环 1 2 3 4 5 while(布尔表达式){ //循环内容 }
只要布尔表达式为true,循环就会一直执行下去。 我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环。少部分情况需要循环一直执行,比如服务器的请求响应监听等。 循环条件一直为true就会造成无限循环【死循环】,我们正常的业务编程中应该尽量避免死循环。会影响程序性能或者造成程序卡死奔溃!
1 2 3 4 5 6 7 8 9 10 11 12 13 package com.qingchuan.struct;public class WhilDemo01 { public static void main (String[] args) { int i=0 ; while (i<100 ){ i++; System.out.println(i); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 package com.qingchuan.struct;public class WhileDemo03 { public static void main (String[] args) { int i=0 ; int sum=0 ; while (i<=100 ){ sum=sum+i; i++; } System.out.println(sum); } }
do…while循环 对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件也至少执行一次。 do…while循环和while循环相似,不同的是,do…while循环至少会执行一次。
1 2 3 do { //代码语句 }while(布尔表达式);
While和do-While的区别: while先判断后执行。dowhile是先执行后判断! Do…while总是保证循环体会被至少执行一次!这是他们的主要差别。
For循环 虽然所有循环结构都可以用while或者do…while表示,但Java提供了另一种语句——fo循环,使一些循环结构变得更加简单。 for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。for循环执行的次数是在执行前就确定的。语法格式如下:
1 2 3 for(初始化;布尔表达式;更新){ //代码语句 }
100.for 接回车自动生成for循环语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package com.qingchuan.struct;public class ForDemo01 { public static void main (String[] args) { int a=1 ; while (a<=100 ){ System.out.println(a); a+=2 ; } System.out.println("while循环结束" ); for (int i=1 ;i<=100 ;i++){ System.out.println(i); } System.out.println("for循环结束" ); } }
计算0到100之间所有奇数和偶数的和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package com.qingchuan.struct;public class ForDemo02 { public static void main (String[] args) { int oddsum=0 ; int evensum=0 ; for (int i=0 ;i<=100 ;i++){ if (i%2 !=0 ){ oddsum+=i; } else { evensum+=i; } } System.out.println(oddsum); System.out.println(evensum); } }
用while循环或for循环输出1-1000之间能被5整除的数,并每行输出3个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.qingchuan.struct;public class ForDemo03 { public static void main (String[] args) { for (int i = 0 ; i < 1000 ; i++) { if (i%5 ==0 ){ System.out.print(i+"\t" ); } if (i%(5 *3 )==0 ){ System.out.println(); } } } }
打印九九乘法表 1 2 3 4 5 6 7 8 9 10 11 12 package com.qingchuan.struct;public class ForDemo04 { public static void main (String[] args) { for (int j = 1 ; j <=9 ; j++) { for (int i = 1 ; i <= j; i++) { System.out.print(j+"*" +i+"=" +(j*i)+"\t" ); } System.out.println(); } } }
####增强for循环
1 2 3 4 5 for(声明语句:表达式){ //代码句子 }
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.qingchuan.struct;public class ForDemo05 { public static void main (String[] args) { int []numbers={10 ,20 ,30 ,40 }; for (int i=0 ;i<4 ;i++){ System.out.println(numbers[i]); } System.out.println ("---------分割线--------------" ); for (int x:numbers){ System.out.println(x); } } }
break&&continue break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句 。(break语句也在switch语句中使用)
continue语句用在循环语句体中,用于终止某次循环过程 ,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。关于goto关键字 goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子—带标签的break和continue. “标签”是指后面跟一个冒号的标识符,例如:
对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另-个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。
打印三角形 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.qingchuan.struct;public class TestDemo01 { public static void main (String[] args) { for (int i = 1 ; i < 6 ; i++) { for (int j = 5 ; j>=i ;j--) { System.out.print(" " ); } for (int j=1 ;j<=i;j++) { System.out.print("*" ); } for (int j=1 ;j<i;j++){ System.out.print("*" ); } System.out.println(); } } }
Java方法 什么是方法?
Java方法是语句的集合,它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 ◆方法在程序中被创建,在其他地方被引用 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.qingchuan.Method;public class Demo01 { public static void main (String[] args) { test(); } public static int add (int a,int b) { return a+b; } public static void test () { for (int i = 0 ; i < 1000 ; i++) { if (i % 5 == 0 ) { System.out.print(i + "\t" ); } if (i % (5 * 3 ) == 0 ) { System.out.println(); } } } }
方法的定义 Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法: 方法包含一个方法头和一个方法体。下面是一个方法的所有部分: 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。 返回值类型∶方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType是关键字void。 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。 形式参数:在方法被调用时用于接收外界输入的数据。
实参:调用方法时实际传给方法的数据。 方法体:方法体包含具体的语句,定义该方法的功能。
1 2 3 4 5 6 修饰符返回值类型方法名(参数类型参数名){ 。。。 方法体 。。。 return 返回值;}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.qingchuan.Method;public class Demo02 { public static void main (String[] args) { int max=max(10 ,10 ); System.out.println(max); } public static int max (int num1,int num2) { int result=0 ; if (num1==num2){ System.out.println("num1=num2" ); return 0 ; } if (num1>num2){ result=num1; } if (num1<num2){ result=num2; } return result; } }
java都是值传递
方法的重载
重截就是在一个类中有相同的函数名称,但形参不同的函数。 方法的重载的规则: 方法名称必须相同。 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。方法的返回类型可以相同也可以不相同。 仅仅返回类型不同不足以成为方法的重载。 实现理论: 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 package com.qingchuan.Method;public class Demo03 { public static void main (String[] args) { double max=max(30.0 ,10.0 ,90.0 ); System.out.println(max); } public static int max (int num1,int num2) { int result=0 ; if (num1==num2){ System.out.println("num1=num2" ); return 0 ; } if (num1>num2){ result=num1; } if (num1<num2){ result=num2; } return result;} public static double max (double num1,double num2) { double result=0 ; if (num1==num2){ System.out.println("num1=num2" ); return 0 ; } if (num1>num2){ result=num1; } if (num1<num2){ result=num2; } return result;} public static double max (double num1,double num2,double num3) { double result=0 ; if (num1==num2){ System.out.println("num1=num2" ); return 0 ; } if (num1>num2){ result=num1; } if (num1<num2){ result=num2; } if (num3>num2+num1){ System.out.println("哇哦!这个数也太大了吧!" ); } return result;} }
命令行传参 可变参数 JDK 1.5开始,Java支持传递同类型的可变参数给一个方法。在方法声明中,在指定参数类型后加一个省略号(.….)。 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package com.qingchuan.method;public class Demo04 { public static void main (String[] args) { Demo04 demo04=new Demo04 (); demo04.test(1 ,2 ,3 ,4 ,5 ,6 ,7 ); } public void test (int ...i) { System.out.println(i[0 ]); System.out.println(i[1 ]); System.out.println(i[2 ]); System.out.println(i[3 ]); System.out.println(i[4 ]); System.out.println(i[5 ]); } }
递归
A方法调用B方法,我们很容易理解! 递归就是:A方法调用A方法!就是自己调用自己 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。 递归结构包括两个部分: 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。递归体:什么时候需要调用自身方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.qingchuan.method;public class Demo06 { public static void main (String[] args) { System.out.println(f(5 )); } public static int f (int n) { if (n==1 ){ return 1 ; } else { return n*f(n-1 ); } } }
边界条件:边界
前阶段:
返回阶段:n*(n-1)
尽量少用递归,压栈的时候电脑容易崩溃
数组 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们.
数组的声明和创建 首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
1 2 3 4 dataType[]arrayRefVar;//首选的方法 或 回 dataType arrayRefVar[];1/效果梅同,但不是首选方法
Java语言使用new操作符来创建数组,语法如下:
1 dataType[] arrayRefVar = new dataType[ arraySize];
数组的元素是通过索引访问的,数组索引从О开始。 获取数组长度: arrays. length
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package com.qingchuan.array;public class Demo01 { public static void main (String[] args) { int [] nums; nums=new int [10 ]; nums[0 ]=1 ; nums[1 ]=1 ; nums[2 ]=751 ; nums[3 ]=16 ; nums[4 ]=51 ; nums[5 ]=15 ; nums[6 ]=14 ; nums[7 ]=21 ; nums[8 ]=123 ; nums[9 ]=1 ; int sum=0 ; for (int i = 0 ; i <nums.length; i++) { sum=sum+nums[i]; } System.out.println(sum); } }
数组的四个基本特点 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。其元素必须是相同类型,不允许出现混合类型。 数组中的元素可以是任何数据类型,包括基本类型和引用类型。 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
java内存分析
三种初始化
静态初始化 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; 数组的默认初始化 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
数组是相同数据类型(数据类型可以为任意类型)的有序集合数组也是对象。数组元素相当于对象的成员变量 数组长度的确定的,不可变的。如果越界,则报:ArraylndexOutofBounds
数组的使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package com.qingchuan.array;public class ArraryDemo03 { public static void main (String[] args) { int []arrays={14 ,22 ,3342 ,4 ,545 }; for (int i=0 ;i<arrays.length;i++){ System.out.println(arrays[i]); } System.out.println("------------" ); int sum=0 ; for (int i=0 ;i<arrays.length;i++){ sum=sum+arrays[i]; } System.out.println("sum=" +sum); System.out.println(" 查找最大元素 " ); int max=arrays[0 ]; for (int i=0 ;i<arrays.length;i++){ if (arrays[i]>max){ max=arrays[i]; } } System.out.println("max=" +max); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package com.qingchuan.array;public class ArrayDemo04 { public static void main (String[] args) { int [] arrays = {1 , 2 , 3 , 5 , 7 }; printArrary(arrays); int [] reverse=reverse(arrays); printArrary(reverse); } public static void printArrary (int [] arrays) { for (int i = 0 ; i < arrays.length; i++) { System.out.print(arrays[i] + " " ); } } public static int [] reverse(int [] arrays) { int [] result=new int [arrays.length]; for (int i=0 ,j=result.length-1 ;i<arrays.length;i++,j--){ result[j]=arrays[i]; } return result; } }
多维数组 多维数组可以看成是数组的数组,比如一个二维数组
####Arrays类 数组的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。 查看JDK帮助文档 Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而”不用”使用对象来调用(注意:是”不用”而不是”不能”) 具有以下常用功能: 给数组赋值:通过fil方法。 对数组排序:通过sort方法,按升序。 比较数组:通过equals方法比较数组中元素值是否相等。 ◆查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package com.qingchuan.array;import java.util.Arrays;public class ArrayDemo06 { public static void main (String[] args) { int [] a={7 ,3 ,34 ,12 ,6 ,12 ,612 ,5 }; System.out.println(a); Arrays.sort(a); System.out.println(Arrays.toString(a)); printArray(a); Arrays.fill(a,2 ,5 ,0 ); System.out.println(Arrays.toString(a)); } public static void printArray (int [] a) { for (int i=0 ;i<a.length;i++){ if (i==0 ){ System.out.print("[" ); } if (i==a.length-1 ){ System.out.print(a[i]+"]" ); }else { System.out.print(a[i]+"," ); }} } }
冒泡排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 package com.qingchuan.array;import java.util.Arrays;public class ArrayDemo07 { public static void main (String[] args) { int [] b={7 ,3 ,65 ,2 ,65 ,34 ,74 }; int [] sort=sort(b); System.out.println(Arrays.toString(sort)); } public static int [] sort(int [] array){ int t=0 ; for (int i=0 ;i<array.length-1 ;i++){ boolean flag = false ; for (int j=0 ;j<array.length-1 -i;j++){ if (array[j+1 ]<array[j]){ t=array[j]; array[j]=array[j+1 ]; array[j+1 ]=t; flag=true ; } } if (flag==false ){ break ; } } return array; } }
稀疏数组
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方式是: 记录数组一共有几行几列,有多少个不同值 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模如下图:左边是原始数组,右边是稀疏数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 package com.qingchuan.array;public class ArrayDemo08 { public static void main (String[] args) { int [][] array1 = new int [11 ][11 ]; array1[2 ][3 ] = 1 ; array1[3 ][4 ] = 1 ; System.out.println("输出原始的数组" ); for (int [] ints : array1) { for (int anInt : ints) { System.out.print(anInt + "\t" ); } System.out.println(); } int sum = 0 ; for (int i = 0 ; i < 11 ; i++) { for (int j = 0 ; j < 11 ; j++) { if (array1[i][j] != 0 ) { sum++; } }} System.out.println("有效值的个数:" + sum); int [][] array2 = new int [sum + 1 ][3 ]; array2[0 ][0 ] = 11 ; array2[0 ][1 ] = 11 ; array2[0 ][2 ] = sum; int count = 0 ; for (int i = 1 ; i < array1.length; i++) { for (int j = 0 ; j < array1[i].length; j++) { if (array1[i][j] != 0 ) { count++; array2[count][0 ] = i; array2[count][1 ] = j; array2[count][2 ] = array1[i][j]; } } } System.out.println("稀疏数组" ); for (int i = 0 ; i < array2.length; i++) { System.out.println(array2[i][0 ] + "\t" + array2[i][1 ] + "\t" + array2[i][2 ] + "\t" ); } System.out.println("---------" ); System.out.println("还原" ); int [][] array3 = new int [array2[0 ][0 ]][array2[0 ][1 ]]; for (int i = 1 ; i < array2.length; i++) { array3[array2[i][0 ]][array2[i][1 ]] = array2[i][2 ]; } System.out.println("输出还原数组" ); for (int [] ints : array1) { for (int anInt : ints) { System.out.print(anInt + "\t" ); } System.out.println(); } } }
面向对象 java的核心思想是oop
面向过程思想:步骤简单清晰,第一步干什么,第二步干什么。。。
面对过程适合吃力一些较为简单的问题
面向对象思想:物以类聚,分类的的思维模式,思考问题首先为一解决文艺需要哪些分类,然后对这些分类进行单独思考,最后才对某个分类下的细节进行面向过程的思索
对于描述复杂的失误,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是具体到围观操作,仍然需要面向过程的思路去处理。
面向对象编程(object-Oriented Programming,OOP)
面向过程编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
抽象
三大特性:封装 继承 多态
从认识论的角度考虑的是现有对象后有类。对象,是具体的事物。类是抽象的,是对对象的抽象
从代码运行角度考虑是先有类后有对象。类是对象的模板
回顾方法的调用
####静态方法与非静态方法的一些不同
静态方法是和类一起加载的,有类就有静态方法,而非静态方法是类实例后才存在的
1 2 3 4 5 6 7 8 public static void a(){ b() } public static void b(){ a() }
都是静态方法的情况下可以互相引用
1 2 3 4 5 6 7 8 public static void a(){ b();//报错 } public void b(){ a(); }
a为静态方法,b为非静态方法的情况下,a没法引用b。b可以引用a
创建与初始化对象 使用new关键字创建对象
使用new关键字创建的时候,出了分配内存空间之外,还会给创建好的对象进项默认的初始化以及对类中构造器的调用。
类中的构造器也成为了构造方法,是在进行创建爱你对象的时候必须要调用的。并且构造器有以下俩个特点:1.必须和类的名字相同2.必须没有返回类型,也不能写void
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package com.oop.demo02;public class Application { public static void main (String[] args) { Student lzx=new Student (); Student ds=new Student (); lll.name="111; ds.name=" 杜顺"; lzx.age=99; ds.age=100; System.out.println(ds.name+" 喜欢"+lll.name); } }
1 2 3 4 5 6 7 8 9 10 package com.oop.demo02;public class Student { String name; int age; public void study () { System.out.println(this .name+"在学习" ); } }
####构造器详解
Person文件下明明没有方法,但application下却实例化成功,在生成的class文件下出现了一个方法,
使用new关键字,本质是调用构造器
如果存在了有参构造,无参构造就必须显示构造
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package com.oop.demo02;import javax.lang.model.element.NestingKind;public class Person { String name; public Person () { this .name="wawakaka" ; } public Person (String name) { this .name=name; } } package com.oop.demo02;public class Application { public static void main (String[] args) { Person wa=new Person ("1111" ); System.out.println(wa.name); } }
alt+insert(我的在f12旁边)快速插入构造器
封装 该露的露,该藏的藏
我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部书记操作细节自己完成,不允许外部干涉;低耦合,仅暴露少量的方法给外部使用。
封装(数据的隐藏)
通常,应金制直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这成为信息隐藏
属性私有,get/set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 package com.oop.Demo04;public class Student { private String name; private int id ; private char sex; private int age; public String getName () { return this .name; } public void setName (String name) { this .name=name; } public int getId () { return id; } public void setId (int id) { this .id = id; } public char getSex () { return sex; } public void setSex (char sex) { this .sex = sex; } public int getAge (int i) { return age; } public void setAge (int age) { if (age>12 &&age<24 ){ this .age = age; }else { age=3 ; } } } package com.oop.Demo04;import com.oop.Demo04.Student;public class Application { public static void main (String[] args) { Student s1=new Student (); s1.setName("杜顺" ); s1.setAge(33 ); System.out.println(s1.getAge(1 )); } }
封装的意义:
1.提高程序的安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统了维护增加了
继承 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。 extands的意思是“扩展”。子类是父类的扩展。 JAVA中类只有单继承,没有多继承! 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。 继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。子类和父类之间,从意义上讲应该具有”is a”的关系. object类 super
方法重写
####Super详解
application
1 2 3 4 5 6 7 8 9 10 11 12 13 package com.oop;import com.oop.Demo05.Student;public class Application { public static void main (String[] args) { Student student = new Student (); student.test("111" ); } }
student
1 2 3 4 5 6 7 8 9 10 11 12 13 package com.oop.Demo05;public class Student extends Person { private String name="qingchu" ; public void test (String name) { System.out.println(name); System.out.println(this .name); System.out.println(super .name); } }
person
1 2 3 4 5 6 7 8 9 package com.oop.Demo05;public class Person { protected String name="qingchuan" ; public void print () { System.out.println("Person" ); } }
super注意点:
super调用父类的构造方法,必须在构造方法的第一个2. super 必须只能出现在子类的方法或者构造方法中!3. super和 this 不能同时调用构造方法! vs this: 代表的对象不同: this:本身调用者这个对象super:代表父类对象的应用前提 this:没哟继承也可以使用 super:只能在继承条件才可以使用构造方法 this() ;本类的构造super():父类的构造!
方法重写(子父类之间) 静态的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 package com.oop;import com.oop.Demo05.A;import com.oop.Demo05.B;public class Application { public static void main (String[] args) { A a = new A (); a.test(); B b=new A (); b.test(); } } package com.oop.Demo05;public static class A extends B { public void test () { System.out.println("A=>test()" ); } } package com.oop.Demo05;public static class B { public void test () { System.out.println("B=>test()" ); } }
非静态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 package com.oop;import com.oop.Demo05.A;import com.oop.Demo05.B;public class Application { public static void main (String[] args) { A a = new A (); a.test(); B b=new A (); b.test(); } } package com.oop.Demo05;public class A extends B { @Override public void test () { System.out.println("A=>test()" ); } } package com.oop.Demo05;public class B { public void test () { System.out.println("B=>test()" ); } }
重写:需要有继承关系,子类重写父类的方法! 1.方法名必须相同 2. 参数列表列表必须相同 3.修饰符:范围可以扩大但不能缩小:public>Protected>Default>private 4.抛出的异常:范围,可以被缩小,但不能扩大: classNotFoundException –> Exception(大) 重写,子类的方法和父类必要一致:;方法体不同! 为什么需要重写: 1.父类的功能,子类不一定需要,或者不一定满足!
多态 即同一个方法可以根据发送对象的不同而采用不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
多态存在的条件:
有继承关系
子类重写父类方法
父类引用指向子类的对象
子类重写了父类的方法,输出父类
子类的set方法,父类却没法调用
对象能执行那些方法,要看对象左边的类型,右边关系不大
Student能调用的方法,只能是自己的或者继承来的
父类Person呢,可以调用自己的方法,没法调用子类独有的方法
强制类型转换
注意:1.多态是方法的多态,属性没有多态性
2.父类和子类:有联系,类型转换异常 ClaCastExeption
3.存在条件:继承关系,方法需要重写,父类引用指向子类对象 father发 =new son()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.oop; import com.oop.Demo06.Person; import com.oop.Demo06.Student; import com.oop.Demo06.teacher; public class Application { public static void main(String[] args) { //object>String //object>person>teacher //object>person>student Object a1 = new Student(); System.out.println(a1 instanceof Student); System.out.println(a1 instanceof Person); System.out.println(a1 instanceof Object); System.out.println(a1 instanceof String); System.out.println(a1 instanceof teacher); } }
不能重写:static 方法 属于类 不能实例
final 常量
private 私有
instanceof
instance of和类型转换 instance of可以判断两个类是否存在父子关系
()+要转的对象,alt+回车
1 2 3 4 5 public class Application { public static void main (String[] args) { Person obj = new Student (); Student student= (Student) obj; student.go();
这是低转高的类型,转换没有大问题,子类向父类转换,向上转型
高转低
1 2 3 4 5 6 7 8 public class Application { public static void main (String[] args) { Student student= new Student (); student.go(); Person person=student; } }
父类转子类会丢失一部分东西,强制转换
父类引用指向子类对象:向上转型 隐式转换 可能会丢失子类特有的方法 父类引用的变量无法使用子类特有的方法 如果父类引用变量需要使用子类特有的方法,此时需要将该父类引用变量显示转换为子类引用
static详解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 { //代码块(匿名代码块)创建对象时就生成,对象生成一次就加载一次 } static{ //静态代码块(匿名代码块)根类一块加载,就加载一次,永久存在 } package com.oop.Demo07; public class demo01 { //2.赋初值 { System.out.println("匿名代码块"); } //1只执行一次 static{ System.out.println("静态代码块"); } //3. public demo01() { System.out.println("构造方法"); } public static void main(String[] arga){ demo01 a1 = new demo01(); System.out.println("------"); demo01 a2 = new demo01(); } }
静态导入包 : import static java.lang.Math.random;
抽象类 abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
抽象类:
抽象类的所有方法,继承了他的子类,都必须实现要实现他的方法
抽象方法:只有方法的名字,没有方法的实现
不能new抽象类,只能靠子类去实现他
抽象类可以卸载普通方法里
抽象方法必须在抽象类中
抽象的抽象:约束
接口的定义与实现 普通类:只有具体实现 抽象类:具体实现和规范(抽象方法)都有!
接口:只有规范!自己无法写方法 专业的约束 约束和实现的分离:面接口编程 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。如果你是天使,则必须能飞。如果你是汽车,则必须能跑。如果你好人,则必须干掉坏人;如果你是坏人,则必须欺负好人。
接口的本质是契约 ,就像我们人间的法律一样。制定好后大家都遵守。 OO的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。 声明类的关键字是class,声明接口的关键字是interface
作用:
1.约束 2.定义一些方法,让不同的人实现~10—>1
public abstract
public static final 5。接口不能被实例化心,接口中没有构造方法6. implements可以实现多个接口 7.必须要重写接口中的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 package com.oop.demo09;public interface Userservice { int age=999 ; void add (String name) ; void delete (String name) ; void update (String name) ; void query (String name) ; } package com.oop.demo09;public class UserserviceImpl implements Userservice ,Timeservice{ @Override public void add (String name) { } @Override public void delete (String name) { } @Override public void update (String name) { } @Override public void query (String name) { } @Override public void time () { } } package com.oop.demo09;public interface Timeservice { void time () ; }
内部类 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。 1.成员内部类 ⒉静态内部类3.局部内部类4.匿名内部类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package com.oop.Demo010;public class Outer { private int id=1 ; public void out () { System.out.println("这是外部类的方法" ); } public class Inner { public void in () { System.out.println("这是内部类的方法" ); } } package com.oop;import com.oop.Demo010.Outer;public class Application { public static void main (String[] args) { Outer outer = new Outer (); Outer.Inner inner = outer.new Inner (); inner.in(); } }
一个java类中可以有多个class类,但是只能有一个public class类
局部内部类
异常机制 Error Error类对象由Java虚拟机生成并抛出√大多数错误与代码编写者所执行的操作无关。 Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止; 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
Exception一 在Exception分支中有一个重要的子类RuntimeException(运行时异常) ArraylndexOutOfBoundsException(数组下标越界)—NullPointerException(空指针异常) ArithmeticException(算术异常) MissingResourceException(丢失资源) ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。 这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生; Error和Exception的区别: Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理时,开且仕程序甲应该尽可能的云处理这些异吊。
异常处理的两个机制:
抛出异常 捕获异常
异常处理的五个关键字
:try,catch,finally,throw,throws
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.Expection;public class Test { public static void main (String[] args) { int a=1 ; int b=0 ; try { System.out.println(a/b); }catch (ArithmeticException e){ System.out.println("程序出现异常,变量b不能为0" ); }finally { System.out.println("finally" ); } } }
try监控区域 catch 捕获环境 finally 处理善后工作
try catch必须有,finally可以我没有
Ctrl+Alt+T自动包裹
错误异常分类
主动抛出异常
一般在方法中使用,在这个方法中处理不了,可以主动抛出
####自定义异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.Expection.demo02;public class Test { static void test (int a) throws myException { System.out.println("传递的参数为" +a); if (a>10 ){ throw new myException (a); } System.out.println("OK" ); } public static void main (String[] args) { try { test(111 ); } catch (myException e) { System.out.println("Myexception=》" +e); } } }