public class IdentifierTest{ //IdentifierTest是类名
public static void main(String[] args){ //main是方法名,args是变量名
}
public static void doSome(){ // doSome是方法名
int i = 10; //i是变量名
}
}
合法 | 不合法 |
---|---|
HelloWord | Hello Word |
public1 | public |
class1 | class |
$abc | 123a |
A_b_c | public# |
public class UserService{ //一看就知道关于用户服务的
//一看就知道是登陆方法,含有用户名和密码
public void login(String username,String password){
}
}
class 。extends。implements实现。 interface接口 。 import导入包 。package包装 。 break 。 continue 。 default。 do 。 if 。 else 。for 。 return。 switch 。case 。while 。 false 。true 。 null 。boolean。 byte。 char 。 short 。 int 。long 。 float 。 double 。 try 。 catch 。throw。 throws 。 finally 。 abstract 。 final 。 private。 protected 。 public 。 static 。 synchronized线程的锁 。 transient 。volatile。 instancof 。 new 。 super 。 void 。 assert 。enum 。 goto 。 const。 native。
10 、100 | 整数型 |
---|---|
3.14 | 浮点型 |
“abc” | 字符串 |
‘a’ | 字符 |
true 、 false | 布尔型 |
字符串必须英文半角双引号,字符必须是英文半角单引号,单引号里面只能存放单个字符
数据类型 变量名;
i = 100;
int i = 10;
system.out.println( i ); //10
system.out.println( i ); //10
system.out.println( i ); //10
int = 20; //set
system.out.println ( i ); //get
int a , b , c = 1,2,3;
int a , b , c = 300; // a和b尚未初始化,c是300
成员变量有默认值,成员变量没有
public class Var{
public static void main(String[] args){
int i = 10;
//访问不成功,编译会报错,变量未初始化
//System.out.println( i );
i = 10;
// 正常访问,声明+赋值=正常初始化
System.out.println( i ); // 10
}
}
在方法体中,运行顺序是自上而下的,上一行代码必须完整结束之后,下一行程序才会执行
public class Var{
public static void main(String[] args){
// 程序报错,因为没有先开辟内存空间,不知道k,就无法访问k
/*
System.out.println( k );
int k = 10;
*/
}
}
public class Var{
public static void main(String[] args){
int i = 10;
System.out.println( i ); //10
// 这是重新赋值,因为已经开辟空间是i
i = 20;
System.out.println( i ); // 20
//编译报错。
//已经初始化变量i,再初始化一个的话JVM就不知道是谁,会报错
/*
int i =30;
*/
}
}
public class Var{
static int k =10;
public static void main (String[] args){
// 变量i的作用域就是main方法,只有在main方法中才是有效的
int i = 10;
System.out.println( i ); //可以
System.out.println( k ); //可以
}
public static void doSome( ){
//这里无法访问main方法中的变量,已经出了i变量的作用域,报错
System.out.println( i ); //不可以
System.out.println( k ); //可以
}
}
循环中的作用域
public class Var{
public static void main (String[] args){
for( int a = 1;a<10;a++){ //作用域是这个for循环
}
//这里无法访问a变量,for循环结束之后a的内存就被释放了
System.out.println( a ); //不可以
int b ; //作用域是main方法
for( int b = 1; b <10; b ++){ //可以
}
System.out.println( b ); //可以
}
}
根据声明的位置来分类,局部变量,成员变量
public class Var{
public static void main( String[] args){
//局部变量
int i = 10;
}
//成员变量
int i = 20;
public static void doSome(){
//局部变量
int i = 100;
}
}
public class Var{
public static void main( String[] args){
int i = 10;
System.out,println( i ); // 10
}
int i = 20;
}
public class Var{
public static void main( String[] args){
// 运行采用"就近原则"
System.out,println( i ); // 20
}
static Int i = 20;
}
四大类八小种
类型 | 取值范围 |
---|---|
byte | [ -128 ~ 127] |
short | [-32768 ~ 32767] |
int | [-2147483648 ~ 2147483647] |
long | |
float | |
double | |
boolean | [false , true] |
char | [0 ~ 65535] |
注意:short和char类型所表示的类总数是一样的,只不过char没有负数,二者表示的区间是一样大的
数据类型 | 默认值 |
---|---|
byte,short,int,long | 0 |
float | 0.0 |
boolean | false |
char | \u0000 |
public class Test {
//只有成员变量才可以默认赋值【局部变量不可以】
static int i;
static int j = 20;
public static void main(String[] args) {
int k = 10;
System.out.println(k);
//main方法是静态方法
//访问成员变量只有加了static的变量才可以访问,否则报错
System.out.println(i); //0
System.out.println(j); //20
}
}
public class Taet{
public static void main(String[] args){
char c = 'a';
System.out.println(c); //a
char b = '中';
System.out.println(b); //中
//编译错误。ab是字符串,不能用单引号
/*
char d ='ab';
*/
//编译错误。"a"是字符串类型,类型不兼容
/*
char e ="a";
*/
}
}
\ n 换行符; \ t 制表符
public class Test {
public static void main(String[] args) {
char a ='n';
System.out.println(a); //n
//换行符
a='\n';
//System.out.print()和System.out.println()的区别是
// println输出之后换行,print输出之后不换行
System.out.print("Hello");
System.out.println("Word"); //HelloWord
System.out.println("Hello"); //Hello
System.out.println("Word"); //Word
//用上换行符
System.out.print("Hello");
System.out.print(a); //Hello
System.out.println("Word"); //Word
//制表符
char b = '\t';
//制表符和空格不一样,它们的ASCII不一样,键盘按键不一样
System.out.print("A");
System.out.print(b);
System.out.println("B"); //A B
}
}
\ \ 普通的反斜杠 ; \ ’ 普通的单引号 ; \ " 普通的双引号
public class Test {
public static void main(String[] args) {
//要求在控制台输出“反斜杠字符”
//编译报错。反斜杠将后面的单引号变成了普通的字符
//左边的单引号缺少了结束的单引号
/*
char a ='\';
*/
char a = '\\';
System.out.println(a); // \
//要求在控制台输出“单引号”“双引号”
//编译报错。不可为空
/*
char b ='';
*/
//编译报错。第一个与第二个单引号配对,第三个找不到另一半
/*
char b =''';
*/
char b ='\'';
System.out.println(b); // '
char c ='"';
System.out.println(c); // "
System.out.println("\"ABCD\""); //"ABCD"
}
}
数据类型 | 占用空间 | 默认值 | 取值范围 |
---|---|---|---|
byte | 1 | 0 | [ -128 ~ 127 ] |
short | 2 | 0 | [ -32768 ~ 32767 ] |
int | 4 | 0 | [ -2147483648 ~ 2147483647 ] |
long | 8 | 0L |
public class Test{
public static void main(String[] args){
int a = 10;
int b = 010; //整数字面值以0开头就是八进制
int c = 0x10; //整数字面值以0x开头就是十六进制
//Java认十进制
System.out.println(a); // 10
System.out.println(b); // 8
System.out.println(c); // 16
}
}
float —— 单精度 —— 4个字节
double —— 双精度 —— 8个字节
相对来说double的精度太低,不适用于财务软件,所以有精度更高的类型,是引用数据类型,java.math.BigDecimal
注意:
public class Test{
public static void main(String[] args){
//右边是默认的double类型,左边是double类型,没有类型转换
double a = 1.0;
//右边是double类型,大容量转换小容量,需要强制转换
/*
float b = 1.2;
*/
//用强制转换符
float b = (double)1.1;
//让右边数值一上来就是float类型,没有类型转换
float c = 1.3F;
}
}
public class Test{
public static void main(String[] args){
//编译报错。左右类型不兼容,右边是int,左边是boolean
/*
boolean a = 1;
*/
boolean a = true;
//if语句【条件控制语句】
if(a){
System.out.println("成功"); //输出结果是"成功"
}elae{
System.out.println("失败");
};
}
}
转换规则:
几种少见的特殊情况
public class Test{
public static void main(String[] args){
long a = 10L;
//编译报错。右边是 int 类型,容量大,需要强制转换才可以
//编译器不会帮你算得出右边的最后结果是否在 byte 的取值范围内
byte b = (byte)(int)a/2; //错误
byte c = (byte)(int)(a/2); //正确
byte x = 1;
short y = 2;
//右边先转换成int再运算,所以是int类型,需转换
short z = x+y; //错误
short k = (short)(x+y); //正确
int l = x+y; //正确
char i = 'a';
System.out.println((byte)i); // 97,a的ASCII码
double dd = 10/3; //结果是3.0
double dd = 10.0 / 3; //结果是3.33333333335
}
}
小变大。自动转换
public class Test{
public static void main(String[] args){
//右边是默认int类型,左边是int类型,没有类型转换
int a = 10; //没有类型转换
//右边是默认int类型,左边是long类型,存在类型转换
//int类型占用4字节,long占用8字节
//小容量自动转换大容量,是自动类型转换机制
long b = 2147483647; //存在类型转换
//编译报错。右边2147483648默认为int类型,但是字面值过大,报错
/*
long c = 2147483648;
*/
//解决:把2147483648一上来就当做long类型处理,在字面值后加 L
//右边是long类型,左边也是long类型,没有类型转换
long c = 2147483648L; //没有类型转换
}
}
大变小。强制转换
public class Test{
public static void main(String[] args){
//右边是long类型,左边是int类型,需要类型转换
/*
int x = 100L;
*/
//大容量转换小容量,需要进行强制转换
//强制类型转换需要加上“强制转换符”,不推荐,会损失精度
int x = (int)10L;
}
}
+ | 求和 |
---|---|
- | 相减 |
* | 乘积 |
/ | 商 |
% | 求余数【取模】 |
+ + | 自加1 |
- - | 自减1 |
public class Test{
public static void main(String[] args){
int i = 10;
int j = 3;
System.out.println(i + j); //13
System.out.println(i - j); //7
System.out.println(i * j); //7
System.out.println(i / j); //3
System.out.println(i % j); //1
}
}
以下以自加1++为例,- -符号自学
public class Test{
public static void main(String[] args){
//++运算符可出现在变量前后【单目运算符】
int k = 10;
k++;
System.out.println(k); //11
++k;
System.out.println(k); //12
//++运算符和赋值运算符同时存在时
//++在变量后,就先赋值再自加1
int a = 100;
int b = a ++;
System.out.println(a); //101
System.out.println(b); //100
//++在变量前,就进行自加1运算,然后再进行赋值操作
int m = 200;
int n = ++ m;
System.out.println(m); //201
System.out.println(n); //201
/*
练习
*/
int e = 1;
System.out.println(e ++); //1
System.out.println(e); //2
int f = 7;
System.out.println(++ f); //8
System.out.println(f); //8
int i =100;
System.out.println(++ i); //101
System.out.println(-- i); //100
System.out.println(i ++); //100
System.out.println(i --); //101
System.out.println(i --); //100
System.out.println(i --); //99
System.out.println(i); //98
int x =5;
int j = 5;
System.out.println(x ++ > j); //false
System.out.println(x); //6
System.out.println(j); //5
x = 5;
j = 5;
System.out.println(++ x > j); //true
System.out.println(x); //6
System.out.println(j); //5
}
}
> | 大于 |
---|---|
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
public class Test{
public static void main(String[] args){
int a = 10;
int b = 10;
System.out.println(a > b); //false
System.out.println(a >= b); //true
System.out.println(a < b); //false
System.out.println(a <= b); //true
System.out.println(a == b); //true
System.out.println(a != b); //false
}
}
注意:
public class Test{
public static void main(String[] args){
//不确定运算优先级可以用小括号
System.out.println(7 > 4 & 5 > 3); //true
System.out.println(true & true); //true
System.out.println(true & false); //false
System.out.println(false & true); //false
System.out.println(false & false); //false
System.out.println(false | false); //false
System.out.println(true | false); //true
System.out.println(!false); //true
System.out.println(!true); //false
System.out.println(true ^ false); //true
System.out.println(true ^ true); //false
System.out.println(false ^ false); //false
}
}
短路与、逻辑与、短路或、逻辑或
public class Test{
public static void main(String[] args){
//逻辑与
int a = 10;
int b = 5;
System.out.println(a < b & a++ > b):
System.out.println(a); //11
System.out.println(b); //5
//短路与
//因为 a
a = 10;
b = 5;
System.out.println(a < b && a++ > b):
System.out.println(a); //10
System.out.println(b); //5
}
}
注意:
扩展赋值运算符
public class Test{
public static void main(String[] args){
//扩展赋值运算符不改变运算结果类型
//假设最初被赋值变量是byte,赋值之后仍然是byte
int a = 5;
a += 1; //相当于 a = (int)(a + 1);
byte b = 5;
b -= 4; //相当于 b = (byte)(b - 4);
long c = 5L;
int d = 5;
d += c; //相当于 d = (int)(d + c);
int x =5;
byte d = 5;
d += x; //正确,因为 b+=x 相当于 b = (byte) (b + x)
/* 编译报错,右边是int类型,左边是byte类型,大转小应该强制转换
b = b + x;
*/
byte m = 5;
m += 128; //等同于m = (byte) (m + 128) 损失精度
System.out.println(m); // -123
}
}
关于Java中的 “+” 运算符:
public class Test {
public static void main(String[] args) {
//要求动态输出 x + y = z
int a = 10;
int b = 8;
//输出结果: 10+8=18
System.out.println(a + "+" + b + "=" + (a + b) );
a = 5;
b = 4
//输出结果: 5+4=9
System.out.println(a + "+" + b + "=" + (a + b) );
System.out.println(10 + 8 + "30"); //1830
System.out.println(10 + (8 + "30")); //10830
}
}
引用数据类型:String类型
int 是基本数据类型 ,int a = 10 ;
String 是引用数据类型 , String s = “abc” ;
String s = 10; —— 编译错误,类型不兼容
public class Test {
public static void main(String[] args) {
//需要输出:登陆成功,欢迎xxx回来。其中xxx是动态的
String s = "caomei";
System.out.println("登陆成功,欢迎" + s +"回来");
s = "xigua";
System.out.println("登陆成功,欢迎" + s +"回来");
//登陆成功,欢迎caomei回来
//登陆成功,欢迎xigua回来
}
}
注意:
单纯的三元运算并不是一个Java语句
public class Test {
public static void main(String[] args) {
//编译报错,不是Java语句
/*
"a";
*/
//因为上面编译报错,所以下面也不是一个完整的句子
/* 编译报错,不是Java语句
3 > 2 ? "a" : "b";
*/
System.out.println("a"); //正确
//因为上面编译正确,所以下面也正确
System.out.println(3 > 2 ? "a" : "b"); //a
String s = 5 > 3 ? "a" : "b"; //正确
System.out.println(s);
//可重复赋值
s = 5 < 3 ? "a" : "b"; //正确
}
}
1、变量可重新赋值。2、需注意类型兼容问题
public class Test {
public static void main(String[] args) {
//编译报错。类型不兼容,右边是String和char混合,左边是String
/*
String s = 5 > 3 ? "a" : 'b';
*/
byte a = 10;
short b = 20;
int i = 5 > 3 ? a : b; //正确
short t = 5 > 3 ? a : b; //正确
System.out.println(i);
/*编译报错。类型不兼容。只编译,不运行
byte y = 5 > 3 ? a : b; //错误
*/
byte y = 5 > 3 ? a : (byte) b; //解决方案
}
}
第一步:创建键盘扫描器对象。第二步:调用Scanner的next( )方法
public class Test {
public static void main(String[] args) {
//第一步:创建键盘扫描器对象,知道用户键盘敲了啥
Scanner s = new Scanner(System.in);
//第二步:调用Scanner对象的next()方法,接收键盘输入。
//程序等待用户输入,输入结束回车之后内容会自动赋值给 inputContent
//接收内容【以字符串形式接收】
System.out.println("请输入:");
String inputContent = s.next();
//接收内容【以整数型形式接收】
//int num = s.nextInt();
//第三步:将内存中的数据输出到控制台
System.out.println("您输入了:" + inputContent);
//System.out.println(“计算结果:” + (num + 10));
}
}
if 语句的四种编写
//第一种
if(布尔表达式){
Java语句;
Java语句;
...
}
//第二种
if(布尔表达式){
Java语句;
Java语句;
...
}else{
Java语句;
Java语句;
...
}
//第三种
if(布尔表达式){
Java语句;
Java语句;
...
}else if(布尔表达式){
Java语句;
Java语句;
...
}else if(布尔表达式){
Java语句;
Java语句;
...
}
//第四种
if(布尔表达式){
Java语句;
Java语句;
...
}else if(布尔表达式){
Java语句;
Java语句;
...
}else if(布尔表达式){
Java语句;
Java语句;
...
}else{
Java语句;
Java语句;
...
}
练习:
需求:所在位置5公里范围内若有KFC,就去吃饭
public class Test {
public static void main(String[] args) {
//需求:所在位置5公里范围内若有KFC,就去吃饭
double distance = 6;
if (distance < 5){
System.out.println("吃饭");
}else {
System.out.println("不吃饭");
}
}
}
需求:系统给定成绩,可能带小数,根据成绩判定等级,满分100。
[ 90 - 100 ] A ~~ [ 80 - 90 ) B~~ [ 70 - 80 ) C ~~[ 60 - 70 )D ~~ [ 0 - 60 ) E
public class Test {
public static void main(String[] args) {
//需求:系统给定成绩,可能带小数,根据成绩判定等级,满分100。
double score = 45;
char level = 'E';
String s = "您的成绩等级是:";
if ( 0 <= score & score <= 100) {
if (score >= 90) {
level = 'A';
} else if (score >= 80) {
level = 'B';
} else if (score >= 70) {
level = 'C';
} else if (score >= 60) {
level = 'D';
}
System.out.println(s + level);
}else {
System.out.println("您输入的数据有误");
}
}
}
需求:根据用户键盘输入的年龄判断处在哪个生命周期阶段,0-150岁
[0 - 5] 幼儿,[ 6 - 18 ]青少年,[ 19 - 50 ]壮年,[ 51 - 150 ] 老年
public class Test {
public static void main(String[] args) {
//需求:根据用户键盘输入的年龄判断处在哪个生命周期阶段
// [0 - 5] 幼儿,[ 6 - 18 ]青少年,[ 19 - 50 ]壮年,[ 51 - 150 ] 老年
Scanner s = new Scanner(System.in);
System.out.println("请输入年龄:");
int age = s.nextInt();
String level = "您处于生命周期的老年阶段";
if (age < 0 || age > 150){
level = "您提供的年龄不合法";
}else if (age <= 5){
level = "您处于生命周期的幼儿阶段";
}else if (age <= 18){
level = "您处于生命周期的青少年阶段";
}else if (age <= 50){
level = "您处于生命周期的壮年阶段";
}
System.out.println(level);
}
}
需求:判断天气。
若下雨,带伞——男,大黑伞;女,小花伞
若晴天,判断温度。
温度在30度以上——男,戴墨镜;女,擦防晒
【用嵌套;天气、温度、性别需要是键盘键入数据】
a
if 语句如果只有一条Java语句,大括号可不写,这种写法不推荐,但是要看得懂别人写的。——if(…){ Java语句 } ——if(…)Java语句
public class Test{
public static void main(String[] args){
if(true){
System.out.println("男");
}else{
System.out.println("女");
}
//上述代码可以写成:
if(true) System.out.println("男"); else System.out.println("女");
//--------------------------------------------------------------------
//以下代码错误出现在 else 一行,为什么?
if(true)
System.out.println("男");
System.out.println("阿巴阿巴");
else
System.out.println("女");
//上面代码相当于---------------------------下面的代码
if(true){
System.out.println("男");
}
System.out.println("阿巴阿巴");
else
System.out.println("女");
//因为只可以单独出现 if ,不可以单独出现 else ,所以该句出现错误
//而中间的 输出语句 是可以在 main 方法里运行的,只是缩进了一下,不影响
}
}
switch 语句的语法结构:
switch (int / String 类型){
case int/String字面值或变量:
Java语句;
...
break;
case int/String字面值或变量:
Java语句;
...
break;
...
default :
Java语句;
}
case 可以合并,合并之后相当于是或者
//只要小括号的数据与下面合并的所有case 其中一个匹配,就执行下面的Java语句
int i = 10;
switch (i){
case 1: case 2 : case 3 :
System.out.println("啊");
}
switch 后小括号里面的数据只可以是 int 和 String 类型的数据。
因为 byte、short、char 运算时会自动转换为int类型,所以小括号可以放 byte、short、char 类型
public class Test{
public static void main(String[] args){
//编译报错,类型不兼容
/*
long a = 10L;
int b = a;
*/
//编译报错,类型不兼容
/*
long x = 20L;
switch( x ){ }
switch( true ){ }
*/
long x = 20L;
switch( (int)x ){ }
byte a = 10;
switch( a ){ }
short b = 100;
switch( b ){ }
char c = 'a';
switch( c ){ }
char cc = 97;
switch( c ){ }
String d = "abaaba";
switch( d ){ }
}
}
编写一个完整的 switch 语句
public class Test{
public static void main(String[] args){
//较为完整的 switch 语句
//接收用户输入,1 表示星期一、2 表示星期二...
Scanner s = new Scanner(System.in);
System.out.println("请输入:");
int num = s.nextInt();
switch(num){
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
default:
System.out.println("一周只有四天");
}
}
}
case 穿透
public class Test{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
System.out.println("请输入:");
int num = s.nextInt();
//当num为1,输出:星期一,星期二,星期三
switch(num){
case 1:
System.out.println("星期一");
case 2:
System.out.println("星期二");
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
default:
System.out.println("一周只有四天");
}
}
}
//输出结果:星期一,星期二,星期三,星期四,一周只有四天
switch(num){
case 1:
System.out.println("星期一");
case 2:
System.out.println("星期二");
case 3:
System.out.println("星期三");
case 4:
System.out.println("星期四");
default:
System.out.println("一周只有四天");
switch 可以探测 String 类型
public class Test{
public static void main(String[] args){
//用户键入
Scanner s = new Scanner(System.in);
System.out.println("请输入星期几:");
String dayOfWeek = s.next();
//探测 String 类型
switch( dayOfWeek ){
case "星期一" :
System.out.println(1);
break;
case "星期二" :
System.out.println(2);
break;
default :
System.out.println("输入数据有误");
}
}
}
switch 可以探测 String 类型
字符 char 类型可以根据ASCII码和数字 int 类型转换
public class Test{
public static void main(String[] args){
char c = 65;
// 试用switch,输出——高级
switch(c){
case 'A':
System.out.println("高级");
break;
case 'C':
System.out.println("低级");
break;
default :
System.out.println("输入数据有误");
}
// 试用switch,输出——低级
switch(c){
case 'B':
System.out.println("高级");
break;
case 65 :
System.out.println("低级");
break;
default :
System.out.println("输入数据有误");
}
}
}
练习:
需求:制作简单计算器,实现+ - * / %
1、选择所有数据从键盘输入
2、使用 switch 语句进行判断
3、要从控制台输入三次:两个数据和一个运算符
请输入第一个数: 1
请输入运算符: +
请输入第二个数: 2
运算结果: 1 + 2 = 3
public class Test {
public static void main(String[] args) {
Scanner s1 = new Scanner(System.in);
System.out.println("请输入第一个数:");
int one = s1.nextInt();
Scanner s2 = new Scanner(System.in);
System.out.println("请输入运算符:");
String two = s1.next();
Scanner s3 = new Scanner(System.in);
System.out.println("请输入第二个数:");
int three = s1.nextInt();
switch (two){
case "+":
System.out.println(one + two + three + "=" + (one + three));
break;
case "-":
System.out.println(one + two + three + "=" + (one - three));
break;
case "*":
System.out.println(one + two + three + "=" + (one * three));
break;
case "/":
System.out.println(one + two + three + "=" + (one / three));
break;
case "%":
System.out.println(one + two + three + "=" + (one % three));
break;
default:
System.out.println("无法识别运算符!");
}
}
}
需求:系统给定成绩判断等级,有小数位,满分100。
[ 90 - 100 ] A ~~ [ 80 - 90 ) B ~~ [ 70 - 80 ) C ~~[ 60 - 70 )D ~~ [ 0 - 60 ) E
public class Test {
public static void main(String[] args) {
double d = 59.5;
double i = d / 10;
switch ((int) i){
case 9: case 10:
System.out.println("A");
break;
case 8:
System.out.println("B");
break;
case 7:
System.out.println("C");
break;
case 6:
System.out.println("D");
break;
default:
System.out.println("E");
}
}
}
在程序当中总有一些需要反复执行的代码,假设没有循环结构就要重复编写,所以要把需要重复执行的代码片段放入“循环体”,再联合“计数器”,共同控制这段需要反复执行的代码。
循环有三种:
for 循环
while 循环
do… while 循环
public class Test{
public static void main(String[] args){
//死循环
for( ; ; ){
System.out.println("死循环");
}
//输出 1-10 中的奇数
for( int i = 1; i <= 10; i = i + 2 ){
System.out.println("奇数:" + i);
}
//输出 1-10 中的偶数
for( int i = 1 ; i <= 10; i += 2){
System.out.println("偶数:" + i);
}
//计数器
for( int i = 10 ; i > 0; i --){ //输出 1-10
System.out.println("计数器1:" + i);
}
for( int i = 1 ; i <= 10; ){ //输出 2-11
i ++;
System.out.println("计数器2:" + i);
}
for( int i = 1 ; i <= 10; ){ //输出 1-10
System.out.println("计数器3:" + i);
i ++;
}
//输出 10 的倍数
for(int i = 100; i >= 0; i -= 10){
System.out.println("倍数:" + i);
}
}
}
i 变量的作用域
public class Test{
public static void main(String[] args){
//以下的for循环中的“i”变量作用域仅限于该循环内部使用
//这个 i 变量在main方法中无法访问
for(int i = 1; i <= 10; i ++){
System.out.println(i);
}
// System.out.println(i);
// 以下的 j 变量只要main方法未结束,就能用
int j =1;
for( ; j <= 10; j ++){
System.out.println(j);
}
//这里可以访问main方法中的 j 变量
System.out.println(j);
}
}
循环语句和条件判断语句嵌套【 for 和 if 】
public class Test{
public static void main(String[] args){
// 寻找 1-100 中的所有奇数
//第一种方法:从 1 开始,用循环,每次递增 2
for( int i = 1; i<=100 ; i += 2){
System.out.pintln(i);
}
// 第二种方法:从 1 开始,每次递增1,每次都判断是否可整除 2
for( int i = 1; i<= 100; i ++){
//判断 i 是否是奇数。“ & ”取余数,取模
// i % 2 == 0 偶数
// i % 2 == 1 奇数
// i % 2 != 0 奇数
if( i % 2 != 0 ){
System.out.pintln(i);
}
//以上两种方法,优先第一种,代码少,循环少,效率高
}
}
}
计算 1-100 内所有奇数的和,1+3+5+…+99
运算符 += 就是专门完成累加的
i += 1 —— i = i + 1
public class Test{
public static void maib(String[] args){
// 第一种:单用 for 循环
// 定义一个盒子
int sum = 0;
for(int i = 1; i <= 100; i += 2){
//此时输出的 i 都是奇数
// System.out.println(i);
//sum 存储的是最后求和的结果
sum += i;
}
// 以上的 for 循环结束之后,最终输出求和结果
System.out.println( "奇数的和:" + sum );
// 第二种:用 for 循环和 if 语句嵌套
// 归零
sum = 0;
for(int i = 1; i <= 100; i ++){
if( i % 2 != 0){
//此时的 i 都是奇数
//sum 存储的是最后求和的结果
sum += i; // 求和
}
}
// 以上的 for 循环结束之后,最终输出求和结果
System.out.println( "奇数的和:" + sum );
}
}
for 循环嵌套 for 循环【 for 和 for 】
内层循环的变量名和外层循环的变量名不可重名
public class Test{
public static void main(String[] args){
//不管循环体是什么代码,【循环体】都会执行 2 次
for(int i = 1; i <= 2; i ++){
System.out.println(i);
}
//写一个嵌套 for
//输出: 1 2 1 2 1 2 1 2
// 1 2 1 2 1 2 1 2
for( int i = 1; i < 5; i ++){
for(int j = 1; j < 3; j ++){ //输出:12 12
for(int k = 1; k < 3; k ++){ //输出:12
System.out.println(k);
}
}
}
}
}
public class Test{
public static void main(String[] args){
for(int i = 1; i < 5; i ++){
// 循环体的代码都会执行 4 遍
System.out.println("begin");
for(int j = 0; j < 1; j ++){ //循环2次,输出0
System.out.println(j);
}
System.out.println("end");
}
/* 输出结果
begin
0
end
begin
0
end
...
*/
}
}
引入 乘法表 前奏
public class Test{
public static void main(String[] args){
for(int i = 1 ; i <= 3; i ++){
for(int j = 1; j <= 3; j ++){
System.out.println(j):
}
}
/* 输出结果
1
2
3
1
2
3
...
*/
// 升级版
for(int i = 1; i <= 3; i ++){
for(int j = 1; j <=3; j ++){
System.out.println( i + "*" + j + "=" + (i*j));
}
}
/* 输出结果
1*1=1
1*2=2
1*3=3
2*1=2
2*2=4
2*3=6
3*1=3
3*2=6
3*3=9
*/
}
}
使用 for 循环输出 九九乘法表
注意有换行,呈现阶梯形状
public class Test{
public static void main(String[] args){
for(int i = 1; i <= 9; i ++){ // 外层循环9次,9行
for(int j = 1 ; j <= i; j ++){ //循环 i 次,列
System.out.print(i + "*" + j + "=" + (i*j));
System.out.print(" ");
}
System.out.print(\n);
}
}
}
需求:
编写 for 循环找出 1-100 中的所有素数
素数:即质数,仅可被 1 和自身整除,不可被其他数整除,13和17
啊
需求:
编写 for 循环找出 1-1000 中的所有素数
要求每 8 个换一行
死循环
public class Test{
public static void main(String[] args){
// 死循环
while(true){
System.out.println("死循环");
}
// 程序报错,因为上面是死循环,下面的怎么都执行不到,就报错
/*
System.out.println(123);
*/
}
}
public class Test{
public static void main(String[] args){
int i =1;
int j =2;
while( j > i){
System.out.println("死循环");
}
//编译通过,虽然 2>1 是true,但是需要运算
//int i = 1; byte c = i / 2; — 会报错
System.out.println(123);
}
}
public class Test{
public static void main(String[] args){
while( 10 > 3 ){
System.out.println("死循环");
}
// 程序报错,因为上面是死循环,下面的怎么都执行不到,就报错
/*
System.out.println(123);
*/
}
}
使用 while 循环输出 1-10
public class Test{
public static void main(String[] args){
// 从小到大
int i = 1;
while( i < =10){
System.out.println(i);
i ++;
}
// 从大到小
int j = 10;
while( j >= 1){
System.out.println(j);
j --;
}
}
}
注意 i ++ 和 ++ i 的输出
public class Test{
public static void main(String[] args){
int j = 10;
while( j >= 1){
// 10 9 8 7 6 5 4 3 2 1
System.out.println(j --);
// 9 8 7 6 5 4 3 2 1 0
System.out.println(j );
}
int k = 10;
while( k >= 1){
// 9 8 7 6 5 4 3 2 1 0
System.out.println( -- k);
}
System.out.println( k); // 0
}
}
public class Test{
public static void main(String[] args){
int i =1;
do{
System.out.println("我一直都在");
}while( i > 100);
// 输出 1-10
do{
// 1 2 3 4 5 6 7 8 9 10
System.out.println( i );
i ++;
} while ( i <= 10)
}
}
break 是大哥,大哥说停就停,后面都不可以执行
public class Test{
public static void main(String[] args){
// 0 1 2 3 4
for(int i = 0; i <= 10; i ++){
if( i == 5){
break; //终止循环
}
System.out.println(i);
}
// 1 2 1 2 1 2
for(int i = 1; i <= 3; i ++){ //不管里面是啥都要循环3次
for(int j = 1; j <= 4; j ++){
if( j == 3){
break;
}
System.out.println(j);
}
}
}
}
以下用法比较少,给 for 循环命名,
public class Test{
public static void main(String[] args){
// 1 2 3 4 5 6
for1:for(int i = 1; i <= 5; i ++){
for2:for(int j = 1; j <= 10 ; j +=2){
if( j == 7){
break for1; // 终止 for1 循环
}
System.out.println( j );
}
}
}
}
continue 是跟随 break 的小弟,但是没有那么厉害,只能终止当前一次循环,后面的循环照常执行
public class Test{
public static void main(String[] args){
// 1 2 4 5
for(int i =1; i <= 5; i ++){
if( i == 3){
// 只要这个语句执行,就只停止本次循环,直接进入下一次循环
continue;
}
System.out.println(i);
}
}
}
以下情况少用
public class Test{
public static void main(String[] args){
myFor:for(int i = 1; i < 5; i ++){
if( i == 2){
// 与 break 的不同之处,可后接循环名字
continue myFor;
}
Systtem.out.println( i );
}
}
}
public class Test{
// 类体
public static void main(String[] args){
//计算两个 int 类型数据的和,调用方法
sumInt(10 , 20);
sumInt(55 , 22);
sumInt(88 , 999);
}
// 单独定义一个方法
// 该方法完成计算两个 int 类型数据的和,并将结果输出
public static void sumInt(int a,int b){
int c = a + b;
System.out.println(c);
}
}
public class Test{
public static void main(String[] args) {
//调用方法
Test.sum(1,2);
//方法可以被重复利用
int x =10;
Test.sum(x , 2);
}
/*
自定义的方法,不是程序的入口
修饰符列表:public static
返回值类型:int
方法名:sum
形式参数列表:int a ,int b
方法体:求和并输出结果
*/
public static void sum(int a , int b){
System.out.println( a + "+" + b + "=" + (a + b));
}
}
public class Test {
public static void sum(int a , int b){
System.out.println( a + "+" + b + "=" + (a + b));
Test.doSome();
}
//主方法,是程序的入口,从这里开始执行
public static void main(String[] args) {
//调用方法
Test.sum(1,2);
System.out.println("结束");
}
public static void doSome(){
System.out.println("Hello");
}
}
public class Test {
public static void main(String[] args) {
//编译报错,实参和形参数量不同
//Test.sum();
//编译报错,实参和形参类型对应不同
//Test.sum(true,false);
//正确。存在自动类型转换:long a = 10; 有 int---->long
Test.sum(10 , 20);
//编译报错,实参和形参类型对应不同
//Test.sum(3.1 , 20);
Test.sum((long) 3.1, 20);
}
public static void sum(long a , long b){
System.out.println( a + "+" + b + "=" + (a + b));
}
}
方法的调用【有 static 修饰符】:
public class Test {
public static void main(String[] args) {
//调用方法,类名可省略
Test.m1();
m1();
//调用其他类中的方法不可省略类名。
//若省略,则默认在本类中寻找该方法
c.m3(); //c中的方法
m3(); //Test中的方法
}
public static void m1(){
System.out.println("Tset中的m1方法执行");
//完整的调用方法
Test.m3();
//省略的写法
m3();
//若调用其他类的同名方法
c.m3();
}
public static void m3(){
System.out.println("Tset中的m3方法执行");
}
}
class c{
public static void m3(){
System.out.println("c1中的m3方法执行");
}
}
判断以下代码的执行输出结果
public class Test {
public static void main(String[] args) {
System.out.println("草莓1");
m1();
System.out.println("草莓2");
}
public static void m1(){
System.out.println("西瓜1");
m2();
System.out.println("西瓜2");
}
public static void m2(){
System.out.println("荔枝1");
System.out.println("荔枝2");
}
}
方法的返回值类型不是 void 的时候:
public class Test {
public static void main(String[] args) {
//调用方法,但是未接受方法执行结果
divide(10,3);
//接受方法执行结果。可以采用变量接收
//变量的数据类型需要和方法的返回值类型一致,或者可以自动类型转换
int i = divide(10,3);
long l = divide(10,3);
System.out.println(divide(10,3));
}
//定义一个方法,计算两个int类型数据的商,要求把计算结果返回给调用者
public static int divide(int a ,int b ){
int c = a / b;
return c;
}
}
public class Test{
public static void main(String[] args){
//调用方法,方法名后需要括号。没括号就以为是 变量m
int result = m();
System.out.println( result );
System.out.println( m() );
}
/*
以下编译报错。缺少返回语句
程序只编译不运行,编译器不认为 “return 1” 会百分百执行
public static int m(){
int a = 10;
if(a > 3){
return 1;
}
}
*/
//以下语句能保证 return 语句肯定会执行到
public static int m(){
int a = 10;
if(a > 3){
return 1;
}else{
return 0;
}
}
//上面的方法也可以这样写。
//若执行了 if 语句,方法就结束,因为有 return 1;
//若不执行 if 语句,就执行了 return 0;方法也结束。
public static int m1(){
int a = 10;
if(a > 3){
return 1;
}
return 0;
}
//上面的方法也可以这样写。
public static int m2(){
return 10 > 3 ? 1 : 0;
}
}
“同一个作用域” 中,return 语句后面不可写任何代码
public static int m3(){
int a = 10;
if(a > 3){
return 1;
//编译报错,因为该句永远执行不到
//System.out.println("草莓");
}
//编译通过
System.out.println("草莓");
return 0;
}
在 返回值为空的方法中使用 return 语句。
作用: “ return;” 语句是为了结束该方法的执行
public class Test {
public static void main(String[] args) {
}
// 编译报错。对于返回值为空的方法,无法返回值
/*
public static void m1( ) {
return 1;
}
*/
//编译通过
public static void m1( ) {
return ;
}
}
public class Test {
public static void main(String[] args) {
m1();
}
//在返回值为空的方法中使用 return 语句
public static void m1( ) {
for(int i = 1 ; i <= 10 ; i ++){
if(i == 5){
return;
}
System.out.println("i--->" + i);
}
System.out.println("hello");
}
}
public class Test {
public static void main(String[] args) {
m1();
}
public static void m1( ) {
for(int i = 1 ; i <= 10 ; i ++){
if(i == 5){
//return; //终止的是 m1() 方法
break; //终止的是 for 循环
}
System.out.println("i--->" + i);
}
System.out.println("hello");
}
}
public class Test {
public static void main(String[] args) {
m1();
for(int j = 10; j > 0; j --){
if(j == 6){
return;
}
System.out.println("草莓--->" + j);
}
System.out.println("hello");
}
public static void m1( ) {
for(int i = 1 ; i <= 10 ; i ++){
if(i == 5){
//return; //终止的是 m1() 方法
break; //终止的是 for 循环
}
System.out.println("i--->" + i);
}
System.out.println("hello");
}
}
详见方法内存分析
public class Test{
public static void main(String[] args){
int i =10;
m(i);
System.out.println("main--->" + i); // 10
}
public static void m(){
i ++;
System.out.println("m--->" + i); // 11
}
}
public class Test{
//入口
public static void main(String[] args){
// 调用方法
System.out.println(sumInt(1 , 2));
System.out.println(sumDouble(1.6 , 2.8));
System.out.println(sumLong(5L , 10L));
}
//定义方法,计算两个 int 数据的和
public static int sumInt(int a, int b){
return a + b;
}
//定义方法,计算两个 double 数据的和
public static double sumDouble(double a, double b){
return a + b;
}
//定义方法,计算两个 long 数据的和
public static long sumLong(long a, long b){
return a + b;
}
}
缺点:
public class Test{
public static void main(String[] args){
// 调用方法的时候就像在用一个方法。但其实参数的类型不同,对应调用的方法不同
//此时区分方法不再依靠方法名,而是依靠实际参数列表的数据类型
System.out.println(sum(1 , 2));
System.out.println(sum(1.6 , 2.8));
System.out.println(sum(5L , 10L));
}
public static int sum(int a, int b){
System.out.println("int的求和");
return a + b;
}
public static double sum(double a, double b){
System.out.println("double的求和");
return a + b;
}
public static long sum(long a, long b){
System.out.println("long的求和");
return a + b;
}
}
public class Test{
public static void main(String[] args){
m();
m(1);
m1( 2 , 3.0);
m1( 3.2 , 10);
m2( 3 );
m2( 4.9 ):
}
//以下两个方法构成重载
public static void m(){}
public static void m(int a){}
//以下两个方法构成重载
public static void m1(int a , double b){}
public static void m1(double a ,int b){}
//以下两个方法构成重载
public static void m2(int x){}
public static void m2(double y){}
}
以下是反面举证
public class Test{
public static void main(String[] args){
}
//以下两个方法不是重载,是发送了方法重复
public static void method(int a , double b){}
public static void method(int a , double b){}
//以下两个方法不是重载
public static void x(){}
public static int x(){
return 1;
}
//以下两个方法不是重载
void y(){}
public static void y(){}
}
详见文章Java方法递归
现在出现的一些新的编程语言多数都是面向对象的。人在认识现实世界的时候以面向对象的方式。面向对象更符合人的思维方式。
面向对象的三大特征:封装,继承,多态
采用面向对象的方式开发一个软件,生命周期当中:[整个生命周期中贯穿使用oo面向对象方式]
面向对象的分析: OOA
面向对象的设计: OOD
面向对象的编程: OOP
类和对象的概念
★什么是类?
类在现实世界当中是不存在的,是一个模板,是一个概念。是人类大脑思考抽象的结果。
类代表了一类事物。
在现实世界当中,对象A与对象B之间具有共同特征,进行抽象总结出一个模板,这个模板被称为类
.★什么是对象?
对象是实际存在的个体。现实世界当中实际存在.
⭐描述一下整个软件开发的过程:
程序员先观察现实世界,.从现实生活当中寻找对象
寻找了N多个对象之后,发现所有的对象都有共同特征
程序员在大脑中形成了一个模板【类】
Java程序员可以通过java代码来表述一个类
Java程序中有了类的定义,然后通过类就可以创建对象
有了对象之后,可以让对象直接协作起来形成一个系统。
*类-- [实例化] ->对象
★对象又被称为实例 / instance
★对象-- [抽象] -->类