Java基础学习第二章
前言
大家好啊,不知道大家觉得第一章难度怎么样,第一章虽然内容很基础,但全部都是要求牢牢掌握的,不然后期知识点多了,就很容混淆概念,所以大家一起加油吧!第一章的内容写的还有许多需要改进的地方,我今后也会多加把劲,与大家共同进步!
方法(Method)
Java 中的方法,在 c/c++ 称为函数,指的是同样的概念。java 中通常将用于实现特定功能的代码片段包含称为一个整体,这个整体称之为方法块,通常,将特定功能的方法块分离出来可以减少代码的编写,提高代码的可复用性。语法如下:
[修饰符] <返回值类型> 方法名 ([参数列表]){
代码片段...;
}
例:
public void m(int i) {
System.out.println(i);
System.out.println("这里是m方法块");
}
public static void main(String[] args) {
System.out.println("这里是主函数");
}
本例中的 main 函数和 m 方法都是方法,不过主函数比较特殊,是一个程序的入口,程序的执行大多数情况都是由主函数开始的。
Java中的方法分类:
- 有参数有返回值
- 有参数无返回值
- 无参数有返回值
- 无参数无返回值
例如
// 无参数无返回值
public void show(){
System.out.println("看这里");
}
// 有参数无返回值
public void info(String name) {
System.out.println("你的名字叫"+name);
}
// 无参数有返回值
public int getAge() {
return 17;
}
// 有参数有返回值
public int sum(int a,int b) {
return a + b;
}
补充:在 java 里有三种注释方法,编译器是不会编译注释内的内容
/**
* 文本注释
*/
/*
* 多行注释
*/
//单行注释
方法的调用
java 中对方法进行调用,首先要对对象进行实例化,将对象地址赋值给引用变量(因为在 java 中是无法直接进行对象的传递,只能进行变量值的传递,所以只能将地址传给引用变量),再利用引用变量对其进行调用,例:
引用变量.方法()
public class Test {
public void m() {
System.out.println("m方法被调用");
}
public static void main(String[] args) {
//创建对象
Test t = new Test();
//方法的调用
t.m();
}
}
本例中,程序首先从 main 方法开始运行,创建了一个 Test 类型的对象,引用变量为 t ,在利用t引用变量对 m 方法进行调用。这里涉及到一部分偏底层的概念,若是无法完全理解,可以先将格式背下来,日后我们还会具体讲解。
变量传值问题
java 中只存在值传递,不存在引用传递的概念
例1:
public void m(int i) {
i = 10;//为 i 赋值为 10
}
public static void main(String[] args) {
int i = 1;//创建一个int整型数 i ,为 i 赋值为 1
Test t = new Test();//创建对象
t.m(i);//调用方法
System.out.println("i="+i);//输出语句
}
在这里我补充一点,可能很多初学者并不知到文中 System.out.println(“i=”+i); 语句是什么意思,这是一句输出语句,是将i的值输出,大家若是不理解就先将格式记下来即可
那么例1中,大家猜猜结果会是什么,i的值会是多少?
i 的值为1?而在代码里我们明明看到i被赋值为10,为什么输出结果为 1 呢?或许很多人会这么疑问,其实原因很简单,上面我们已经提到过java中只存在值传递,不存在引用传递的概念,所以在调用 m 方法的过程中,我们只是把i的值1传递给了 m 方法,而i本身是不会被传递过去的,希望大家能明白原理。
大家在把第一个例子理解清楚后,才能继续看第二个例子,不然很容易出现概念混淆,值得注意的是,大家对这个原理必须理解透彻,不能一知半解
例2:
public class Student {
String name;
public void setName(String name1){
name = name1;
}
public String getName(){
return name;
}
}
//测试类
public class Test {
public void m(Student s){
s.setName("李四");//通过s引用变量调用setName方法
}
public static void main(String[] args) {
Student s = new Student();//创建Student类
s.setName("张三");//通过引用变量s调用setName方法
Test t2 = new Test();//创建Test类
System.out.println(s.getName()); //输出name值
t2.m(s);//通过t2调用m方法
System.out.println(s.getName()); //输出name值
}
}
大家先不要看答案,思考下,两次输出分别是什么?
第一次输出的 name 值为 张三 ,第二次输出的 name 值为 李四
下面我为大家讲一下程序运行步骤:
首先从主函数进入,创建了一个Student对象,通过s引用变量调用setName 方法,将 “张三” 传递给 Student 对象,此时 name 的值为 “张三”,下一步,创建 Test 对象,在 t2 调用 m 方法前,已经输出 name 值,所以是 张三,之后通过 t2 调用 m 方法,并将引用变量的 s 的值传递给了 m 方法,所以 通过 s 变量(m 方法中的 s 变量与 main 方法中的 s 变量是相同的值,但是是两个不同的变量) 调用 setName 方法,于是 name 的值被修改为 李四 ,然后进行输出。所以两次输出结果,第一次为张三,第二次为李四。
运算符
java中的运算符,分为以下常用几类
- 算术运算(+ - * / % ++ --)
- 关系运算(> < == >= <= !=)
- 逻辑运算(& | ! && || ^)
算术运算符中, + 与 - 没有任何变化, * 代表的是乘号, / 代表除号,两个整型数相除,得到的是另一个整型数,小数点后是不会进行计算了,% 是取余符号,得到的是除法式子中的余数,++ 和 - - 分别叫自增和自减,在自身基础上 +1 或 -1;
关系运算符中需要强调的是,java 中的等于是 “==” 而不是 “=” ,而 “=” 在 java 中的含义是赋值于,然后 “!=” 是不等于的意思。
逻辑运算符中,& 和 && ,只有在左右同时为 true 时, 结果为 true,| 和 || ,左右任何一方为 true 时,结果为 true, ! 为取反符号, ^ 异或符号,其主要是对两个操作数进行位的异或运算,相同去0 ,相反取 1。
另外的运算符号我以图片列出来,大家需要掌握,知道这些运算符是有什么作用
&和&&区别?
&:逻辑与,在进行运算时无论运算符左边的表达式结果是否为true,右侧的表达式依然会执行
&&:短路与,在进行运算时只要运算符左边的表达式结果为false,则右侧的表达式不再执行
任何类型的数据跟字符相加都会转换为字符串
表达式&语句块
表达式
表达式通常表示为运算符和运算数的结合,比如一个基本算数运算,一个赋值运算,对象调用方法,变量的声明都称之为表达式:
- int i = 10;
- a + b;
- stu.getName();
表达式一般表示为一行语句
语句块
语句块一般为一系列表达式的集合,通常包裹在{}之间,也就是方法体,一个方法内部的内容也是属于语句块,条件分支,循环语句等都称之为语句块。
流程控制语句
java中一般都是从主方法开始从上往下依次执行,这被称为顺序结构,在实际情况中,还会有其他的执行方式,如:
1.条件分支语句
2.循环语句
条件分支语句
java中的条件分支分为两种类型:
- if…else…
- switch
**if…else…**分三种情况,分别为:
结构一
if(条件表达式){
//条件表达式结果为 true 时执行
}
结构二
if(条件表达式){
//条件表达式结果为 true 时执行
}else{
//条件表达式为 false 时执行
}
结构三
if(条件表达式1){
//条件表达式1为true时执行
}else if(条件表达式2){
//条件表达式2为true时执行
}else{
//以上条件表达式均为false时执行
}
补充:结构三中,else if 语句可以有任意多个,且判断顺序为从上往下,知道满足条件时执行。
if…else…实例
* 提供一个分数,根据分数的所在范围,显示成绩等级
* >=90:A+
* >=80:A
* >=70:B
* >=60:C
* <60:学渣
扩展:如果分数大于100或者分数小于0则输出 无效的分数
public class Demo1 {
public String getLevel(int score){
String level = "";
//容错处理
if(score > 100 || score < 0){
level = "无效的分数";
}else if(score >= 90){
level = "A+";
}else if(score >= 80){
level = "A";
}else if(score >= 70){
level = "B";
}else if(score >= 60){
level = "C";
}else{
level = "学渣";
}
return level;
}
public static void main(String[] args) {
Demo1 d = new Demo1();
System.out.println(d.getLevel(65));
}
}
switch语句
switch语句是另一种分支语句,一般用于对某些枚举值(确定的,少量的值)进行分支判断,语法为:
switch(值){
case 值1:
break;
case 值2:
break;
…
}
补充:通常switch(值)括号里的值只能为整型,字符型,字符串型和枚举型,其中 break 为结束 switch 语句的意思,若是语句中没有 break 语句,则会导致程序会一直执行下去,无法在完成匹配后跳出 switch 语句。
实例
在平年的情况下,根据提供的月份返回该月份的总天数:
public class Demo2 {
public int getDayOfMonth(int m){
int day = 0;
switch(m){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 2:
day = 28;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
}
return day;
}
public static void main(String[] args) {
Demo2 d = new Demo2();
int day = d.getDayOfMonth(100);
System.out.println(day);
}
}
补充:在 switch 语句中,如果所有的 case 值都不满足条件,可以使用 default 关键字,意思是除上面 case 值以外的所有的选项。
结束语
今天就学到这里吧,内容有点多,大家需要多消化下,不要为了追求进度赶忙学习下一个章节,欲速则不达。