Day04 Java中的变量,常量与运算符

五. 变量,常量

  • 变量: 变量就是可以变化的量。可以理解为系统为变量名分配了一块内存空间,内存空间里储存了什么就是变量的值。

    • Java是一种强类型语言每个变量都必须声明其类型。

    • Java变量是程序中最基本的储存单元,其要素包括变量名变量类型作用域

    //type varName [= vakue][{,varName [= value]}];
    //数据类型 变量名 = 值;可以使用多个逗号隔开来声明多个同类型的变量
    //具体的例子如下
    int i = -1;
    int i1 = 1, i2 = 2;  
    
    
    • 注意事项:
    1. 每个变量都必须有类型,可以是基本类型,也可以是引用类型。
    2. 变量名必须是合法的标识符。
    3. 变量声明是一个完整的语句,每一个声明都需要以分号(;)结尾.
    • 变量作用域:分下面三种:类变量,实例变量,局部变量
      先做了解
    //一个实例
    public class Variable {
        static int i = 0;  //类变量
        String str = "Hello world!";  //实例变量
        public void method() {
            int b = 0;  //局部变量
        }
    }
    
    1. 局部变量,存在于方法和语句块中,他的生命周期一般就是距离他最近的一对花括号( {} ).局部变量必须声明和初始化,否者无法使用。
public class A {
      public static void main(String[] args) {
          int i1;  //定义在main方法中的两个局部变量
          int i2 = 10;
          System.out.println(i1);  //没有初始化,无法输出,报错
          System.out.println(i2);  //正常输出10
      }
  }
  1. 实例变量:从属于对象,随着对象的创建而创建,一般拥有与对象相同的生命周期,如果没有手动指定初始化的值,则会在创建时自动使用定义类型的默认值进行初始化。

    • 整数类型的默认值:0

    • 小数类型的默认值:0.0

    • 布尔类型的默认值:false

    • 其余类型的默认值:null

  • 注:如果要使用实例变量,需要先创建对应类。
public class Variable {
    String name; //定义了四个类变量,其中一个给有初始值
    int age;
    String male = "Female";
    double salary;

    public static void main(String[] args) {
        Variable var = new Variable();
        System.out.println(var.name);//输出null
        System.out.println(var.age);//输出0
        System.out.println(var.male);//输出female
        System.out.println(var.salary);//输出0.0
    }
}

  1. 类变量:在实例变量前定义前加上关键字static即为类变量,类变量无需新建对应类即可直接通过 ClassName.varName 调用。类变量的初始化机制遵循实例变量的初始化机制。
public class Variable {
	//两个类变量,一个初始化了,一个没有
    static String companyName = "Konoha";
    static String position;

    public static void main(String[] args) {
        //没有新建对象直接使用
        System.out.println(companyName);//输出konoha
        System.out.println(position);//输出null
    }
}  
  • 常量(Constant): 初始化后不能再改变的值。

    常量可以理解为一种特殊的变量,他的值设定之后,在程序运行期间不允许被改变。定义使用final关键词,定义语法如下:

    final type varName = value;
    final double   PI  = 3.14;
    

    注意:常量的名字一般全部使用大写的字符。

  • 变量的命名规范:

    1. 所有的变量,方法,类名:见名知意,要让人看到就清楚是用来干嘛的。
    2. 类成员变量,局部变量和方法名:一般使用首字母小写和驼峰原则。如lastNameshowLastName().
    3. 常量:使用大写字母和下划线,如MAX_NAME.

六. Java的运算符

  • Java的运算符可以分为以下几类:

    • 算数运算符:+, -, *, /,%,++,--
    • 赋值运算符:=
    • 关系运算符:<, >, >=, <=, ==, !=, instanceof(对象部分再介绍)
    • 逻辑运算符:&&(与), ||(或), !(非)
    • 位运算符: &, |,^,~,>>,<<,>>>(做了解)
    • 条件运算符: ? : (三目运算符)
    • 扩展赋值运算符: +=, -=, *=,/=
  • 下面直接通过程序演示各个运算符的用法

    • 算数运算符:
            int total = a + b;
            System.out.println(total); //输出a+b
            total = a - b;
            System.out.println(total); //输出a-b
            total = a * b;
            System.out.println(total); //输出a*b
            total = a / b; //出现问题,请思考
            System.out.println(total); //输出a/b
            total = b % a; //%为取模运算,即取得 b / a 的余数
            System.out.println(total);
    

    ​ 算数运算中,得到的结果类型取决于操作数的类型,例如,int与int操作会得到int类型的结果,int和long操作会得到long的结果,Java在数字操作中,对高于int的类型操作时结果类型使用操作数中类型最高作为的结果的类型,对低于int类型的数字之间的操作结果依旧使用int类型作为结果的类型。

     //算数运算符的结果类型问题
    long ll = 123123123123123123L;
    int in = 123123;
    short sh = 12;
    byte by = 1;
    
    //可以使用IDE的功能看到结果的类型
    System.out.println(ll+in+sh+by);//结果类型为long
    System.out.println(in+sh+by);   //结果类型为int
    System.out.println(sh+by);      //结果类型为int
    
    • 关系运算符:关系运算符得到的是一个boolean值.
    	  boolean flag = false;
            flag = a < b;
            System.out.println(flag);
            flag = a > b;
            System.out.println(flag);
            flag = a != b;
            System.out.println(flag);
            flag = a == b;
            System.out.println(flag);
    
    • 逻辑运算符:与或非,得到的结果是一个boolea值
    	  //自己尝试看看得到的结果是否与你想的一致
    	  flag = (a < b) && (a != b);
            System.out.println(flag);
            flag = (a < b) && (a == b );
            System.out.println(flag);
    
            flag = (a > b) || (a == b );
            System.out.println(flag);
            flag = (a < b) || (a != b);
            System.out.println(flag);
    
            flag = !(a < b);
            System.out.println(flag);
            flag = !(a > b);
            System.out.println(flag);
    
    • 逻辑运算符&&的短路运算性质:当 && 前一个操作数为 false 时便不再计算后面的表达式,直接返回false
            //逻辑运算符&&的短路运算例子
            boolean bo1 = false;
            int a1 = 3;
            boolean bo2 = bo1 && (++a1>3);
            System.out.println(a1);  //输出为3,++a1未执行
    
    • 自增运算符++, 自减运算符--

      自增自减运算符的功能相当于a=a+1;他们是单目运算符,可以放在变量的前面或者后面,但是两者在某些时候会有一些不同的差异,通过以下的例子简单说明:

           //看如下的代码,以++为例,--规则相同
           int i1 = 3;
           int i2 = i1++;
       System.out.println(i1);  //输出4
           int i3 = ++i1;
    
           System.out.println(i1);  //输出5
           System.out.println(i2);  //输出3
           System.out.println(i3);  //输出5
    

    可以看出 i1++ 在执行完成 i2 = i1 后才被执行,而++i1 在执行 i3 = i1 之前执行了。我们可以先简单的认为前置++运算符会先执行,而后置的++运算符会在执行完当前操作之后在执行。--运算符同理。

    //由此我们可以通过如下的代码理解他的原理
    int i1 = 3;
    //int i2 = i1++ 可以看做执行了以下语句
    int i2 = i1;
    i1 = i1 + 1;
    //int i3 = ++i1 可以看做执行了以下语句
    i1 = i1 +1;
    int i3 = i1;
    
    • 位运算

      • &:按位取与
      • | :按位取或
      • ^ :按位异或
      • ~ :按位取反
      • <<:按位左移,溢出舍去
      • >>:按位右移,溢出舍去

      我们通过一下的例子直接认识这几个操作符:

      两个二进制数A, B

      A = 0000 1100

      B = 0000 1101

      A&B = 0000 1100

      A | B = 0011 1101

      A ^ B = 0011 0001

      ​ ~B = 11110010

      一个二进制数A = 0000 0001,左移,右移同理

      A << 1 0000 0010

      A << 2 0000 0100

    左移右移根据二进制的规则我们可以发现,他们风别对应 *2 与 /2 ,而且效率极高。

    • 扩展赋值运算符:以+=为例,其余同理
    //通过这个例子理解
    int a = 5;
    int b = 6;
    a += b; 
    System.out.println(a);  //输出11
    //即 a += b 等同于下面的语句
     a = a * b;
    //其它运算符可以自己尝试
    
    • 条件运算符: ? : (三元运算符)

      语法和使用如下

// x ? y : z 
  //如果 x == true, 返回y,否则返回z,x可以是值,表达式等。
  //一个例子
  int score = 50;
  String level = score < 60 ? "及格" : "不及格";
  System.out.println(level);  //输出不及格
  score = 70;
  System.out.println(score < 60 ? "及格" : "不及格");  //输出及格
  • 扩展: + 作为字符串连接符

    当 + 的某一侧的操作数为String类型时,就会将非字符串的数据转换成字符串,然后将他们作为字符串按照顺序连接起来。

//看两个例子
int i1 = 3;
int i2 = i1++;
int i3 = ++i1;
// + 作为字符串连接符的例子
System.out.println(i3+"");           //输出“5”
System.out.println("" + i2 + i3);    //输出“35”
System.out.println(i2 + i3 + "");    //输出“8

连接符从左向右运算,直到发现字符串才会转换,之前的操作按照原先的规则进行运算。

  • 运算的优先级问题:Java 语言中运算符的优先级共分为 14 级,其中 1 级最高,14 级最低。建议使用括号组织表达式的优先级。使用优先级为 1 的小括号可以改变其他运算符的优先级,即如果需要将具有较低优先级的运算符先运算,则可以使用小括号将该运算符和操作符括起来。相关运算的优先级在此不多赘述,见下表,多多尝试。
优先级 运算符 结合性
1 ()、[]、{} 从左向右
2 !、+、-、~、++、-- 从右向左
3 *、/、% 从左向右
4 +、- 从左向右
5 «、»、>>>«、»、>>> 从左向右
6 <、<=、>、>=、instanceof 从左向右
7 ==、!= 从左向右
8 & 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ? : 从右向左
14 =、扩展运算符 从右向左
posted @ 2021-02-18 22:05  心叶酱  阅读(52)  评论(1)    收藏  举报