Java复习笔记(1)

变量的本质、声明格式和初始化

Java是强类型的语言,必须要有变量类型。

变量的本质

代表一个“可操作的存储空间”,空间位置是确定的,但是里面放置什么值不确定。我们可以通过变量名来访问“对应的存储空间”,从而操作这个“存储空间”存储值。要素包括变量名、变量类型、作用域。

注意事项:

每个变量都有类型,类型可以使基本类型,也可以是引用类型。

变量名必须是合法的标识符

变量声明是一条完整的语句,因此每一个声明都必须以分号结束。

int  i,j;//不建议这样写,尽量一行声明一个变量

变量需要声明并初始化才能够使用。

变量分类

局部变量(local variable)

方法或语句块内部定义的变量,生命周期是从声明位置开始到语句块结束。

必须先声明、初始化然后才能使用

成员变量(实例变量 member variable)

方法外部,类的内部定义的变量,从属于对象,生命周期伴随对象始终。

不进行初始化,会自动初始化成该类型的默认值。

静态变量(static variable)

使用static定义,从属于类,生命周期伴随类始终,从类加载到卸载。

常量(constant)和final

常量值一个固定的值。不会改变。

final修饰的为符号常量。

变量和常量命名规范
  1. 所有变量、方法、类名:见名知意
  2. 类成员变量:首字母小写,驼峰原则
  3. 局部变量:首字母小写,驼峰原则
  4. 常量:大写字母和下划线:MAX_VALUE
  5. 类名:首字母大写,驼峰原则
  6. 方法名:首字母小写,驼峰原则;

基本数据类型(primitive data type)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xruyRQHO-1630846110837)(https://gitee.com/li-wenze/images/raw/master/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.PNG)]

整型变量和整型常量

byte 1

short 2

int 4

long 8

以0开头指八进制,以0x开头是16进制。以0b开头是二进制。

浮点型变量常量

float

double

浮点型数据不精确。如要使用精确的,可使用math类BigDecimal方法、

float f =0.1f;
double d =1.0/10;
System.out.println(f==d);
float d1 = 423432423f;
float d2 =d1 + 1;
if (d1==d2)
    System.out.println(true);
else{
    System.out.println(false);//返回true;
}

字符型变量常量、转义字符

char 使用Unicode编码

string就是字符序列

布尔类型变量、常量

Boolean类型有两个常量值,true和false,在内存中占一位,不是一个字节,不可以用0和1代表,与C语言不同。

boolean man = true;
if (man){
    System.out.println("男性");//()里面不推荐man==true
}

运算符(operator)

算术运算符

+、-、*、/、%二元运算符

整数运算
  1. 如果两个操作数有一个为long,则结果也为long。
  2. 没有long时,结果为int ,即使操作数全为short byte,结果也是int
浮点运算
  1. 如果两个操作数有一个为double,则结果为double
  2. 只有两个操作数都是float,则结果才是float
取模运算%
  1. 操作数可以为浮点数,一般使用整数,结果是余数,余数符号和左边操作数相同。

算术运算符中++、–属于一元运算符,该鳄梨运算符只需要一个操作数。

赋值运算符和赋值拓展运算符

+= a+=b 等价 a=a+b;

关系运算符

结果为布尔值。

a=3; a==3;char类型也可以做大小比较,会转化为编码对应的数字

逻辑运算符

与、或、非、异或(相同为false,不同为true)

短路与、短路或 逻辑运算符的短路特性,利用短路特性可以提高运算效率。

短路与 第一个操作数的值为false,则不需要在计算后面的操作数。

位运算符

3*2如何运算最快:左移一位相当于乘以2

右移一位,相当于除以2

相比真正计算效率更高

字符串连接符

字符串 +号左右两边有字符串,则加号就变为字符串连接符

条件运算符

需要三个操作数

运算符优先级

优先级最高的为括号。

自动类型转化

自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型

long可以自动转换为float,但是会损失一定的精度。

整型常量可以直接复制给byte、short、char等类型的变量,二不需要进行强制类型转化,只要不超出表述范围即可。

强制类型转化

前面加括号即可

会造成数据的丢失

操作比较大的数时,要留意是否溢出

不要命名名字为 l 的变量, l 容易和1混淆,long类型的使用大写L 不要用小写

控制语句

流程控制语句是用来控制个语句执行顺序的语句。

任何软件和程序,小到一个练习,大到一个操作系统,本质上都是由“变量、选择语句、循环语句”组成。

顺序结构

天然顺序

选择结构

如果 则 的逻辑

if单选择结构

if(){

语句块;

}

double d = Math.random();//返回0~1的double型数
System.out.println(d);
if——else双选择结构

如果 否则

double r = 4*Math.random();
double area = 3.14*Math.pow(r,2);
double circle = 2*Math.PI*r;
System.out.println("半径为:"+r);
System.out.println("面积为:"+area);
System.out.println("周长为:"+circle);
if(area>=circle){
    System.out.println("面积大于周长");
}else {
    System.out.println("周长大于面积");
}
if ~elseif if~else多选择结构
int age = (int)(100*Math.random());
System.out.println(age);
if(age<10){
    System.out.println("儿童,喜欢玩");
}else if (age<25){
    System.out.println("青年,要学习");
}else if (age<45){
    System.out.println("中年,要工作");
}else if (age<65){
    System.out.println("中老年,要补钙");
}else if (age<85){
    System.out.println("老年,多运动");
}else {
    System.out.println("老寿星,古来稀");
}
switch语句的使用

当布尔表达式是等值判断的情况,可以使用if—else、if—else多选择结构或switch结构,吐过布尔表达式是区间判断的情况,则只能使用if—else、if—else多选择结构。

switch语句以break结束。

多值判断使用switch。

int month = (int) (1+12*Math.random());
System.out.println("月份:"+month);
switch (month){
    case 1:
        System.out.println("一月份,过新年");
        break;
    case 2:
        System.out.println("二月份,开春了");
        break;
    default:
        System.out.println("其他月份");

循环结构

如果 则再继续 的逻辑

一类为当型,一类是直到型。

主要是当型。直到型使用的少

while 型
int x =1;
int sum = 0;
while (x<=100){//计算1-100的和。
sum = sum +x;
x++;//
}
System.out.println(sum);
for循环

支持迭代的一种通用结构,是最有效、最灵活的循环结构。

int sum = 0;
   for (int i =0;i<=100;i++){
    sum = sum +i;
}
   System.out.println(sum);
嵌套循环

在一个循环语句内部在嵌套一个或多个循环,叫做嵌套循环。

public class test {
    public static void main(String[] args) {
        int n=3; //自定义
        //前三行的输出
        for (int i = 1; i <= n; i++) { //控制行数
            for (int j = 1; j <= n - i; j++) { //打印空格
                System.out.print(" ");
            }
            for (int k = 0; k < i*2 -1; k++) { //打印*
                System.out.print("*");
            }
            System.out.println();
        }
        //后两行的输出
        for (int i = n-1; i >= 1;i--) {  //行数
            for(int k = 1;k <= n-i;k++) {  //打印空格
                System.out.print(" ");
            }
            for (int j = 1; j <= i*2 -1; j++) { //打印*
                System.out.print("*");
            }
            System.out.println();
        }
    }
}
break和continue

break指的是强制退出循环。

continue指的是终止本次循环,继续下次循环

带标签的break和continue

goto关键字很早就在程序设计语言中出现,尽管goto仍然是Java的一个保留字,但并未在Java语言中得到正式使用,Java没有goto语句。

从内循环跳到外循环。不太常用

方法的定义_形参、实参、返回值

方法就是一段用来完成特定功能的代码片段,类似于其他语言的函数。方法从属于对象和类

  1. 形式参数:在方法声明时用于接受外界数据传入的数据
  2. 实参:调用方法时实际传给方法的数据
  3. 返回值:方法在执行完毕后返还给调用它的环境的数据
  4. 返回值类型:事先约定的返回值的数据类型,如果无返回值,必须显示指定为void。

通过对象调用普通方法

方法的好处在于可以被反复调用。

注意事项

  1. 实参的数目、数据类型和次序必须和所调用的方法声明的形式参数列表相匹配
  2. return语句终止方法的运行并指定要返回的数据
  3. Java中进行方法调用中传递参数时,遵循值传递的原则(传递的都是数据的副本)
  4. 基本数据类型的传递是该数据值的copy值
  5. 引用类型传递的是该对象引用的copy值,但指向的是同一个对象。

方法的重载(重点)

重载的方法,实际是完全不同的方法,只是名称相同而已。

参数名称不同,不构成方法的重载,无法区分

只有返回值不同,不构成方法的重载。

参数个数不同,构成重载。

递归和迭代

递归结构

基本思想是“自己调用自己”。

  1. 定义递归头:什么时候不调用自身方法,如果没有头,将陷入死循环,也就是递归的结束条件。
  2. 递归体:什么时候需要调用自身方法。
  3. 在要求高性能的情况下,尽量避免使用递归,递归调用既花时间又耗内存
public class test {
    public static void main(String[] args) {
        test ts = new test();
        int a =ts.climbStairs(4);
        System.out.println(a);
    }
    int i = 1;
    public int climbStairs(int n){
        if (n<=0){
            return 0;
        }
        if (n==1){
            return i;
        }
        if (n==2){
            i++;
            return i;
        }else {
            return climbStairs(n-1)+climbStairs(n-2);
        }

    }
}