Java从零开始学习(1)

1 变量与数据类型

1.1 标识符

标识符(Identifier)是用来命名变量、方法、类、包等程序元素的名称。

标识符必须遵循以下规则:

  • 由字母、数字、下划线(_)和美元符号($)组成。
  • 不能以数字开头。
  • 区分大小。
  • 长度无限制。
  • 不能是Java中的保留关键字。

命名规范: 软性建议

  • 标识符命名习惯:见名知意。
  • 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
  • 方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。
  • 变量名规范: 首字母小写,后面每个单词首字母大写。
  • 包名规范:全都小写。

具体命名规范参考Java开发手册(嵩山版)

1.2 关键字

Java中有一些赋予特定的含义,有专门用途的字符串称为关键字(keyword)。全部是小写。
在这里插入图片描述
保留字:没有定义用途,但保留备用。
例如:goto、const

1.3 进制

1.3.1 二进制

  • 计算机中的数据都以二进制数字保存。
  • 二进制:逢二进一。即只有0、1两个值。
    如:十进制的10在计算机内保存为二进制的1010
  • 计算机中信息的存储单位
    • 位(Bit):表示一个二进制数码0或1,是计算机存储处理信息的最基本的单位。
    • 字节(Byte):一个字节由8个位组成。它表示作为一个完整处理单位的8个二进制数码。
    • 字:32位计算机:1字=32位=4字节,64位计算机:1字=64位=8字节

1.3.2 十六进制

二进制表示法太冗长,所以在程序中一般喜欢用十六进制。
十六进制:基数为十六,逢十六进一。它用abcdef表示从0-9之上的值。
Java中十六进制数据要以0x或0X开头。如:0x23D
十六进制转换成二进制只需将每个十六进制数字替换为相对应的四个二进制位即可。
例:

二进制十六进制
00000
00011
00102
00113

在这里插入图片描述

1.3.3 八进制

八进制:基数为八。
Java中八进制数据要以0开头。如:0123
八进制转换成二进制:只需将每个八进制数字替换为相对应的三个二进制位即可。
现在的计算机系统很少用八进制的了
例:

二进制八进制
0000
0011
0102

1.3.4 原码、反码、补码

  1. 原码
    十进制数据的二进制表现形式就是原码,原码最左边的一个数字就是符号位,0为正,1为负。
    例如:56 -> 0 0 1 1 1 0 0 0
    左边第一位为符号位,其他位为数据位。
    一个 byte 有 8bit,最大值是 0 1 1 1 1 1 1 1 (+127),最小值是 1 1 1 1 1 1 1 1 (-127)在计算机中之所以使用二进制来表示原码是因为逻辑简单,对于电路来说只有开或者关两种状态,用二进制是在方便不过的了。如果使用的进制是十进制、八进制或者十六进制的话,电路没有办法表示那么多的状态

  2. 反码
    正数的反码是其本身(等于原码),负数的反码是符号位保持不变,其余位取反。 反码的存在是为了正确计算负数,因为原码不能用于计算负数

  3. 补码
    正数的补码是其本身,负数的补码等于其反码 +1。因为反码不能解决负数跨零(类似于 -6 + 7)的问题,所以补码出现了。

例:

-5623
原码1011 10000001 0111
反码1100 01110001 0111
补码1100 10000001 0111

总结:

  • 原码:最高位符号位,0表示正数,1:表示负数
  • 反码:正数的补码不变,负数反码:符号位不变,其他按位取反,解决负数的计算问题
  • 补码:正数的补码不变,负数补码是反码+1,解决跨零计算问题

1.2 数据类型

程序处理的都是数据,由于不同数据的内容大小不同, 导致所需的存储单元大小不同,在Java语言中使用
数据类型的概念加以描述 。
字节是计算机技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构
成信息的一个小单位。Java中的字节是八位的字节,即它包含八位的二进制数。
在这里插入图片描述

  • 整数类型:

    • byte:8位有符号整数,范围为-128至127。
    • short:16位有符号整数,范围为-32768至32767。
    • int:32位有符号整数,范围为-2147483648至2147483647。
    • long:64位有符号整数,范围为-9223372036854775808至9223372036854775807。
  • 浮点数类型:

    • float:单精度浮点数,占用32位,范围约为±1.4E-45至±3.4E38,可精确到小数点后7位。
    • double:双精度浮点数,占用64位,范围约为±4.9E-324至±1.7E308,可精确到小数点后15位。
  • 字符类型:

    • char:16位Unicode字符,表示单个字符,范围为’\u0000’(0)至’\uffff’(65535)。
  • 布尔类型:

    • boolean:表示逻辑值,只有两个取值:true和false。

在这里插入图片描述

1.2.2 基本数据类型转换

  • 自动类型转换:容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为:
    在这里插入图片描述

  • 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。

  • byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。

  • boolean类型不能与其它数据类型运算。

  • 当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型。

1.2.3 字符串类型:String

  • String不是基本数据类型,属于引用数据类型
  • 使用方式与基本数据类型一致。例如:String str = “abcd”;
  • 一个字符串可以串接另一个字符串,也可以直接串接其他类型的数据。例如:
str = str + “xyz” ;
int n = 100;
str = str + n;

在这里插入图片描述
在这里插入图片描述

1.2.4 强制类型转换

  • 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符:(),但可能造成精度降低或溢出,格外要注意。
  • 通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
 String a =43; 
 int i = Integer.parseInt(a);
  • boolean类型不可以转换为其它的数据类型。

1.3 变量

1.3.1 定义

变量是在程序中用于存储和操作数据的一种命名标识符。它们代表了在计算机内存中的存储位置,可以通过名称来引用和访问存储的数据。

变量的含义有以下几个方面:

  • 存储数据: 变量用于存储各种类型的数据,比如整数、浮点数、字符、布尔值等。通过给变量赋值,可以将数据存储在变量中,之后可以使用变量名来访问这些数据。

  • 命名标识符: 变量具有一个名称作为其标识符,用于在程序中唯一标识该变量。合理的变量命名可以提高代码的可读性和可维护性。

  • 可变性: 变量的值可以被修改和更新。通过为变量赋予新的值,可以改变变量所存储的数据内容。

  • 数据类型: 变量具有特定的数据类型,用于确定变量可以存储的数据种类和范围。不同的数据类型需要不同的内存空间以及对应的操作。

  • 作用域: 变量只在其定义的作用域内可见和有效。它们可以在方法、类、代码块等作用域中定义,并且其可见性和生命周期由所在的作用域决定。

通过使用变量,我们可以方便地处理和操作数据,使得程序更加灵活和可扩展。变量的使用使得程序可以根据不同的输入和需求进行动态的计算和处理。

1.3.2 声明变量

1.3.2.1 方式1:先声明变量后赋值

语法:
数据类型 变量名称;
变量名称=值;
例如:
int i;
i = 10;

1.3.2.1 方式2:声明变量的同时赋初值

语法 :
数据类型 变量名称=值;
例如:
int i = 10;

1.3.3 变量的使用

package org.zyc.example;
public class Test {
    public static void main(String[] args) {
        int age;
        age=22;
        double money=10.0;
        System.out.println("年龄是:"+age);
        System.out.println("私房钱有:"+money);
        float num=12.5F;//小数点的数字默认是double类型,如果赋值给float,需要在值后面加上后缀f 大小写都OK
        long num2=100L;//整数数字默认是int类型,long类型的 变量的值后面可以添加L后缀,也可以省略(省略的时候暗含类型转换,但是不能超过int的范围,否则不能省略)
        char gender='男';//字符类型的值必须使用单引号引起来
        String str="我爱你中国";//字符串类型的值必须使用双引号引起来
        System.out.println(num);
        System.out.println(num2);
        System.out.println(gender);
        System.out.println(str);
    }
}

输出结果:
在这里插入图片描述

1.3.4 控制台输入

package org.zyc.example;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);//需要导入java.util.Scanner;
        System.out.print("请输入您的年龄:");
        int age=20;//声明变量并附了初值
        age=input.nextInt();//扫描整数
        System.out.print("请输入您的私房钱:");
        double money=input.nextDouble();//扫描小数
        System.out.print("请输入您的姓名:");
        String name=input.next();//扫描字符串,空格不能扫描
        System.out.print("请输入性别:M/F");
        char gender=input.next().charAt(0);//扫描字符
        System.out.println("你是单身嘛?");
        boolean isSingle=input.nextBoolean();//扫描boolean类型
        System.out.println("输入的年龄是:"+age);
        System.out.println(money);
        System.out.println(name);
        System.out.println(gender);
        System.out.println(isSingle);
        input.close();//可以省略,避免有黄色的警告
    }
}

结果:
在这里插入图片描述

1.3.5 变量分类

  • 基本数据类型变量
  • 引用数据类型变量
  • 按被声明的位置划分:
    • 局部变量:方法或语句块内部定义的变量
    • 成员变量:方法外部、类的内部定义的变量

特别注意:类的外面不能有变量的声明

2 运算符

2.1 算术运算符

在这里插入图片描述

++: 如果是变量前缀:先对此变量加1,再执行其他的操作。
     如果是变量后缀:先执行当前语句的其他操作,再对此变量加1
--: 如果是变量前缀:先对此变量减1,再执行其他的操作。
     如果是变量后缀:先执行当前语句的其他操作,再对此变量减1

2.2 赋值运算符

赋值运算符作用是将一个值赋给一个变量,运算顺序从右到左
在这里插入图片描述

2.3 关系运算符

关系运算符作用是比较两边的操作数,结果总是boolean型的。
在这里插入图片描述

2.4 逻辑运算符

在这里插入图片描述

2.5 字符串连接运算符

String s="He" + "llo";//结果"Hello"
//"+"除了可用于字符串相连接,也能将字符串与其它的数据类型相连成一个新的字符串。
//如:
String s="x" + 123;// 结果"x123"

2.6 三目运算符

X ? Y : Z
X为boolean类型表达式,先计算x的值,若为true,整个三目运算的结果为表达式y的值,否则整个运算
结果为表达式z的值。

//例:
int score = 75;
String type = score >=60 ? "及格" : "不及格";
//结果: 及格

2.7 位运算符

位运算符对两个操作数中的每一个二进制位都进行运算
位运算符功能:

  • 按位取反 ~
  • 按位与 &
  • 按位或 |
  • 按位异或 ^
    在这里插入图片描述

移位运算符

  • 左移:"a<<b; "将二进制形式的a逐位左移b位,最低位空出的b位补0
  • 带符号右移:"a>>b; "将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位
  • 无符号右移:"a>>>b;"将二进制形式的a逐位右移b位,最高位空出的b位补0
222700000000 00000000 00001000 10110011
2227<<300000000 00000000 01000101 10011000
2227>>300000000 00000000 00000001 00010110
2227>>>300000000 00000000 00000001 00010110
-222711111111 11111111 11110111 01001101
-2227<<311111111 11111111 10111010 01101000
-2227>>311111111 11111111 11111110 11101001
-2227>>>300011111 11111111 11111110 11101001

2.8 操作符优先级

运算符的优先次序
表达式的运算按照运算符的优先顺序从高到低进行,同级运算符从左到右进行:

类别操作符关联性
后缀() [] . (点操作符)左到右
一元expr++ expr–从左到右
一元++expr --expr + - ~ !从右到左
乘性* /%左到右
加性+ -左到右
移位>> >>> <<左到右
关系> >= < <=左到右
相等== !=左到右
按位与左到右
按位异或^左到右
按位或|左到右
逻辑与&&左到右
逻辑或| |左到右
条件?:从右到左
赋值= + = - = * = / =%= >> = << =&= ^ = | =从右到左
逗号左到右

3 程序的流程控制

1996年,计算机科学家Bohm和Jacopini证明了:任何简单或复杂的算法都可以由顺序结构、分支结构和循环结构这三种基本结构组合而成。
它们的共同点是都包含一个入口和一个出口,它们的每个代码都有机会被执行,不会出现死循环。

3.1顺序结构

顺序结构是一种基本的控制结构,它按照语句出现的顺序执行操作。
在这里插入图片描述

3.2 分支结构

分支结构又被称为选择结构,根据条件成立与否来执行操作

3.2.1 基本选择结构 if

/*语法:
if(条件){
条件成立执行的内容
}
*/

在这里插入图片描述

3.2.2 if-else选择结构

/*语法:
if(条件){
条件成立执行的内容
}else{
条件不成立执行的内容
}
*/

在这里插入图片描述

3.2.3 多重选择结构

if(条件1){
//条件1成立的时候执行的条件
}else if(条件2){
//条件1不成立,条件2成立的时候执行的条件
}else if(条件3){
//条件1、2不成立,条件3成立的时候执行的条件
}......
else if(条件n){
//条件1到n-1不成立,条件n成立的时候执行的条件
}else{
//当以上的所有条件都不成立的时候执行的代码
}
/*
整个结构是一个整体,当一个条件成立并执行之后,整个结构就已经执行完毕;
if块必须有;
else if块可以有一个,也可以有多个;
else 可以有一个,也可以没有。
*/

在这里插入图片描述

案例:

如果高考成绩过700 清华 , 600-700:重点本科 500-600:普通本科 300-500:专科 其他:其他出路。

public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入你的分数:");
int score=input.nextInt();
if(score>700) {
System.out.println("去清华");
} else if (score >= 600/* &&score<=700 */) {
System.out.println("重点本科");
}else if (score >= 500/* &&score<=600 */) {
System.out.println("普通本科");
} else if(score>=300) {
System.out.println("专科");
}else {
System.out.println("其他出路!");
}
}

3.2.4 switch选择结构

替换等值判定的多重选择结构

switch(表达式){
case1://相当于if(){}
//满足表达式的结果==值1的时候执行的代码
break;//退出当前的switch选择结构
case2://相当于else if(){}
//满足表达式的结果==值2的时候执行的代码
break;
......
case 值n:
//满足表达式的结果==值n的时候执行的代码
break;
default://相当于else
//以上的匹配都失败的时候执行的内容
break;
}
/*
表达式的返回值必须是下述几种类型之一:int, byte, char, short,String;
case子句中的取值必须是常量,且所有case子句中的取值应是不同的;
default子句是可选的;
break语句用来在执行完一个case分支后使程序跳出switch语句块;如果case后面没有写break则直
接往下面执行!
Case后面的执行体可写{ }也可以不写{ }
*/	

在这里插入图片描述

案例:

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        // 基金经理的业绩排名:1、欧洲游 2、东南亚游 3、国内游 其他:再接再厉!
        System.out.println("请输入你的排名:");
        int num = input.nextInt();
        // 方式2:
        switch (num) {// 小括号中的表达式或者变量结果类型可以是:int char String byte short
            case 1:// 相当于if(num==1){}//case 后面的值必须是常量 'A' "星期一"
                System.out.println("奖励是:欧洲游");
                break;// 执行完毕一个case分支后跳出switch语句块
            case 2:// 相当于if(num==2)
                System.out.println("奖励是:东南亚游");
                break;
            case 3:// 相当于if(num==3)
                System.out.println("奖励是:国内游");
                break;
            default:// 相当于else ,是可选的
                System.out.println("再接再厉");
                break;
        }
        // 方式1:
        /*
        if (num == 1) {
        System.out.println("奖励是:欧洲游");
        } else if (num == 2) {
        System.out.println("奖励是:东南亚游");
        } else if (num == 3) {
        System.out.println("奖励是:国内游");
        } else {
        System.out.println("再接再厉");
        }
        */
    } 

巧用break的省略:
多分支月份输出天数

    public static void main(String[] args) {
       Scanner input = new Scanner(System.in);
       // 根据用户输入的月份,输出当月的天数,不考虑平年闰年
       System.out.println("请输入月份:");
       int month = input.nextInt();
       switch (month) {
           case 1:
           case 3:
           case 5:
           case 7:
           case 8:
           case 10:
           case 12:
               System.out.println(month + "月共有31天!");
               break;
           case 4:
           case 6:
           case 9:
           case 11:
               System.out.println(month + "月共有30天!");
               break;
           case 2:
               System.out.println(month + "月共有28天!");
               break;
           default:
               System.out.println("您输入的月份有误!");
               break;
       }
   }

3.2.5 嵌套选择结构

运动会百米赛跑项目: 16秒之内才能进入决赛,根据性别分男女组

package org.zyc.example;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        //运动会百米赛跑项目: 16秒之内才能进入决赛,根据性别分男女组
        Scanner input = new Scanner(System.in);
        System.out.println("请输入跑步时间秒:");
        float time=input.nextFloat();
        if(time<=16) {
            //进入决赛
            System.out.println("请输入性别:");
            String gender=input.next();
            if("男".equals(gender)) {//字符串比较内容是否相等,不能使用== 使用.equlas()
                System.out.println("进入男子组决赛!");
            }else {
                System.out.println("进入女子组决赛!");
            }
        }else {
            System.out.println("很遗憾,没能进入决赛!下次努力!");
        }
    }
}	

3.2.6 字符串比较相等

  • ==比较内存地址
  • equlas比较内容
String str1="abc";
String str2=input.next();
System.out.println(str1==str2);
System.out.println(str1.equlas(str2));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值