hello,World!
hello,World!
hello,World!
hello,World!
shiyimuya学java
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JXWnOjJs-1651326229913)(F:\322861.jpg)]
点击跳转到博客
(-加回车)
名字 | 性别 | 生日 |
---|---|---|
(```)
DOS(Disk Operating System),Windows,Linux,Unix,Mac,Android,iOS
WPS,QQ,微信,英雄联盟,绝地求生等
选择以管理员方式运行
#盘符切换 磁盘名:
#查看当前目录下的所有文件 dir
#切换目录 cd /d 磁盘名:
#cd ..
#清楚屏幕 cls (clear screen)
#退出终端 exit
#查看电脑的ip ipconfig
#打开计算器 calc 打开画图工具 mspaint 打开记事本 notepad
#ping命令
ping www.baidu.com
#文件操作
md 目录名
rd 目录名
cd> 文件名
del 文件名
javaSE javaME javaEE
Java Development Kit : java开发者工具
Java Runtime Environment: java运行时环境
Java Virtual Machine: java虚拟机
jvm可以用软件实现,也可以用硬件实现
1) 文件后缀名为.java
2) hello.java
public class Hello{
public static void main(String[] args){
System.out.print("Hello,World!");
}
}
编译javac java文件,会生成一个class文件
运行class文件,java class文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gpx51m3z-1651326248393)(C:\Users\ywrdsg\AppData\Roaming\Typora\typora-user-images\image-20220425215620604.png)]
helloworld
public class Hello {
public static void main(String[] args) {
System.out.println("Hello,World!");
}
}
类:狗这类动物
方法:狗会吠 ,狗会摇尾巴 等等
对象:某一条狗
封装:你只需知道狗会吠就好,无需知道它为什么可以吠,喉咙和舌头怎么运作也不需要知道
继承:狗类继承自犬类,狼类继承自犬类,他们都吃肉,都能跑,这些都是犬类的方法
多态:虽然狼和狗都继承自犬类,但狗类实现了听主人话接口接口,狼类实现了嗷嗷叫接口接口,所以他们就呈现出多态。
https://blog.csdn.net/qq_60750453/article/details/120829332
单行注释
// xxxxxxxxxxxxxxx
多行注释
/*
这是多行注释
这是多行注释
这是多行注释
*/
文档注释
/**
* JavaDoc:文档注释
*/
/**
* @Description HelloWorld
* @Author ywr学Java
*/
public class HelloWorld {
public static void main(String[] args) {
//单行注释
//输出一个Hello,World!
System.out.println("Hello,World!");
//有趣的代码注释
/**
* ii. ;9ABH,
* SA391, .r9GG35&G
* ii13Gh; i3X31i;:,rB1
* iMs,:,i5895, .5G91:,:;:s1:8A
* 33::::,,;5G5, ,58Si,,:::,sHX;iH1
* Sr.,:;rs13BBX35hh11511h5Shhh5S3GAXS:.,,::,,1AG3i,GG
* .G51S511sr;;iiiishS8G89Shsrrsh59S;.,,,,,..5A85Si,h8
* :SB9s:,............................,,,.,,,SASh53h,1G.
* .r18S;..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,....,,.1H315199,rX,
* ;S89s,..,,,,,,,,,,,,,,,,,,,,,,,....,,.......,,,;r1ShS8,;Xi
* i55s:.........,,,,,,,,,,,,,,,,.,,,......,.....,,....r9&5.:X1
* 59;.....,. .,,,,,,,,,,,... .............,..:1;.:&s
* s8,..;53S5S3s. .,,,,,,,.,.. i15S5h1:.........,,,..,,:99
* 93.:39s:rSGB@A; ..,,,,..... .SG3hhh9G&BGi..,,,,,,,,,,,,.,83
* G5.G8 9#@@@@@X. .,,,,,,..... iA9,.S&B###@@Mr...,,,,,,,,..,.;Xh
* Gs.X8 S@@@@@@@B:..,,,,,,,,,,. rA1 ,A@@@@@@@@@H:........,,,,,,.iX:
* ;9. ,8A#@@@@@@#5,.,,,,,,,,,... 9A. 8@@@@@@@@@@M; ....,,,,,,,,S8
* X3 iS8XAHH8s.,,,,,,,,,,...,..58hH@@@@@@@@@Hs ...,,,,,,,:Gs
* r8, ,,,...,,,,,,,,,,..... ,h8XABMMHX3r. .,,,,,,,.rX:
* :9, . .:,..,:;;;::,.,,,,,.. .,,. ..,,,,,,.59
* .Si ,:.i8HBMMMMMB&5,.... . .,,,,,.sMr
* SS :: h@@@@@@@@@@#; . ... . ..,,,,iM5
* 91 . ;:.,1&@@@@@@MXs. . .,,:,:&S
* hS .... .:;,,,i3MMS1;..,..... . . ... ..,:,.99
* ,8; ..... .,:,..,8Ms:;,,,... .,::.83
* s&: .... .sS553B@@HX3s;,. .,;13h. .:::&1
* SXr . ...;s3G99XA&X88Shss11155hi. ,;:h&,
* iH8: . .. ,;iiii;,::,,,,,. .;irHA
* ,8X5; . ....... ,;iihS8Gi
* 1831, .,;irrrrrs&@
* ;5A8r. .:;iiiiirrss1H
* :X@H3s....... .,:;iii;iiiiirsrh
* r#h:;,...,,.. .,,:;;;;;:::,... .:;;;;;;iiiirrss1
* ,M8 ..,....,.....,,::::::,,... . .,;;;iiiiiirss11h
* 8B;.,,,,,,,.,..... . .. .:;;;;iirrsss111h
* i@5,:::,,,,,,,,.... . . .:::;;;;;irrrss111111
* 9Bi,:,,,,...... ..r91;;;;;iirrsss1ss1111
*/
/*
多行注释,可以注释多行文字
*/
/*
这是多行注释
这是多行注释
这是多行注释
*/
/**
* JavaDoc:文档注释
*/
/**
* @Description HelloWorld
* @Author ywr学Java
*/
}
}
public class Demo01 {
public static void main(String[] args) {
//不规范
String 王者荣耀 = "最强王者";
System.out.println(王者荣耀);
//大小写敏感
String Man = "ywr";
String man = "ywr";
String Ahello = "ywr";
String hello = "ywr";
String $hello = "ywr";
String _hello = "ywr";
String _1 = "ywr";
}
}
强类型语言
要求变量的使用严格符合规定,所有变量都必须要先定义后才能使用
Java的数据类型分为两大类
基本类型(primitive type)
public class Demo02 {
public static void main(String[] args) {
//八大基本类型
//整型
int num1 = 10;//最常用
byte num2 = 20;
short num3 = 30;
long num4 = 30L;//Long类型要在数字后加上L
//小数:浮点数
float num5 = 50.6f;
double num6 = 3.141592653589793238462643;
//字符
char name = '国';
//字符串,String不是关键字,是类
//String names = "ywr";
//布尔值:是非
boolean flag = true;
// boolean flag = false;
}
}
引用类型(reference type)
位(bit):是计算机内部数据储存的最小单位,11001100是一个八位二进制数
字节(byte):是计算机中数据处理的基本单位,习惯上用大写B来表示
1B(byte,字节) = 8bit(位)
字符:是指计算机使用的字母,数字,字和符号
1bit表示1位
1Byte表示一个字节 1B=8b
1024B=1KB
1024KB=1M
1024M=1G
/**
* 整数拓展 进制 二进制0b 八进制0 十进制 十六进制0x
*/
int i1 = 10;
int i2 = 010;//八进制0
int i3 = 0x10;//十六进制0x 0~9 A~F
System.out.println(i1);
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
float d1 = 232323233f;
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 表:(a = 97 A = 65) 2字节 65536 2的16次方
char c3 = '\u0061';
System.out.println(c3);
/**
* \t 制表符
* \n 换行
* 等等
*/
System.out.println("Hello\tWorld");
System.out.println("Hello\nWorld");
String sa = new String("Hello,World");
String sb = new String("Hello,World");
System.out.println(sa == sb);//false
String sc = "Hello,World";
String sd = "Hello,World";
System.out.println(sc == sd);//true
//对象 从内存分析
boolean flag = true;
if (flag==true){}//新手写法
if(flag){}//老手写法
//Less is More! 代码要精简易读
由于Java是强类型语言,所以要进行有些运算时,需要用到类型转换
低 ----------------------------------> 高
byte,short,char -> int -> long -> float -> double
运算中,不同类型的数据先转换为同一类型,然后进行运算
强制类型转换
高 --> 低
int i = 128;
byte b = (byte) i;//内存溢出
自动类型转化
低 --> 高
int i2 = 128;
double b2 = i2;
//操作比较大的数的时候,注意溢出问题
//JDK新特性,数字之间可以用下划线分割
int money = 10_0000_0000;
// System.out.println(money);
int years = 20;
int total = money * years;
System.out.println(total);//-1474836480 ,计算的时候溢出了
long total2 = money * years;
System.out.println(total2);// 默认是int,转换之前已经存在问题?
long total3 = money * ((long) years);
System.out.println(total3);
//L l
}
变量是什么:就是可以变化的量!
Java是一种强类型语言,每个变量都必须声明其类型
Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域
要加关键字static
实例变量:从属于对象,如果不初始化值,这个值这个类型的默认值 0 0.0
布尔值默认值false,除了基本类型,其余的默认值都是null
写在方法里面的,必须声明和初始化值
public class Demo08 {
//类变量 static
static double salary = 2500;
//属性:变量
//实例变量:从属于对象,如果不初始化值,这个值这个类型的默认值 0 0.0
//布尔值默认值false
//除了基本类型,其余的默认值都是null
String name;
int age;
//main方法
public static void main(String[] args) {
//局部变量:必须声明和初始化值
int i = 10;
System.out.println(i);
//变量类型 变量名字 = new Demo08();
Demo08 demo08 = new Demo08();
System.out.println(demo08.name);
System.out.println(demo08.age);
//类变量输出
System.out.println(salary);
}
//其他方法
public void add() {
}
}
常量(Constant):初始化(initialize)后不能再改变值!不会变动的值
所谓常量可以理解成一种特殊的变量,他的值被设定后,在程序运行过程中不允许被改变
final 常量名 = 值;
final double PI = 3.14;
常量名一般使用大写字符
a++:先使用a,再给a+1
++a:先给a+1,再使用a
public class Demo04 {
public static void main(String[] args) {
//一元运算符
//++ -- 自增,自减
int a = 3;
int b = a++; //先给b赋值,再自增
//a++ a = a + 1
System.out.println(a);
int c = ++a; //先自增,再给b赋值
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
&&:逻辑与运算:两个变量都为true,结果才为true
对于&&运算,如果左边为false,则右边不会执行直接输出结果false(短路运算)
||:逻辑或运算:两个变量有一个为true,结果为true
!:如果是true,结果则为false;如果为false,结果则为true
//逻辑运算符
public class Demo05 {
public static void main(String[] args) {
// 与 或 非
boolean a = true;
boolean b = false;
System.out.println("a && b:" + (a && b));//逻辑与运算:两个变量都为true,结果才为true
System.out.println("(a || b):" + (a || b));//逻辑或运算:两个变量有一个为true,结果为true
System.out.println("!(a && b):" + !(a && b));//如果是true,结果则为false;如果为false,结果则为true
//短路运算 对于&&运算,如果左边为false,则右边不会执行直接输出结果false
int c = 5;
boolean d = (c < 4) && (c++ < 4);
System.out.println(c);
System.out.println(d);
}
}
A = 0011 1100
B = 0000 1101
----------------
A&B 0000 1100 如果都为1,结果为1
A|B 0011 1101 只要有一个1,结果就为1
A^B 0011 0001 两个相同为0,不同为1
~B 1111 0010 取反
2*8怎么运算最快 2*2*2*2
效率极高!!!
<< *2
>> /2
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4
0000 1000 8
0001 0000 16
扩展运算符
public class Demo07 {
public static void main(String[] args) {
int a = 10;
int b = 20;
a += b;// a = a + b
a -= b;// a = a - b
System.out.println(a);
//字符串连接符 +
System.out.println(a + b);
System.out.println("赵紫薇" + a + b);
System.out.println(a + b + "赵紫薇");
}
}
public class Demo08 {
public static void main(String[] args) {
//三元运算符
//x ? y : z
//如果x==true,结果为y,反正结果为z
//int score = 80;
int score = 50;
String type = score < 60 ? "不及格" : "及格";
System.out.println(type);
}
}
为了更好的组织类,Java提供了包机制,用于区别类名的命名空间
包语句的语法格式为:
package pkg1[.pkg2[.pkg3…]];
为了能够使用某一包的成员,我们需要在Java程序中明确导入该包,使用"import"语句可完成此项目
import package[.package2…].(classname|*);
https://www.matools.com/api/java8
可以看这个链接https://blog.csdn.net/weixin_42140580/article/details/89635775
Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入。
基本语法:
Scanner s = new Scanner(System.in);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前,我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
public class Demo01 {
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();
}
}
public class Demo02 {
public static void main(String[] args) {
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方法接收:");
//判断是否还有输入
if (scanner.hasNextLine()) {
//使用nextLine方法接收
String str = scanner.nextLine();
System.out.println("输出的内容为:" + str);
}
scanner.close();
}
}
public class Demo03 {
public static void main(String[] args) {
//接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数据:");
String str = scanner.nextLine();
System.out.println("输出的内容为:" + str);
scanner.close();
}
}
public class Demo04 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//从键盘接收数据
int i = 0;
float f = 0.1f;
System.out.println("请输入整数:");
//如果--那么
if (scanner.hasNextInt()) {
i = scanner.nextInt();
System.out.println("整数数据:" + i);
} else {
System.out.println("输入的不是整数数据!");
}
System.out.println("请输入小数:");
//如果--那么
if (scanner.hasNextFloat()) {
f = scanner.nextFloat();
System.out.println("小数数据:" + f);
} else {
System.out.println("输入的不是小数数据!");
}
scanner.close();
}
}
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 = " + sum);
}
System.out.println(m + "个数的和为" + sum);
System.out.println(m + "个数的平均值为" + (sum / m));
scanner.close();
}
}
if单选择结构
if双选择结构
if多选择结构
嵌套的if结构
switch多选择结构
public class IfDemo01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入内容:");
String s = scanner.nextLine();
//equals:判断字符串是否相等
if (s.equals("Hello")) {
System.out.println(s);
}
System.out.println("End!");
scanner.close();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wg41oiyf-1662112709430)(C:\Users\ywrdsg\AppData\Roaming\Typora\typora-user-images\image-20220430220649606.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dSrcmG4S-1662112709437)(C:\Users\ywrdsg\AppData\Roaming\Typora\typora-user-images\image-20220430220712663.png)]
语法:
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
public class IfDemo02 {
public static void main(String[] args) {
//考试分数大于60就是及格,小于60就是不及格
Scanner scanner = new Scanner(System.in);
System.out.println("请输入成绩:");
int score = scanner.nextInt();
if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
scanner.close();
}
}
语法:
if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else{
//如果以上布尔表达式都不为true执行代码
}
public class IfDemo03 {
public static void main(String[] args) {
//成绩评级
Scanner scanner = new Scanner(System.in);
/**
* if语句至多有一个else语句,else语句在所有的else if语句之后
* if语句可以有若干个else if语句,他们必须在else语句之前
* 一旦其中一个else if语句检测为true,其他else if以及else语句都将跳过执行
*/
System.out.println("请输入成绩:");
int score = scanner.nextInt();
if (score <= 100 && score >= 90) {
System.out.println("A");
} else if (score < 90 && score >= 80) {
System.out.println("B");
} else if (score < 80 && score >= 70) {
System.out.println("C");
} else if (score < 70 && score >= 60) {
System.out.println("D");
} else if (score < 60 && score >= 0) {
System.out.println("不及格");
} else {
System.out.println("成绩不合法");
}
scanner.close();
}
}
public static void main(String[] args) {
//case穿透 //switch 匹配一个具体的值
char grade = 'C';
switch (grade) {
case 'A':
System.out.println("优秀");
break;//可选
case 'B':
System.out.println("良好");
break;
case 'C':
System.out.println("一般");
break;
case 'D':
System.out.println("及格");
break;
case 'E':
System.out.println("不及格");
default:
System.out.println("输入错误");
}
}
public static void main(String[] args) {
String name = "zzw";
//JDK7的新特性,表达式结果可以是字符串!!!
//字符的本质还是数字
//反编译 java---class(字节码文件)---反编译(IDEA)
switch (name) {
case "zzw":
System.out.println("zzw");
break;
case "ywr":
System.out.println("ywr");
break;
default:
System.out.println("???");
}
}
while是最基本的循环,他的结构为:
while(布尔表达式){
//循环内容
}
只要布尔表达式为true,循环就会一直执行下去
我们大多数情况是会让循环停止下来的,我们需要一个表达式失效的方式来结束循环
少数部分情况需要循环一直执行,比如服务器的请求响应监听等
循环条件一直为true就会造成无限循环(死循环),我们正常的业务编程中应该尽量避免死循环,会影响程序的性能或者造成程序卡死崩溃!
public static void main(String[] args) {
//输出1~100
int i = 0;
while (i < 100) {
i++;
System.out.println(i);
}
}
计算1+2+3+…+100=?
public static void main(String[] args) {
//计算1+2+3+...+100=?
int i = 0;
int sum = 0;
while (i <= 100) {
sum = sum + i;
i++;
}
System.out.println(sum);
}
对于while语句而言,如果不满足条件,则不能进入循环,但有时候我们需要即使不满足条件也要至少执行一次
do…while循环和while循环相似,不同的是,do…while循环至少会执行一次
do{
//代码语句
}while(布尔表达式);
while和do…while的区别:
public static void main(String[] args) {
int a = 0;
while (a < 0) {
System.out.println(a);
a++;
}
System.out.println("===========");
do {
System.out.println(a);
a++;
} while (a < 0);
}
虽然所有循环结构都可以用while或者do…while表示,但Java提供了另一种语句–for循环,使一些循环结构变得更加简单
for循环语句是支持迭代的一种通用结构,是最有效,最灵活的循环结构
for循环执行的次数是在执行前就确定的,语法格式如下:
for(初始化;布尔表达式;更新){
//代码语句
}
public static void main(String[] args) {
int a = 1;//初始化条件
while (a <= 100) {//条件判断
System.out.println(a);//循环体
a = a + 2;//迭代
}
System.out.println("while循环结束");
//初始化条件;条件判断;迭代
for (int i = 1; i <= 100; i++) {
System.out.println(i);
}
System.out.println("for循环结束");
}
关于for循环有一下几点说明:
计算0到100之间的奇数和偶数的和
public static void main(String[] args) {
//计算0到100之间的奇数和偶数的和
/*int sum1 = 0;
int sum2 = 0;
for (int a = 0; a <= 100; a = a + 2) {
sum1 = sum1 + a;
}
for (int b = 1; b <= 100; b = b + 2) {
sum2 = sum2 + b;
}
System.out.println("奇数的和=" + sum2);
System.out.println("偶数的和=" + sum1);*/
int oddSum = 0;
int evenSum = 0;
for (int i = 0; i <= 100; i++) {
if (i % 2 != 0) {
oddSum = oddSum + i;
} else {
evenSum = evenSum + i;
}
}
System.out.println("奇数的和=" + oddSum);
System.out.println("偶数的和=" + evenSum);
}
用while或者for循环输出1-1000之间能被5整除的数,并且每行输出3个
for循环
public static void main(String[] args) {
//用for循环输出1-1000之间能被5整除的数,并且每行输出3个
for (int i = 1; i <= 1000; i++) {
if (i % 5 == 0) {
System.out.print(i+" ");
//System.out.print(i+"\t");
int a = 0;
a = a + i;
if (a % 3 == 0) {//换行
System.out.println(" ");
//System.out.print("\n");
}
}
}
}
while循环
public static void main(String[] args) {
//用while循环输出1-1000之间能被5整除的数,并且每行输出3个
int i = 1;
int a = 0;
while (i <= 1000) {
if (i%5==0) {
System.out.print(i + " ");
a++;
}
i++;
if (a % 3 == 0) {
System.out.println();
}
}
}
打印99乘法表
public static void main(String[] args) {
//打印九九乘法表
for (int j = 1; j <= 9; j++) {
for (int i = 1; i <= j; i++) {
System.out.print(i + "x" + j + "=" + (i * j)+"\t");
}
System.out.println();
}
}
Java增强for循环语法格式:
for(声明语句:表达式){
//代码句子
}
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配,其作用域限定在循环语句块,其值与此时数组元素的值相等
表达式:表达式是要访问的数组名,或者是返回值为数组的方法
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};//定义数组
for (int i = 0; i < 5; i++) {
System.out.println(numbers[i]);
}
System.out.println("====================");
//遍历数组的元素
for (int x : numbers) {
System.out.println(x);
}
}
public static void main(String[] args) {
int i = 0;
while (i < 100) {
i++;
System.out.println(i);
if (i == 30) {
break;
}
}
System.out.println("123");
}
public static void main(String[] args) {
int i = 0;
while (i < 100) {
i++;
if (i % 10 == 0) {
System.out.println();
continue;
}
System.out.print(i+"\t");
}
}
标签:
public static void main(String[] args) {
//打印101-150之间所有的质数
int count = 0;
//a 标签 不建议使用!
a:for (int i = 101; i <= 150; i++) {
for (int j = 2; j < i / 2; j++) {
if (i % j == 0) {
continue a;
}
}
System.out.println(i + "");
}
}
public static void main(String[] args) {
//打印三角形 5行
for (int i = 1; i <= 5; 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方法是语句的集合,它们在一起执行一个功能
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。设计方法的时候最好保持方法的原子性,就是一个方法只完成一个功能,这样有利于我们后期的扩展
方法的命名规则:首字母小写的驼峰命名原则
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
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;
} else {
result = num2;
}
return result;
}
调用方法:对象名.方法名(实参列表)
Java支持两种调用方法的方式,根据方法是否返回值来选择
当方法返回一个值的时候,方法调用通常被当做一个值。例如:
int larger = max(30,40);
如果方法返回值是void,方法调用一定是一条语句
ystem.out.println("Hello,YWR");
扩展了解:值传递(Java)和引用传递
重载就是在一个类中,有相同的函数名称,但形参不同的函数
方法的重载规则:
实现理论:
方法名称相同时,编译器会根据调用方法的参数个数,参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译报错
public static void main(String[] args) {
int max = max(10, 20, 30);
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;
} else {
result = num2;
}
return result;
}
public static int max(double num1, double num2) {
int result = 0;
if (num1 == num2) {
System.out.println("num1=num2");
return 0;//终止大小
}
if (num1 > num2) {
result = (int) num1;
} else {
result = (int) num2;
}
return result;
}
public static int max(int num1, int num2, int num3) {
int result = 0;
if (num1 == num2) {
System.out.println("num1=num2");
return 0;//终止大小
}
if (num1 > num2) {
result = num1;
} else {
result = num2;
}
return result;
}
有时候你希望运行一个程序时候再传递给它消息,这要靠传递命令行参数给main()函数实现
public static void main(String[] args) {
//args.length 数组长度
for (int i = 0; i < args.length; i++) {
System.out.println("args[" + i + "]" + args[i]);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E3QLrmYX-1662112709442)(C:\Users\ywrdsg\AppData\Roaming\Typora\typora-user-images\image-20220504214054502.png)]
public static void main(String[] args) {
//调用可变参数的方法
printMax(34, 3, 3, 2, 56.6);
printMax(new double[]{1, 2, 3});
}
public static void printMax(double...numbers) {
if (numbers.length == 0) {
System.out.println("请输入数字!");
return;
}
double result = numbers[0];
//遍历比较
for (int i = 1; i < numbers.length; i++) {
if (numbers[i] > result) {
result = numbers[i];
}
}
System.out.println("最大值是" + result);
}
能不用递归就不用递归!
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);
}
}
思路推荐:
public static void main(String[] args) {
//设计计算器6
double m = 0;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数字");
String first = scanner.nextLine();
double a = Double.parseDouble(first);
System.out.println("请输入第二个数字");
String second = scanner.nextLine();
double b = Double.parseDouble(first);
System.out.println("请输入 + - * /");
String symbol = scanner.nextLine();
switch (symbol) {
case "+":
m = add(a, b);
break;
case "-":
m = subtract(a, b);
break;
case "*":
m = multiply(a, b);
break;
case "/":
m = divide(a, b);
break;
default:
System.out.println("输入错误!");
}
System.out.println(m);
scanner.close();
}
public static double add(double a, double b) {
return a + b;
}
public static double subtract(double a, double b) {
return a - b;
}
public static double multiply(double a, double b) {
return a * b;
}
public static double divide(double a, double b) {
return a / b;
}
首先必须声明数组变量,才能在程序中使用数组。下面师声明数组变量的语法:
dataType[] arrayRefVar; //首选方法
或
dataType arrayRefVar[]; //效果相同,但不是首选方法
Java语言使用new操作符来创建数组,语法如下:
dataType[] arrayRefVar = new dataType[arraySize];
数组的元素是通过索引访问的,数组索引从0开始
获取数组长度:arrays.length
public static void main(String[] args) {
//声明一个数组
int[] nums;
// int nums2[];
//创建一个数组
nums = new int[10];//这里面可以存放10个int类型的数字
//给数组元素赋值
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
nums[3] = 4;
nums[4] = 5;
nums[5] = 6;
nums[6] = 7;
nums[7] = 8;
nums[8] = 9;
nums[9] = 10;
//计算所有元素的和
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum = sum + nums[i];
}
System.out.println("总和为:" + sum);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P8CjK5vs-1662112709443)(C:\Users\ywrdsg\AppData\Roaming\Typora\typora-user-images\image-20220505221808691.png)]
静态初始化
int[] a = {1,2,3};
Man[] mans = {new Man(1,1),new Man(1,2)};
动态初始化
int[] a = new int[2];
a[0] = 1;
a[1] = 2;
数组的默认初始化
public static void main(String[] args) {
//静态初始化
int[] a = {1, 2, 3, 4, 5, 6, 7, 8};
System.out.println(a[0]);
//动态初始化:包含默认初始化
int[] b = new int[10];
b[0] = 10;
b[1] = 15;
System.out.println(b[0]);
System.out.println(b[1]);
System.out.println(b[2]);
}
长度是确定的。数组一旦被创建,它的大小就是不可以改变的
其元素必须是相同类型,不允许出现混合类型
数组中的元素可以是任何数据类型,包括基本类型和引用类型
数字变量属于引用类型,数组也可以看成是对象,输注在每个元素相当于该对象的成员变量。
数组本身就是对象,Java对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身就是在堆中的。
下标的合法区间:[0,length-1],如果越界就会报错
public static void main(String[] args){
int[] a = new int[2];
System.out.println(a[2]);
}
ArrayIndexOutOfBoundsException:数组下标越界异常!
小结:
普通的For循环
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
//打印全部的数组元素
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 = 1; i < arrays.length; i++) {
if (arrays[i] > max) {
max = arrays[i];
}
}
System.out.println(max);
}
For-Each循环
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
//没有下标
for (int array : arrays) {
System.out.println(array);
}
}
数组作方法入参
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
printArray(arrays);
}
//打印数组元素
public static void printArray(int[] arrays) {
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i] + " ");
}
}
数组作返回值
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
int[] reverse = reverse(arrays);
printArray(reverse);
}
//反转数组
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;
}
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一堆数组,其每个元素都是一个一维数组
二维数组
int a[][] = new int[2][5];
public static void main(String[] args) {
//[4][2]
/*
* 1,2 arrays[0]
* 2,3 arrays[1]
* 3,4 arrays[2]
* 4,5 arrays[3]
* */
int[][] arrays = {{1, 2}, {2, 3}, {3, 4}, {4, 5}};
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays[i].length; j++) {
System.out.println(arrays[i][j]);
}
}
}
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 9090, 31231, 543, 21, 3, 23};
//System.out.println(a);//[I@1540e19d
//打印数组元素
//System.out.println(Arrays.toString(a));
//printArray(a);
//数组进行排序 升序
Arrays.sort(a);
System.out.println(Arrays.toString(a));
//数组填充
//Arrays.fill(a, 0);
//2~4之间的元素被填充
Arrays.fill(a, 2, 4, 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("[");
} else if (i == a.length - 1) {
System.out.print(a[i] + "]");
} else {
System.out.print(a[i] + ", ");
}
}
}
public static void main(String[] args) {
/**
* 冒泡排序
* 1.比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
* 2.每次比较,都会产生出一个最大的或者最小的数字
* 3.下一轮则可以少一次排序
* 4.依次循环,直到结束
*/
int[] a = {1, 4, 5, 2, 6, 7, 2, 3, 5};
int[] sort = sort(a);
System.out.println(Arrays.toString(sort));
}
public static int[] sort(int[] array) {
//临时变量
int temp = 0;
//外层循环,判断我们要走多少次
for (int i = 0; i < array.length - 1; i++) {
//通过flag标识位减少没有意义的比较
boolean flag = false;
//内层循环,比较两个数字,如果第一个数比第二个数大,则交换位置
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j + 1] < array[j]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag = true;
}
}
if (flag == false) {
break;
}
}
return array;
}
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组
稀疏数组的处理方式是:
如图:左边是原始数组,右边是稀疏数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jAiBcWv2-1662112709444)(C:\Users\ywrdsg\AppData\Roaming\Typora\typora-user-images\image-20220803171554896.png)]
public static void main(String[] args) {
// 1.创建二维数组 11*11 0:没有棋子, 1:黑棋, 2:白棋
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
// 输出原始数组
System.out.println("输出原始数组");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
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);
// 2.创建一个稀疏数组
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 = 0; 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]);
}
System.out.println("================");
// 还原稀疏数组
System.out.println("还原");
// 1.读取稀疏数组
int[][] array3 = new int[array2[0][0]][array2[0][1]];
// 2.给其中的元素还原它的值
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
// 3.打印
for (int[] ints : array3) {
for (int anInts : ints) {
System.out.print(anInts + "\t");
}
System.out.println();
}
}
Java的核心思想就是oop
方法的定义
方法的调用(静态方法随着类的加载而创建,非静态方法随着对象的创建而创建)
静态方法
非静态方法
//
// 静态方法 static
// 非静态方法
public static void main(String[] args) {
Student.say();
// 实例化类 new
// 对象类型 对象名 = 对象值;
Student2 student2 = new Student2();
student2.say();
}
// 和类一起加载的
public static void a() {
//b();
}
// 类实例化之后才存在
public void b() {
}
// Student 类
// 静态方法
public static void say() {
System.out.println("学生说话了");
}
// Student2 类
// 非静态方法
public void say() {
System.out.println("学生安静了");
}
形参和实参
值传递和引用传递
// 值传递
public static void main(String[] args) {
int a = 1;
System.out.println(a);// 1
Demo04.change(a);
System.out.println(a);// 1
}
public static void change(int a) {
a = 10;
}
// 引用传递
public class Demo05 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);// null
Demo05.change(person);
System.out.println(person.name);// shiyimuya
}
public static void change(Person person) {
// person是一个对象:指向的 ---> Person person = new Person();这是一个具体的人,可以改变属性!
person.name = "shiyimuya";
}
}
// person类,有一个属性:name
class Person {
String name;
}
this关键字
public class Student {
// 属性:字段
String name;
int age;
// 方法
public void study() {
System.out.println(this.name + "在学习");
}
}
// main方法
/*
* public static void main(String[] args) {
// 类:抽象的,实例化
// 类实例化后会返回一个自己的对象
// student对象就是一个Student类的具体实例
Student shiyimuya = new Student();
Student sakura = new Student();
sakura.name = "樱";
sakura.age = 23;
System.out.println(sakura.name);
System.out.println(sakura.age);
shiyimuya.name = "是一沐呀";
shiyimuya.age = 23;
System.out.println(shiyimuya.name);
System.out.println(shiyimuya.age);
}
* */
public class Person {
// 一个类即使什么都不写,他也会存在一个方法
// 显示的定义构造器
String name;
int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
/**
* public static void main(String[] args) {
* // 实例化一个对象
* Person person = new Person("sakura", 23);
* System.out.println(person.name);
* }
*
* 构造器:
* 1.和类名相同
* 2.没有返回值
* 作用:
* 1.new 本质在调用构造方法
* 2.初始化对象的值
* 注意点:一旦定义了有参构造,无参构造就必须显示定义
*
* this.当前类 = 传进来的参数值
*/
/**
* 1.提高程序的安全性,保护数据
* 2.隐藏代码的实现细节
* 3.统一接口
* 4.系统可维护性增加
*/
public class Student {
// 属性私有
/**
* 名字
*/
private String name;
/**
* 学号
*/
private int id;
/**
* 性别
*/
private String gender;
/**
* 年龄
*/
private int age;
// 提供一些可以操作这个属性的方法
// 提供一些public 的get、set方法
// get 获得这个数据
// set 给这个数据设置值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 120 || age < 0) { // 不合法
this.age = 3;
} else {
this.age = age;
}
}
}
/*
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("sakura");
System.out.println(s1.getName());
//s1.setAge(999);// 不合法的
s1.setAge(23);
System.out.println(s1.getAge());
}*/
子类继承了父类,就会拥有父类的全部方法!
在Java中所有的类,都默认直接或者间接的继承Object类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlNZ81sf-1662112709444)(C:\Users\ywrdsg\AppData\Roaming\Typora\typora-user-images\image-20220831105021838.png)](ctrl+h查看)
// Person类
public class Person /*extends Object*/ {
private int money = 10_0000_0000;
public void say() {
System.out.println("说了一句话");
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
// Person类
public class Student extends Person{
}
public static void main(String[] args) {
Student student = new Student();
student.say();
System.out.println(student.getMoney());
}
super – this (this指向当前类,super指向父类)
私有的东西无法被继承
public Person() {
System.out.println("Person无参执行了");
}
public Student() {
// 隐藏代码:调用了父类的无参构造
super();// 调用父类的构造器,必须要在子类构造器的第一行
System.out.println("Student无参执行了");
}
super注意点:
1. super调用父类的构造方法,必须要在构造器方法的第一个
2. super必须只能出现在子类的方法或者构造方法中!
3. super和this不能同时调用构造方法!
Vs this:
1.代表的对象不同:
this:自身调用者这个对象
super:代表父类对象的引用
2.前提不同:
this:没有继承也可以使用
super:只能在继承条件下才可以使用
3.构造方法不同:
this():调用自身类的构造
super():调用父类的构造
// Person类
public class Person /*extends Object*/ {
//protected String name = "樱";
/*public void print() {
System.out.println("Person");
}*/
public Person() {
System.out.println("Person无参执行了");
}
}
// Student类
public class Student extends Person {
public Student() {
// 隐藏代码:调用了父类的无参构造
super();// 调用父类的构造器,必须要在子类构造器的第一行
System.out.println("Student无参执行了");
}
/*private String name = "sakura";
public void print() {
System.out.println("Student");
}
public void test(String name) {
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
public void test1() {
print(); // Student
this.print(); // Student
super.print(); // Person
}*/
}
public class Application {
public static void main(String[] args) {
Student student = new Student();
//student.test("shiyimuya");
//student.test1();
}
}
方法重写
重写都是方法的重写,和属性无关
public class A extends B {
public static void test() {
System.out.println("A=>test()");
}
// Override:重写
@Override// 注解:有功能的注释!
public void test1() {
System.out.println("A=>test1()");
}
}
public class B {
public static void test() {
System.out.println("B=>test()");
}
public void test1() {
System.out.println("B=>test1()");
}
}
public static void main(String[] args) {
// 方法的调用只和左边有关,定义的数据类型有关
// 定义的是什么类就调用什么类的静态方法
A a = new A();
a.test();// A
// 父类的引用指向了子类
B b = new A();
b.test();// B
A a1 = new A();
a1.test1();
// 子类重写的父类的方法
B b1 = new A();
b1.test1();
}
重写:需要有继承关系,子类重写父类的方法!
1. 方法名必须相同
2. 参数列表必须相同
3. 修饰符:范围可以扩大: public>protected>Default>private
4. 抛出的异常:范围可以被缩小,但不能扩大: ClassNotFoundException --> Exception(大)
重写:子类的方法和父类必须要一致,方法体不同!
为什么需要重写:
父类的功能子类不一定需要,或者不一定满足!
alt+insert,override
即同一个方法可以根据发送对象的不同而采取多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多种
多态的存在条件
注意:多态是方法的多态,属性没有多态性
/**
* 多态注意事项:
* 1. 多态是方法的多态,属性没有多态
* 2. 父类和子类,有联系 类型转换异常!ClassCastException!
* 3. 存在的条件:继承关系,方法需要重写,父类引用指向子类对象! Father f = new Son();
*
* static:方法,属于类,它不属于实例
* final:常量
* private:私有
*/
public class Person {
public void run() {
System.out.println("run");
}
}
public class Student extends Person {
@Override
public void run() {
System.out.println("son");
}
public void eat() {
System.out.println("eat");
}
}
public static void main(String[] args) {
/**
* 一个对象的实际类型是确定的
* new Student();
* new Person();
*
* 可以指向的引用类型就不确定了
*/
// 父类的引用指向子类
// Student 能调用的方法都是自己的或者继承父类的!
Student s1 = new Student();
// Person 父类型,可以指向子类,但不能调用子类独有的方法
Person s2 = new Student();
Object s3 = new Student();
// 对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!
s2.run();// 子类重写了父类的方法,执行子类的方法
s1.run();
s1.eat();
}
instanceof (类型转换) 引用类型
/**
* 1. 父类的引用指向子类的对象
* 2. 把子类转换为父类,向上转型
* 3. 把父类转换为子类,向下转型 强制转换
* 4. 方便方法的调用,减少重复的代码
*/
public class Student extends Person {
public void go() {
System.out.println("go");
}
}
public class Teacher extends Person {
}
public static void main(String[] args) {
// 类型之间的转化: 父 子
/*// 高 低
Person person = new Student();
// Student将这个对象转换为Student类型,我们就可以使用Student类型的方法了!
((Student)person).go();*/
// 子类型转换为父类型,可能会丢失自己的本来的一些方法
Student student = new Student();
student.go();
Person person = student;
}
public class Student {
private static int age;// 静态变量 多线程!
private double score;// 非静态变量
public void run() {
System.out.println("run");
}
public static void go() {
System.out.println("go");
}
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(Student.age);
System.out.println(s1.age);
System.out.println(s1.score);
go();
s1.run();
}
}
public class Person {
// (2):可以赋初始值
{
// 匿名代码块
System.out.println("匿名代码块");
}
// 最先执行(1)只执行一次
static {
// 静态代码块
System.out.println("静态代码块");
}
// (3)
public Person() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("=================");
Person person2 = new Person();
}
}
// 静态导入包
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class test {
public static void main(String[] args) {
System.out.println(random());
System.out.println(PI);
}
}
/**
* 1. 不能new抽象类,只能靠子类去实现它;约束!
* 2. 抽象类里可以写普通方法
* 3. 抽象方法必须在抽象类中
* 抽象的抽象:约束
*/
// abstract 抽象类:类 extends:单继承
public abstract class Action {
// abstract,抽象方法,只有方法的名字,没有方法的实现!
public abstract void doSomething();
}
// 抽象类的所有方法,继承了他的子类,都必须要实现它的方法;除非也是个抽象类
public class A extends Action{
@Override
public void doSomething() {
}
}
作用:
1. 约束
2. 定义一些方法,让不同的人实现
3. public abstract
4. public static final
5. 接口不能被实例化,接口中没有构造方法
6. implements可以实现多个接口
7. 必须要重写接口中的方法
public interface UserService {
//常量 public static final
int age = 23;
// 接口中所有的定义都是抽象的 public abstract
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
public interface TimeService {
void timer();
}
// 类 可以实现接口 implements 接口
// 实现了接口的类,就需要重写接口的方法
// 多继承-利用接口实现多继承
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 timer() {
}
}
内部类就是在一个类的内部定义一个类,比如A类中定义了一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了
成员内部类
静态内部类
// 静态内部类
public static class Inner2 {
public void in() {
System.out.println("这是内部类的方法");
}
}
局部内部类
public class Outer {
private int id = 10;
public void out() {
System.out.println("这是外部类的方法");
}
// 局部内部类
public void method() {
class Inner3{
public void in() {
}
}
}
}
匿名内部类
public class Test {
public static void main(String[] args) {
// 匿名内部类
// 没有名字初始化类,不用将实例保存到变量中
new Apple().eat();
UserService userService = new UserService() {
@Override
public void hello(String a) {
}
};
}
}
class Apple{
public void eat() {
System.out.println("1");
}
}
interface UserService{
void hello(String a);
}
要理解Java异常处理是如何工作的,需要掌握一下三种类型的异常:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ijBii9tb-1662112709445)(C:\Users\ywrdsg\AppData\Roaming\Typora\typora-user-images\image-20220901111416727.png)]
抛出异常
public static void main(String[] args) {
try {
new Test3().test(1, 0);
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
public void test(int a, int b) throws ArithmeticException{
if (b == 0) {
// 主动抛出异常 throw ,一般在方法体中使用
throw new ArithmeticException();
}
// System.out.println(a / b);
}
捕获异常
public static void main(String[] args) {
int a = 1;
int b = 0;
// ctrl+alt+t
try {
System.out.println(a / b);
} catch (Exception e) {
e.printStackTrace(); // 打印错误的栈信息
} finally {
}
}
异常处理的五个关键字
public static void main(String[] args) {
int a = 1;
int b = 0;
// 捕获多个异常:从小到大!
try { // try监控区域
System.out.println(a / b);
// new Test().a();
} catch (Error e) { // catch(想要捕获的异常类型!) 捕获异常
System.out.println("Error");
} catch (Exception e) {
System.out.println("Exception");
} catch (Throwable t) {
System.out.println("Throwable");
} finally { // 处理善后工作
// finally 可以不要, 假如IO,资源,关闭!
System.out.println("finally");
}
}
public void a() {
a();
}
public void b() {
b();
}
// 自定义的异常类
public class MyException extends Exception {
private static final long serialVersionUID = -3957670645192826339L;
// 传递数字 > 10
private int detail;
public MyException(int a) {
this.detail = a;
}
// toString
@Override
public String toString() {
return "MyException{" +
"detail=" + detail +
'}';
}
}
public class Test {
// 可能会存在的方法
static void test(int a) throws MyException {
System.out.println("传递的参数为:" + a);
if (a > 10) {
MyException myException = new MyException(a);
throw myException;
}
System.out.println("OK");
}
public static void main(String[] args) {
try {
test(1);
test(11);
} catch (MyException e) {
System.out.println("MyException=>" + e);
}
}
}