java入门上部

java入门上部

人机交互

CMD

**CMD:**在windows中,利用命令行的方式操作计算机。可以打开文件,打开文件夹,创建文件夹等等

打开CMD

打开步骤:

1、Win + R, 出现运行窗口

2、在运行窗口输入 CMD, 应输入小写 cmd

3、 然后按 Enter(回车), 在C:\Users\287557> 后输入CMD的常见命令

常见CMD命令

  • 盘符名称 + 冒号

    说明:盘符切换

    举例:E:回车,表示切换到E盘

  • dir

​ 说明:查看当前路径下的内容

  • cd + 目录/文件夹名

​ 说明:进入单级目录

​ 举例:cd 作业

  • cd…

    说明:回退到上一级目录

  • cd 文件夹1\文件夹2…

    说明:进入多级目录

    举例:cd 作业\操作系统

  • cd \

    说明:回退到盘符目录。

  • cls

    说明:清屏。

  • exit

    说明:退出命令提示符窗口

配置环境变量

把qq的路径记录在电脑的环境变量

把软件的路径配置到环境变量中,可以在任意的目录下打开指定的软件

配置环境变量步骤:

此电脑——空白处右键——属性——收索高级系统设置——高级——环境变量——系统变量——path——编辑——添加路径

java基础语法

java入门

什么是java?

Java是一门面向对象编程语言,不仅吸收了 C++语言的各种优点,还摒弃了 C++里难以理解的多继承、指针等概念,因此 Java语言具有功能强大和简单易用两个特征。Java语言>>>作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立性与可移植性、多线程、动态性等特点。Java可以编写桌面应用程、Web应用程序、分布式系统和嵌入式系统应用程序等。

Java程序初体验

HelloWorld案例的编写

1、用记事本编写程序

2、编译(翻译)文件

3、运行程序

  • 编译:javac是JDK提供的编译工具,我们可以通过这个工具,把当前路径下的==.java文件编译成.class==文件
  • 运行:java提供一个工具,作用是运行代码,运行.class这个文件夹
BUG
  • 中英文符号问题
  • 单词拼写,大小写
环境变量

配置环境变量:

此电脑——空白处右键——属性——收索高级系统设置——高级——环境变量——系统变量——新建——变量名(N):JAVA_HOME +变量值(V):D:\JDK\jdk8(java.exe和javac.exe所在目录,去掉bin)——点击确定——Path——新建——%JAVA_HOME%\bin——点击确定

Notepad软件

常见的高级记事本:

Editplus、Notepad++、Sublime等

Java开发工具、用途、特性
Java SE

Java SE是java语言的(标准版),用于桌面应用的开发,是其它两个版本的基础。

**桌面应用:**用户只需打开程序,程序的界面会让用在最短的时间内找到他们需要的功能,同时主动带领用户完成他们的工作并得到最好的体验。

学习Java SE的目的是为今后从事的Java EE开发,打基础。

Java ME

Java ME是java语言的(小型版),用于嵌入式电子设备或者小型移动设备。

Java EE

Java EE是java语言的(企业版),用于Web方向的网站开发

**网站开发:**浏览器+服务器。

Java能做什么?

1、**桌面应用开发:**开发各种各样的工具,如各种税务管理软件,IDEA、Clion、Pycharm、WebStorm(前端开发工具)、PhpStorm(Php开发工具)

2、**企业及应用开发:**微服务、springcloud、淘宝,京东,阿里云(企业级应用:开发服务器)

3、**移动应用的开发:**鸿蒙、android、医疗设备控制管理程序

4、**科学计算工具:**matlab

5、**大数据开发:**hadoop框架

6、**游戏开发:**我的世界MineCraft

Java的特性
  • 面向对象:根据模板,把东西创建出来
  • 安全性
  • 多线程:通俗讲就是同时做多件事情
  • 简单易用
  • 开源:(1)不开源,例如下载一个QQ,仅仅下载的是QQ的安装包,腾讯公司不会把代码给你

​ (2)开源,当我们下载Java开发的工具的时候,Orck公司也会把代码给你,安装包和代码都要下载。一旦开源,世界上所有Java的开发者都可以维护Java.

  • 跨平台:跨平台中的平台指的是操作系统,Windows、Mac(苹果电脑操作系统)、Linux。跨平台指Java程序可以在任意操作系统上运行

Write Once Run Anywhere 一次编译,到处运行

高级语言的编译运行方式

编程、编译、运行

  • **编程:**java程序员写的.java代码,c程序员写的.c代码,python程序员写的.py代码
  • **编译:**机器只认01机器语言,把.java、.c、.py的代码做转化让机器认识的过程
  • **运行:**让机器执行编译后的指令

高级语言的编译运行方式

  • 编译型
  • 解释型
  • 混合型,半编译,半解释

编译型
在这里插入图片描述
c\c++不跨平台

解释型
在这里插入图片描述
Python开源

混合型
在这里插入图片描述

  • java不是直接运行在系统中的,而是运行在虚拟机中的

  • java语言的跨平台是通过虚拟机实现的

  • 针对于不同的操作系统,安装不同的虚拟机就可以了

JRE和JDK

JVM (Java Virtual Machine):Java 虚拟机,真正运行Java程序的地方

开发工具:

  • javac编译工具
  • java运行工具
  • jdb调试工具
  • jhat内存分析工具

**核心类库:**java已经写好的东西

JDK(Java Development kit):Java开发工具包,用于编写代码,由JVM核心类库开发工具组成。
在这里插入图片描述
JRE (Java Runtime Environment ): Java的运行环境,与JDK相似,JRE也是由JVM、核心类库、开发工具组成,但区别在于,组成 JRE的开发工具较 JDK少。例如,JRE的开发工具中不需要 javac编译工具,不需要 jdb调试工具,因为在 JRE中运行的是编译后的 .class文件。

Java基础概念

注释
  • **注释:**是在程序指定位置添加的说明性信息,简单理解,就是对代码进行解释说明的文字。

  • 注释分类:

    • 单行注释:

      格式://注释信息
      
    • 多行注释:

      格式:/*注释信息*/
      
    • 文档注释:

      格式:/**注释信息**/
      
  • 注意:

    • 注释的内容不参与编译,也不参与运行,仅仅是对代码的解释说明

    • 不管是单行注释还是多行注释,在书写的时候都不要嵌套

关键字

**关键字:**被 Java 赋予特定涵义的英文单词

特点:

  • 关键字的字母全部小写
  • 常用的代码编辑器,针对关键字有特殊的颜色标记,非常的壮观

**关键字class:**用于(创建/定义)一个类,后面跟随类名,类是Java最基本的组成单元

关键字 return:

  • 方法没有返回值:可以省略不写。如果书写,表示结束方法
  • 方法有返回值:必须要写。表示结束方法返回结果
字面量(常量)

**字面量:**数据在程序中的类型

字面量类型说明举例
整数类型(int)不带小数点的数字666、-88
小数类型(double)带小数点的数字13.14、-5.21
字符串类型(string)双引号括起来的内容,内容可以为空“HelloWorld”、“黑马程序员”、" "
字符类型(char)单引号括起来的,内容只能有一个‘A’、‘0’、‘我’、‘b’
布尔类型(boolean)布尔值,表示真假只有两个值:true, false
空类型一个特殊的值,空值值是:null

**细节:**null不能直接打印
如果我们要打印null,那么只能用字符串的形式进行打印

扩展点:

‘\t’、‘\r’、‘\n’、…

1、\t 制表符:

在打印的时候,把前面字符串的长度补齐到8,或者8的倍数。最少补1个空格,最多补8个空格。

public class HelloWorld{
    public static void main (String[] args){
        System.out.println("abc" + '\t');   //字符串长度为3,'\t' 表示补5个空格
         System.out.println("abcd" + '\t'); //字符串长度为4,'\t' 表示补4个空格
    }
}

**作用:**打印时让数据对齐

public class HelloWorld{
    public static void main (String[] args){
        System.out.println("nameage");   
         System.out.println("tom23"); 
    }
}

打印效果:
nameage
tom23
public class HelloWorld{
    public static void main (String[] args){
        System.out.println("name" + '\t' + "age");   
         System.out.println("tom" + '\t' + "23"); 
    }
}

打印效果:
name    age  //name后补4个空格
tom     23   //tom后补5个空格
变量

**变量:**在程序的执行过程中,其值有可能发生改变的量(数据)

**变量的使用场景:**当某个数据经常发生改变时,我们也可以用变量存储。当数据变化时,只要修改变量里面记录的值即可。

变量的定义格式:

数据类型 变量名 = 数据值;

"=":作用“赋值”
public class VariableDemo1{
    //主入口
    public static void main (String[] args){
        //定义变量
        //数据类型 变量名 = 数据值;
        int a = 12;
        //输出 a 的值
        System.out.println(a);
    }
}

运行结果:12

变量的使用方式:

1、输出打印

2、参与计算

3、修改记录的值

public class VariableDemo2{
    //主入口
    public static void main (String[] args){
        //数据类型 变量名 = 数据值;
       
       //1、基本用法
        int a = 12;
        //输出 a 的值
        System.out.println(a);
        System.out.println(a);
        
        //2、变量参与计算
        int b = 15;
        int c = 20;
         System.out.println(b + c);
         
        //3、修改变量记录的值
        a = 21;
        System.out.println(a);
        
        System.out.println("---------------);
        //注意事项
        //在- 一条语句可以定义多个变量
        int d = 100,e = 200,f = 300;
        System.out.println(d);
        System.out.println(e);
        System.out.println(f);
        
        int g;
        //System.out.println(g);报错,变量使用前未赋值
        g = 600;
        System.out.println(g);
    }
}

运行结果:
12
12
35
21
--------------------
100
200
300

注意事项:

  • 只能存一个值
  • 变量名不允许重复定义
  • 一条语句可以定义多个变量
  • 变量在使用之前一定要进行赋值
  • 变量的作用域范围==(变量只能在所属的方法里面有效)==

变量练习:

public class VariableTest{
    //主函数入口
    public static void main(String[] args){
        //定义乘客数量变量,并初始化
        int counter = 0;
        //第一站,上一个乘客
        counter = counter + 1;
        //第二站,上两个乘客,下一位乘客
        counter = counter + 2 - 1;
        //第三站,上两个乘客,下一位乘客
        counter = counter + 2 - 1;
        //第四站,下一位乘客
        counter = counter - 1;
        //第五战,上一位乘客
        counter = counter + 1;
        //输出终点站乘客人数
        System.out.println(counter);
    }
}

运行结果:
3
计算机的存储规则

**计算机中的3类数据:**文本数据、图片数据、声音数据

  • Text文本,文本数据

    • 数字、字母、汉字

    • 计算机的存储规则
      在这里插入图片描述
      在这里插入图片描述

      • 数字:转二进制

      • 字母:查询码表

      • 汉字:查询码表

  • Image图片,图片数据

    • 黑白图、灰度图、彩色图
      • 通过每个像素点中的RGB三原色来存储
  • Sound声音,声音数据

    • 对声音的波形图进行采样再存储

在计算机中,任意数据都是以二进制的形式来存储

不同进制在代码中的表现形式:

  • 二进制:由 0 和 1 组成,代码中以0b开头
  • 十进制;由 0 ~ 9 组成,前面不加任何后缀
  • 八进制:由 0 ~ 7 组成,代码中以 0 开头
  • 十六进制:由 0 ~ 9 还有 a ~ f 组成,代码中以 0x 开头

显示器的三个知识点:(图片存储)

  • 分辨率:2K、4K
    • 常见2K,1920*1080,在显示器上宽有1920个小格子,高有1080个小格子,一个小格子成为一个像素
    • 常见4K,3840*2160,
  • 像素
  • 在这里插入图片描述
  • 光学三原色
    • 红、绿、蓝。也称之为TGB
    • 写成十进制形式:(255,255,255)
    • 写成十六进制形式:(FF,FF,FF)
数据类型

数据类型的分类:

  • 基本数据类型

    • 数据类型关键字取值范围
      字节型byte-128~127
      短整型short-32768~32768
      长整型long-9223372036854775808~9223372036854775807
      整型int(默认)-2147483648~2147483647
      单精度浮点型float-3.401298e-38~3.402823e+38
      双精度浮点型double(默认)-4.9000000e-324~1.797693e+308
      字符型char0~65535
      布尔型booleantrue, flase

      注意:

1、在定义 long 类型的变量,在数据值后面需要加上一个 L 作为后缀

  long n = 999999L;

2、在定义 float 类型的变量,在数据值后面需要加上一个 F 作为后缀

 float f = 10.1F

3、double > float > long > int > short > byte

4、字符型

  package just.test;
    
    public class Test3 {
        public static void main(String[] args) {
           char a = 'a';
           char b = ++a;
           char c = (char)99;
            System.out.println(b);
            System.out.println(c);
        }
    }
    
    运行结果:
    b
    c
<img src="D:/学习makedown/Java(2)插入的图片/基本数据类型.jpg" alt="基本数据类型" style="zoom:33%;" />
  • 引用数据类型

    只要是 new 出来的,都是 引用数据类型

    例如:数组

    引用数据类型

练习:

1、练习:输出老师的信息

public class VariableTest2{
    //主入口
    public static void main(String[] args){
        //姓名
        string name = "黑马谢广坤";
        //年龄
        int age = 18;
        //性别
        char gender = '男';
        //身高
        double height = 180.1;
        //是否结婚,true表示结婚
        boolean flag = true;
        //输出变量的值
        System.out.println(name);
        System.out.println(age);
        System.out.println(gender);
        System.out.println(height);
        System.out.println(flag);
    }
}

输出结果:
黑马谢广坤
18180.1
true
标识符

**标识符:**就是给方法变量等起的名字。做到,见名知意

标识符命名规则—硬性要求

  • 数字字母下划线(_)美元符($) 组成
  • 不能以数字开头
  • 不能是关键字
  • 区分大小写

标识符命名规则—软性要求

小驼峰命名法:方法、变量

  • 规范1:标识符是一个单词 的时候,全部小写

  • 范例1:name

  • 规范2:标识符有多个单词组成的时候,第一个单词首字母小写其他单词首字母大写

  • 范例2:firstName

大驼峰命名法:类名

  • 规范1:标识符是一个单词 的时候,首字母大写**
  • 范例1:Student
  • 规范2:标识符有多个单词组成的时候,每个单词的首字母大写
  • 范例2:GoodStudent
键盘录入

**键盘录入介绍:**Java帮我们写好一个类叫 Scanner,这个类就可以接收键盘输入的数字

Scanner使用步骤:

  • 步骤一:导包 — Scanner 这个类在哪
  import java.util.Scanner;导包的动作必须出现在类定义的上边
  • 步骤二:创建对象 — 表示我要开始用 Scanner 这个类
 Scanner sc = new Scanner(System.in);
  上面这个格式里面,只有 sc 是变量名,可以变,其他的都不允许变。
  • 步骤三:接收数据 — 真正开始干活
  int i = sc.nextInt();
  左面这个格式里面,只有i是变量名,可以变,其他的都不允许变
 //导包,写在类定义的上面
  import java.util.Scanner;
  
  public class ScannerDemo1{
      public static void main(String[] args){
          //创建对象
          Scanner sc = new Scanner(System.in);
          
           System.out.println("请输入整数:");
          //接收数据
          //接收数据的代码sc.nextInt(),在键盘输入什么,sc.nextInt()就接受什么。再把接收到的结果,赋值给左边的变量,
          int i = sc.nextInt();//变量 i 记录了键盘录入的数据
          
          System.out.println("输出结果:");
          System.out.println(i);
      }
  }
  
  运行结果:
  请输入整数:
  1234
  输出结果:
  1234

**练习:**键盘输入数字并求和

需求:键盘录入两个整数,求出它们的和并打印出来。

 //导包
  inport java.unit.Scanner;
  
  public class ScannerDemo2{
      public static void main(String[] args){
          //创建对象
          Scanner sc = new Scanner(System.in);
          //输入两个整数
          System.out.println("请输入第一个数字:");
          int number1 = sc.nextInt();
          
          System.out.println("请输入第二个数字:");
          int number2 = sc.nextInt();
          
          System.out.println("输出两整数之和:");
          System.out.println(number1 + number);
      }
  }
  
  运行结果:
  请输入第一个数字:
  12
  请输入第二个数字:
  21
  输出两整数之和:
  
  33IDEA
第一套体系
package Just.test;

import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
        //键盘录入

        //第一套体系
        //nextInt();  接收整数
        //nextDouble;  接受小数
        //next();     接收字符串
        //遇到空格,制表符,回车就停止接收。这些符号后面的数据就不会接受了
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个整数");
        int num1 = sc.nextInt();
        System.out.println(num1);
        System.out.println("请输入第二个整数");
        int num2 = sc.nextInt();
        System.out.println(num2);
        System.out.println();

        System.out.println("请输入一个字符串");
        String arr1 = sc.next();
        System.out.println(arr1);
        System.out.println("请输入第二个字符串");
        String arr2 = sc.next();
        System.out.println(arr2);
        System.out.println();
    }
}
====================================================
运行结果:
请输入一个整数
123 456
123
请输入第二个整数
456

请输入一个字符串
asd fgjk
asd
请输入第二个字符串
fgjk
第二套体系
package Just.test;

import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        //第二套体系
        //nextLine();  接收字符串
        //可以接收空格、制表符,遇到回车才停止接受数据
        System.out.println("请输入一个字符串");
        String line1 = sc.nextLine();
        System.out.println(line1);
        System.out.println("请输入第二个字符串");
        String line2 = sc.nextLine();
        System.out.println(line2);

    }
}
==========================================================================
运行结果:
请输入一个字符串
asd fghh
asd fghh
请输入第二个字符串
asdfgghh 12555
asdfgghh 12555
输出
sout

1、换行输出:

System.out.println();

2、非换行输出

System.out.print();
souf

非换行输出

System.out.printf("");

souf 输出的参数分为两部分:

(1) 第一部分参数:要输出的内容 + %s (占位)

(2) 第二部分参数:填充的数据
package Just.test;

package Just.test;

public class Test2 {
    public static void main(String[] args) {
        //souf 两部分参数
        //第一部分参数:要输出的内容 + %s(占位)
        //第二部分参数:填充的数据
        System.out.printf("你好啊%s","张三");//第一部分:你好啊%s    第二部分填充数据:张三
        System.out.println();//换行
        System.out.printf("%s你好啊%s","张三","李四");//两个占位,需要对应两个 填充数据
    }
}

IDEA简介

IDEA概述:IDEA全称 IntelliJ IDEA, 是用于Java语言开发的集成环境,它是业界公认的目前用于 Java 程序开发最好的工具。

集成环境:把代码编写**,编译执行调试等多种功能综合到一起的开发工具

IDEA下载和安装

**下载:**https//www.jetbrains.com/idea/

**安装:**建议修改安装路径

IDEA项目结构介绍

1、project(项目)

2、module(模块),各模块相互独立

3、package(包),包就是文件夹,在模块里面建很多包,把功能相同的代码放在一个包中

  • 第一个文件夹(包)——存放与文字相关的代码
  • 第二个文件夹(包)——存放与图片相关的代码
  • 第三个文件夹(包)——存放与动画相关的代码
  • 第四个文件夹(包)——存放与==…==相关的代码

4、class(类)

总的结构:

project(项目)

module(模块)

package(包)

class(类)

IDEA使用步骤:

New Project——Empty Protect——Next——Project name(给项目取名字)——Project location(项目地址,后面一定要是 \ + 项目名称)——Finish——Modules——点击右上方" + "号——>New Module——Java——Next——Module name(模块名字)——Finish——Ok——展开模块——右键src——New—>———>Package——给“包”起名字(规则:公司域名反写+包的作用——右键包——New——Java Class——输入类名——

  • 在给包命名时,一个" . ",代表一级包
快捷键

psvm + 回车

psvm + 回车 自动输入:public static void main(String[] args)

main + 回车

main + 回车 自动输入:public static void main(String[] args)

sout + 回车

sout + 回车 自动输入:System.out.println();

Ctrl + Alt + M

Ctrl + Alt + M 自动抽取方法

Ctrl + d

复制 + 换行

Ctrl + a

Ctrl + a 全选

alt + Fn + insert

alt + Fn + insert ——> Constructor(构造器)——> Select None——> 生成无参构造器

alt + Fn + insert ——> Constructor(构造器)——> 按住 Shift ,点击最下面的那个(Ctrl + a)——> Ok——> 生成有参构造器

alt + Fn + insert ——> Getter and Setter——> Ctrl + a ——>生成每一个私有化成员变量对应的 get 和 set 方法

Ctrl + 左键

Ctrl + 左键 跳转到所选择对象在代码中出现的其他位置

Ctrl + p

Ctrl + p 显示方法参数

Ctrl + b

先选中 ,然后 Ctrl + b 看源码

先选中,然后 Ctrl + b 位移

Ctrl + Alt + t

先选中,然后 Ctrl + Alt + t 选循环

Alt + 鼠标左键

Alt + 鼠标左键, 批量选择

Ctrl + Alt + v

左键选中类中调用的方法 Ctrl + Alt + v 自动生成左边内容

Alt + 回车

选中 Alt + 回车 自动导包

点击报错红线 Alt + 回车 提供解决方案

Ctrl + n

Ctrl + n 输入要搜索的对象,可以查看源码

Ctrl + r

Ctrl + r 更换变量的名字

IDEA的项目和模块操作

IDEA中相关操作:

1、新建类:想把类新建在哪个包中,就右键那个包,然后 New —— Java.Class——写类名——回车

2、删除类:想删除哪个类,就右键那个类,然后 Delete…——Ok

3、修改:想修改哪个类,就右键那个类,然后选择 Refactor——Rename…,点击——弹出小窗,进行修改——点击 Refactor

IDEA中模块相关操作:

1、新建模块:File —— Porject Structure ——Modules ——中间点击 " + "——New Module——Java——Next——Module name(模块名字)——Finish——Yes——Ok.

​ 在某模块时,建立新的模块时,此时模块并立,当新建的模块有声明后,可以把新模块remove…, 然后单独打开

模块的内容根模块文件位置一定是:\项目名称\模块名

2、删除模块:

3、修改模块:

4、导入块:

IDEA中项目相关操作:

打开 IntelliJ IDEA 时,默认打开上次操作的项目,

1、关闭项目:关闭某个项目,先选中要关闭的项目,然后点击 File ——Close Project——点击

2、新建项目:New Project——Empty Protect——Next——Project name(给项目取名字)——Project location(项目地址,后面一定要是 \ + 项目名称)——Finish——Yes

3、打开项目:

4、修改项目:

运算符

运算符与表达式

**运算符:**对字面量或者变量进行操作的符号

表达式:运算符字面量或者变量连接起来,符合Java语法和式子就可以称为为表达式。不同运算符连接起来的表达式体现的是不同类型的表达式。

举例说明:

int a = 12;

int b = 15;

int c = a + b;

" + " : 是运算符,并且是算术运算符

a + b” 是表达式,由于" + " 是算术运算符,所以这个表达式叫算术表达式

算术运算符
基本用法

算术运算符:

符号作用说明
+
-
*
/取结果的 商
%取余、取模取结果的 余数

注意:

  • 整数参与运算只能得到整数

  • 当有小数参与运算时,计算结果可能不准确

  • 取模的应用场景

    • 1、可以用取模来判断,A 是否可以被 B 整除。 A % B
    • 2、可以判断 A 是否为偶数。 A % 2,结果为 0 ,则 A 为偶数,结果为 1,则 B 为奇数

练习:

需求:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台

公式总结:

个位:数值 / 1 % 10

十位:数值 / 10 % 10

百位:数值 / 100 % 10

千位:数值 / 1000 % 10

package Just.test;

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        //键盘录入一个三位数,获取其中的个位十位百位

        //1、键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个三位数");
        int number = sc.nextInt();

        //2、获取个位、十位、百位
        int unit = number % 10;
        int decade = number / 10 % 10;
        int hundred = number / 100 % 10;

        System.out.println("输出三位数的个位、十位、百位");
        System.out.println(unit);
        System.out.println(decade);
        System.out.println(hundred);
    }
}


请输入一个三位数
289
输出三位数的个位、十位、百位
9
8
2
高级用法

" + " : 操作的三种情况

1、数字的 " + " 操作

  • 数字进行运算时,数据类型不一样不能运算,需要转成一样的,才能运算

    • 隐式转换(自动类型提升)

      • 把一个取值范围小的数值,转成取值范围大的数据
      • 取值范围 (由小到大):byte——>short——>int——>long——>float——>double
      • 隐式转换的两种提升原则:
        • 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算
        • byte 、short 、char 三种类型的数据在运算的时候,都会直接先提升为 int ,然后再进行运算
    • 强制转换:

      • 如果把一个取值范围的数值,赋值给取值范围小的变量。是不允许直接赋值的,如果一定要这么做,就需要加入强制转换。

      • 格式目标数据类型 变量名 = (目标数据类型) 被强转的数据;

      • 范例:

        • 范例1
 double a = 123;
 int b = (int)a;
  - 范例2
 package Just.arithmeticoperator;
        
        public class ArithmeticoperatorDemo3 {
            public static void main(String[] args) {
                byte b1 = 10;
                byte b2 = 12;
                //把 b1 + b2 的和转成 byte 类型
                byte result = (byte)(b1 + b2);
                System.out.println(result);
            }
        }
        
        运行结果:
        22

2、字符串的 " + " 操作

  • 当 " + "操作中出现字符串时,这个 " + " 是字符串连接符,而不是算术运算符了。会将前后的数据进行拼接,并产生一个新的字符串。

    • 范例:

      “123” + 123 ——> “123123”

  • 连续进行 " + " 操作时,从左到右逐个执行

    • 范例:

      1 + 99 + “年黑马” ——>100 + “年黑马” —— “100年黑马”

  • 练习:

System.out.println(3.7 + "abc");//"3.7abc"
  
  System.out.println("abc" + true);//"abctrue"
  
  System.out.println('中' + "abc" + true);//"中abctrue"
  
  int age = 18;
  System.out.println("我的年龄是" + age + "岁" );//"我的年龄是18岁"
  System.out.println("我的年龄是" + "age" + "岁");//"我的年龄是age岁"
  
  System.out.println(1 + 2 + "abc" + 2 +1);//"3abc21"

3、字符的 “ + ” 操作

  • 字符 + 字符 // 字符 + 数字 时,会把字符通过 ASCII 码表查询到对应的数字再进行计算。

  • 练习:

 System.out.println(1 + 'a');  // 1 + 97
  
 System.out.println('a' + "abc");  //"aabc"
自增自减运算符
基本用法
符号作用说明
++变量的值加 1
变量的值减 1

注意事项:

++ 和 --即可以放在变量的前面,也可以放在变量的后面。

两种用法:

1、单独使用

++ 和 – 无论是放在变量的前面还是后面,单独写一行 结果是一样的

2、参与计算

  • ++

    • 后 ++,先用后加
 int a = 10;
    int b = a++;
    
    结果:
    a = 11;
    b = 10;
  • 前 ++,先加后用
 int a = 10;
    int b = ++a;
    
    结果:
    a = 11;
    b = 11;
    • 后 --,先用后减
    int a = 12;
    int b = a--;
    
    结果:
    a = 11;
    b = 12;
  • 先 --,先减后用

    int a = 12;
    int b = --a;
    
    结果:
    a = 11;
    b = 11;
    
赋值运算符

分类:

符号作用说明
=赋值int a =10 ; 将10的值赋给a
+=加后赋值a += b , 及 a = a + b;
-=减后赋值a -= b , 及 a = a - b;
*=乘后赋值a *= b , 及 a = a * b;
/=除后赋值a /= b , 及 a = a / b;
%=取余后赋值a %= b , 及 a = a % b;

注意: +=、-=、*=、/= 和 %= ,底层都隐藏了一个强制类型的转换

关系(比较)运算符

关系 / 比较 运算符的分类:

符号说明
==a == b ,判断 a 和 b 的值是否相等,成立为 true, 不成立为 false
!=a != b ,判断 a 和 b 的值是否不相等,成立为 true, 不成立为 false
>a > b ,判断 a 是否大于 b, 成立 true, 不成立 flase
>=a >= b ,判断 a 是否大于等于 b,成立 true, 不成立 flase
<a < b , 判断 a 是否 小于 b , 成立 true, 不成立 flase
<=a <= b , 判断 a 是否 小于等于 b , 成立 true, 不成立 flase

注意事项:

  • 关系运算符的结果都是boolean类型,要么是 true ,要么是 false。
  • 千万不要把 " == " ,误写成 " = "

练习:约会

需求:

你和你的约会对象在餐厅里面正在约会。

键盘录入两个整数,表示你和你约会对象衣服的时髦度。(手动录入 0 ~ 10 之间的整数,不能录入其他)

如果你的时髦程度大于你对象的时髦程度,相亲成功,输出 true。

否则输出 false。

package Just.test;

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        //键盘录入两个整数表示衣服的时髦度
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入我们自己的衣服时髦度:");
        int myFashion = sc.nextInt();
        System.out.println("请输入相亲对象衣服的时髦度:");
        int girlFashion = sc.nextInt();
        //比较结果
        boolean result = myFashion > girlFashion;
        System.out.println(result);
    }
}

运行结果:
请输入我们自己的衣服时髦度:
5
请输入相亲对象衣服的时髦度:
4
true
逻辑运算符

分类:

符号作用说明
&逻辑与(且)并且,两边都为真,结果才是真
|逻辑或或者,两边都为假,结果才是假
^逻辑异或相同为 flase ,不同为 true
!逻辑非取反
package Just.logicoperator;

public class LogicoperatorDemo1 {
    public static void main(String[] args) {
        // & 并且,两边都为真,结果才真
        System.out.println(true & true);//true
        System.out.println(false & false);//flase
        System.out.println(true & false);//flase
        System.out.println(false & true);//flase

        // | 或,两边都为假,结果才是假
        System.out.println(true | true);//true
        System.out.println(false | false);//flase
        System.out.println(true | false);//true
        System.out.println(false | true);//true
        
         // ^ 异或,相同为 false,不同为 true
        System.out.println(true ^ true);//flase
        System.out.println(false ^ false);//flase
        System.out.println(true ^ false);//true
        System.out.println(false ^ true);//true

        // !,逻辑非,取反
        System.out.println(!false);//true
        System.out.println(!true);//flase
        
    }
}
短路逻辑运算符

分类:

符号作用说明
&&短路 与结果和 & 相同,但是有短路效果
||短路 或结果和 | 相同,但是有短路效果
package Just.logicoperator;

public class LogicoperatorDemo3 {
    public static void main(String[] args) {
        //&& 与
        System.out.println(true && true);//true
        System.out.println(false && false);//false
        System.out.println(true && false);//false
        System.out.println(false && true);//false
        System.out.println();

        // || 或
        System.out.println(true || true);//true
        System.out.println(false || false);//false
        System.out.println(true || false);//true
        System.out.println(false || true);//true
        System.out.println();

        //短路逻辑运算符具有短路效果,当左边的表达式能确定最终的结果,那么右边就不会参与运行
        int a = 10;
        int b = 10;
        boolean result = ++a < 5 && ++b < 5;
        System.out.println(result);//false
        System.out.println(a);//11
        System.out.println(b);//10
        System.out.println();
        //
        a = 10;
        b = 10;
        boolean result1 = ++a < 5 & ++b < 5;
        System.out.println(result1);//false
        System.out.println(a);//11
        System.out.println(b);//11

    }
}

注意事项:

  • && : 左边为 false ,右边不管是真是假,整个表达式的结果一定是 false
  • || : 左边为 true ,右边不管是真是假,整个表达式的结果一定是 true
  • 最常用的逻辑运算符:&& , || , !

练习:数字6

需求:

数字6是一个真正伟大的数字,键盘录入两个整数。

如果其中一个为6,最终结果输出 true

如果他们的和为6的倍数。最终结果输出true

其他情况都是false

package Just.test;

import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
        //键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("输入第一个数:");
        int number1 = sc.nextInt();
        System.out.println("输入第二个数:");
        int number2 = sc.nextInt();
        int sum = number1 + number2;
        boolean result = number1==6 || number2==6 || sum % 6==0;
        System.out.println(result);
    }
}


运行结果:
输入第一个数:
3
输入第二个数:
2
false
三元运算符

(三元运算符 / 三元表达式)格式

  • 格式:关系表达式==?表达式1:==表达式2;

范例:求两个数的较大值

int max = a > b ? a : b ;  //结果赋值给变量

System.out.println(a > b ? a : b);  //结果直接打印
package Just.ternaryoperator;

public class TernaryoperatorDemo1 {
    public static void main(String[] args) {
        //定义两个变量
        int number1 = 12;
        int number2 = 15;
        //使用三元运算符获取两个整数中的较大值
        int max = number1 > number2 ? number1 : number2;
        System.out.println(max);
    }
}

**练习:**两只老虎

需求:动物园里有两只老虎,体重分别为通过键盘录入获得,

请用程序实现判断两只老虎的体重是否相同。

package Just.test;

import java.util.Scanner;

public class Test4 {
    public static void main(String[] args) {
        //键盘录入两只老虎的体重
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一只老虎的体重:");
        int weight1 = sc.nextInt();
        System.out.println("请输入第二纸老虎的体重:");
        int weight2 = sc.nextInt();

        //输出结果
        String result = weight1 == weight2 ?"相同" : "不相同";
        System.out.println(result);
    }
}

运行结果:
请输入第一只老虎的体重:
158
请输入第二纸老虎的体重:
149
不相同

**练习:**三个和尚

需求:一座寺庙里住着三个和尚,以知他们的身高

分别为150cm、210cm、165cm,

请用程序实现获取这三个和尚的最高身高

package Just.test;

public class Test5 {
    public static void main(String[] args) {
        //三个和尚的身高
        int height1 = 150;
        int height2 = 210;
        int height3 = 165;
        //获取三个和尚最高身高
        int temp = height2 > height3 ? height2 : height3;
        int result = height1 > temp  ? height1 : temp;
        //输出
        System.out.println("三个和尚的最高身高为:");
        System.out.println(result);
    }
}

运行结果:
三个和尚的最高身高为:
210
运算符的优先级

在这里插入图片描述

注意: ( ) 优先于所有,写代码时,想让谁优先计算,直接用 ( ), 括起来。

原码、反码、补码

**源码:**十进制数据的二进制表现形式 ,最左边是符号位 ,0为正 ,1为负。

**反码:**正数的反码是其本身 ,负数的反码是符号位保持不变 ,其余位取反,0——>1 , 1——>0。

**补码:**正数的补码是其本身,负数的补码是在其反码的基础上 + 1。

bit :比特位,二进制的基本单位;

1 字节 = 8 比特位

判断和循环

流程控制语句
顺序结构

顺寻结构语句是 Java 程序默认的执行流程,按照代码的先后顺序,从上到下依次执行

package Just.orderdemo;

public class OrderDemo {
    public static void main(String[] args) {
        System.out.println("床前明月光");
        System.out.println("疑是地上霜");
        System.out.println("举头望明月");
        System.out.println("低头思故乡");
    }
}

运行结果:
床前明月光
疑是地上霜
举头望明月
低头思故乡
分支结构
If

If 语句表示判断

1、If 语句的第一种格式:

if (关系表达式){

     语句体;
}

执行流程:

  • 首先计算关系表达式的值
  • 如果关系表达式的值为 true ,就执行语句体
  • 如果关系表达式的值为 false ,就不执行语句体
  • 继续执行后面的其他语句

**练习:**老丈人选女婿

需求:键盘录入女婿酒量,如果大于2斤,老丈人给出回应,反之不回应

package Just.ifDemo;

import java.util.Scanner;

public class IfDemo1 {
    public static void main(String[] args) {
        //键盘录入女婿酒量
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入女婿的酒量:");
        int wine = sc.nextInt();
        //对酒量进行判断
        if(wine > 2){
            System.out.println("小伙子,不错呦!!");
        }

    }
}

运行结果:
请输入女婿的酒量:
3
小伙子,不错呦!!

注意事项:

  • 大括号的开头可以另起一行书写,但是建议写在第一行的末尾
  • 在语句体中,如果只有一句代码,大括号可以省略不写。个人建议,大括号还是不要省略
  • 如果对一个布尔类型的变量进行判断,不要用 == 号,直接把变量写在小括号里即可

**练习:**自动驾驶,红灯停,绿灯行,黄灯等

package Just.test;

public class Test2 {
    public static void main(String[] args) {
    //定义灯的状态
    boolean isLightGreen = false;
    boolean isLightYellow = false;
    boolean isLightRed = true;
    //输出车的行为
    if(isLightGreen){
        System.out.println("GoGoGo!!!");
    }
    if(isLightYellow){
            System.out.println("Wait!!!");
    }
    if(isLightRed){
            System.out.println("Stop!!!");
    }

    }
}

运行结果:
Stop!!!

2、If 语句的第二种格式

if (关系表达式){
    语句体1}else{
    语句体2}

执行流程:

  • 首先计算关系表达式的值
  • 如果关系表达式的值为 true 就执行语句体1
  • 如果关系表达式的值为 false 就执行语句体2
  • 继续执行后面的其他语句

**练习:**吃饭

需求:键盘录入一个整数,表示身上的钱。如果大于等于100块,就吃网红餐厅。否则,就吃经济实惠的沙县小吃。

package Just.test;

import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
        //键盘录入身上的钱
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入身上的钱:");
        int money = sc.nextInt();
        if(money > 100){
            System.out.println("吃网红餐厅");
        }
        else{
            System.out.println("吃沙县小吃");
        }
    }
}

运行结果:
请输入身上的钱:
88
吃沙县小吃

**练习:**商品付款

在实际开发中,如果要根据两种不同的情况来执行不同的代码,就需要用到 if 的第二种格式。

需求:

假设,用户在超市实际购买商品总价为:600元。

键盘录入一个整数表示用户实际支付的钱。

如果付款大于等于600,表示付款成功。否则付款失败。

package Just.test;

import java.util.Scanner;

public class Test4 {
    public static void main(String[] args) {
        //键盘录入支付的钱
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入顾客所实际支付的钱:");
        int pay = sc.nextInt();
        if(pay > 600){
            System.out.println("付款成功");
        }
        else{
            System.out.println("付款失败");
        }
    }
}

运行结果:
请输入顾客所实际支付的钱:
666
付款成功

**练习:**影院选座

在实际开发中,电影院选座也会使用到 if 判断。

建设某影院售卖了100张票,票的序号为1~ 100。

其中奇数票号坐左侧,偶数票号坐右侧。

键盘录入一个整数表示电影票的票号。

根据不同情况,给出不同的提示:

如果票号是奇数,那么打印坐左边;

如果票号为偶数,那么打印坐右边。

package Just.test;

import java.util.Scanner;

public class Test5 {
    public static void main(String[] args) {
        //键盘录入票号
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入票号:");
        int member = sc.nextInt();
        //判断票号的真假
        if(member > 0 && member <=100){
            //判断位置
            if(member % 2==0){
                System.out.println("坐右边");
            }
            else{
                System.out.println("坐左边");
            }
        }
        else{
            System.out.println("票号为假");
        }

    }
}

运行结果:
请输入票号:
102
票号为假

请输入票号:
66
坐右边

3、If 语句的第三种格式

if (关系表达式1){
    语句体1}else if(关系表达式2){
    语句体2}
    ...
 else{
    语句体 n + 1;
}

执行流程:

  • 首先计算关系表达式1的值
  • 如果为 true 就执行语句体 1;如果为 false 就计算关系表达式 2的值
  • 如果为 true 就执行语句体 2 ;如果为 false 就计算关系表达式3的值
  • 如果所有关系表达式结果都为 false ,就执行语句体 n + 1

总结:

从上往下依次进行判断

只要有一个判断为真,就执行对应的语句体

如果所有的判断都为假,就执行 else 的语句体

**练习:**小明的礼物

根据不同的分数送不同的礼物。

如果是 95 ~ 100分,送自行车一辆

如果是 90 ~ 94分,送游乐场玩一天

如果是 80 ~ 89分,送变形金刚一个

如果是 80 分及以下,揍一顿。

package Just.test;

import java.util.Scanner;

public class Test6 {
    public static void main(String[] args) {
        //键盘录入小明的成绩
        Scanner sc = new Scanner(System.in);
        System.out.println("输入小明的成绩为:");
        double score = sc.nextDouble();
        if(score > 0 && score <= 100){
            if(score >= 95 && score <= 100){
                System.out.println("送自行车一辆");
            }else if(score >= 90 && score <= 94){
                System.out.println("游乐场玩一天");
            }else if(score >= 80 && score <=89){
                System.out.println("送变形金刚一个");
            }else{
                System.out.println("揍一顿");
            }
        }else{
            System.out.println("录入的成绩不合法");
        }
    }
}

运行结果:
输入小明的成绩为:
88
送变形金刚一个

输入小明的成绩为:
120
录入的成绩不合法

**练习:**商品的价格

在实际开发中,多种情况判断时,会用到 if 的第三种格式:

需求:

商场都会有 VIP 的会员制,根据不同的会员会有不同的折扣

建设商品的总价为1000

键盘录入会员级别,并计算实际支付的钱

会员 1 级:打9折

会员 2 级:打8折

会员 3 级:打7折

非会员:不打折

package Just.test;

import java.util.Scanner;

public class Test7 {
    public static void main(String[] args) {
        //定义变量记录总价
        int price = 1000;
        //键盘录入会员等级
        Scanner sc = new Scanner(System.in);
        System.out.println("输入会员的等级:");
        int grade = sc.nextInt();
            if(grade == 1){
                System.out.println("会员 1 级,打 9 折");
                System.out.println("需要支付: " + price * 0.9);
            }else if(grade == 2){
                System.out.println("会员 2 级,打 8 折");
                System.out.println("需要支付: " + price * 0.8);
            }else if(grade == 3){
                System.out.println("会员 3 级,打 7 折");
                System.out.println("需要支付: " + price * 0.7);
            }else{
                System.out.println("非会员,不打折");
            }        
    }
}

运行结果:
输入会员的等级:
3
会员 3 级,打 7 折
需要支付: 700.0

输入会员的等级:
1
会员 1 级,打 9 折
需要支付: 900.0

输入会员的等级:
5
非会员,不打折
需要支付: 1000

4、总结:

  • if 的第一种格式,适用于一种情况的判断
  • if 的第二种格式,适用于两种情况的判断
  • if 的第三种格式,适用于多种情况的判断
switch

switch 语句格式:

switch(表达式){
    case1:
         语句体1break;
    case2:
         语句体2break;
    case3:
         语句体3break;
    ...
    default:
         语句体 n + 1;
         break;
}

执行过程:

  • 首先计算表达式的值。
  • 依次和 case 后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行过程中,遇到 break 就会结束。
  • 如果所有的 case 后面的值和表达式的值都不配,就会执行 default 里面的语句体,然后结束整个 switch 语句。

格式说明:

  • 表达式 :(将要匹配的值)取值为 byte、short、int、char。JDK5以后可以是枚举,JDK7以后可以是 String.
  • case : 后面跟的是要和表达式进行比较的值(被匹配的值
  • break : 表示中断,结束的意思,用来结束 switch 语句。
  • default : 表示所有情况都不匹配的时候,就执行该处的内容,和 if 语句的 else 相似。
  • case : 后面的值只能是字面量,不能是变量
  • case : 给出的值不允许重复。
package Just.switchdemo;

import java.util.Scanner;

public class SwitchDemo1 {
    public static void main(String[] args) {
        //键盘录入想吃的面
        Scanner sc = new Scanner(System.in);
        System.out.println("输入想吃的面:");
        String noodles = sc.next();//输入字符串型变量
        switch(noodles){
            case "兰州拉面":
                System.out.println("吃兰州拉面");
                break;
            case "武汉热干面":
                System.out.println("吃武汉热干面");
                break;
            case "北京杂酱面":
                System.out.println("吃北京杂酱面");
                break;
            case "陕西油泼面":
                System.out.println("吃陕西油泼面");
                break;
            default:
                System.out.println("吃方便面");
                break;
        }
    }
}

运行结果:
输入想吃的面:
武汉热干面
吃武汉热干面

练习:运动计划

需求:键盘录入星期数,显示今天的减肥活动。

周一:跑步

周二:游泳

周三:慢走

周四:动感单车

周五: 拳击

周六:爬山

周日:好好吃一顿

package Just.test;

import java.util.Scanner;

public class Test9 {
    public static void main(String[] args) {
        //键盘录入星期
        Scanner sc = new Scanner(System.in);
        System.out.println("输入今天的星期数:");
        int number = sc.nextInt();
        switch (number){
            case  1:
                System.out.println("跑步");
                break;
            case  2:
                System.out.println("游泳");
                break;
            case  3:
                System.out.println("漫步");
                break;
            case  4:
                System.out.println("动感单车");
                break;
            case  5:
                System.out.println("拳击");
                break;
            case  6:
                System.out.println("爬山");
                break;
            case  7:
                System.out.println("好好吃一顿");
                break;
            default:
                System.out.println("没有这个星期数");
                break;
        }
    }
}

运行结果:
输入今天的星期数:
3
漫步

输入今天的星期数:
8
没有这个星期数
switch 其他知识点

1、default 的位置和省略

  • 位置:default 不一定是写在最下面的,我们可以写在任意位置。只不过习惯写在最下面
  package Just.switchdemo;
  
  public class SwitchDemo2 {
      public static void main(String[] args) {
          int number = 10;
          switch (number){
              case 1:
                  System.out.println("number 的值为 1");
                  break;
              default:
                  System.out.println("number 的值不是 1,10或者20");
                  break;
              case 10:
                  System.out.println("number 的值为 10");
                  break;
              case 20:
                  System.out.println("number 的值为 20");
                  break;
          }
  
      }
  }
  
  运行的结果:
  number 的值为 10
  • 省略:default 可以省略,语法不会有问题,但是不建议省略。
  package Just.switchdemo;
  
  public class SwitchDemo2 {
      public static void main(String[] args) {
          int number = 1;
          switch (number){
              case 1:
                  System.out.println("number 的值为 1");
                  break;
              case 10:
                  System.out.println("number 的值为 10");
                  break;
              case 20:
                  System.out.println("number 的值为 20");
                  break;
          }
  
      }
  }
  
  运行结果:
  number 的值为 1

2、case 穿透

  • case 穿透:就是语句体中没有写 break 导致的

  • 执行流程:

    首先还是会拿着小括号中表达式的值跟下面每一个 case 进行匹配。

    如果匹配上了,就会执行对应的语句体,如果此时发现了 break ,那么结束整个 switch 语句

    如果没有发现 break ,那么程序会继续执行下一个 case 的语句体,一直遇到 break 或者大括号为止

  • 使用场景:

    如果多个 case 的语句体重复了,那么我们考虑用 case 穿透去简化代码。

package Just.switchdemo;

public class SwitchDemo3 {
    public static void main(String[] args) {
        int number = 10;
        switch (number){
            case 1:
                System.out.println("number 的值为 1");
                break;
            case 10:
                System.out.println("number 的值为 10");
                //break;
            case 20:
                System.out.println("number 的值为 20");
                break;
            default:
                System.out.println("number 的值不是 1,10或者20");
                break;
        }
    }
}

运行结果:
number 的值为 10
number 的值为 20

3、switch新特性

省略

4、switch 和 if 第三种格式各自的使用场景

  • if 的第三种格式:一般用于对范围的判断
  • switch 把有限个数据 一 一 列举出来,让我们任选其一

**练习:**休息日和工作日

需求:键盘录入星期数,输出工作日、休息日。

(1 - 5)工作日,(6 - 7)休息日

package Just.test;

import java.util.Scanner;

public class Test10 {
    public static void main(String[] args) {
        //键盘录入星期数
        Scanner sc = new Scanner(System.in);
        System.out.println("输入星期数:");
        int week = sc.nextInt();
        switch (week){
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                System.out.println("工作日");
                break;
            case 6:
            case 7:
                System.out.println("休息日");
                break;
        }
    }
}

运行结果:
输入星期数:
5
工作日

**练习:**用户选择

在实际开发中,如果我们需要在多种情况下选择其中一个,就可以使用 switch 语句。

当我们拨打了某些服务电话时,一般都会有按键选择。

假设现在我们拨打了一个机票预订电话。

电话中语音提示:

1、机票查询

2、机票预定

3、机票改签

4、退出服务

其他按键也是退出服务。请使用 switch 模拟该业务逻辑。

package Just.test;

import java.util.Scanner;

public class Test11 {
    public static void main(String[] args) {
        //键盘录入我们的选择
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入所选择序号:");
        int chose = sc.nextInt();
        switch(chose){
            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("退出服务");
                break;
        }
    }
}

运行结果:
请输入所选择序号:
2
机票预订

请输入所选择序号:
8
退出服务
循环结构
for循环

格式:

for(初始化;条件判断;条件控制){
    循环体语句;
}

执行流程:

1、执行初始化语句

2、执行条件判断语句,看其结果是 true 还是 false

​ 如果是 false ,循环结束

​ 如果是 true , 执行循环体语句

3、执行条件控制语句

4、回到 2 继续执行条件判断语句

注意:

  • 初始化语句只执行一次
  • 判断语句为 true ,循环继续
  • 判断语句为 false ,循环结束
package Just.loopdemo;

public class ForDemo1 {
    public static void main(String[] args) {
        for(int i = 0 ;i < 5 ;i++){
            System.out.println("HelloWorld");
        }
    }
}

运行结果:
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
package Just.test;

public class Test12 {
    public static void main(String[] args) {
        for(int i = 1;i <= 5;i++){
            System.out.print(i);
        }
        System.out.println();
        for(int i = 1;i <= 5;i++){
            System.out.print(6 - i);
        }
    }
}

运行结果:
12345
54321

**练习:**断线重连

在实际开发中,需要重复执行的代码,会选择循环实现

比如:玩游戏的时候,如果网不好那么会经常断线重连

那么断线重连这个业务逻辑就需要重复执行。

假设现在公司要求,断线重连的业务逻辑最多只写 5 次

请用代码实现:

备注:断线重连的业务逻辑可以用输出语句替代。

package Just.test;

public class Test13 {
    public static void main(String[] args) {
        for(int i = 1;i <= 5;i++){
            System.out.println("第" + i +"次执行断线重连的业务逻辑");
        }
    }
}

运行结果:
第1次执行断线重连的业务逻辑
第2次执行断线重连的业务逻辑
第3次执行断线重连的业务逻辑
第4次执行断线重连的业务逻辑
第5次执行断线重连的业务逻辑

**练习:**求和

需求:在实际开发中,如果要获取一个范围中的每一个数据时,也会用到循环。

比如:求 1 - 5 之间的和

package Just.test;

public class Test14 {
    public static void main(String[] args) {
        int sum = 0;
        for(int i = 1;i <= 50;i++){
            sum = sum + i;
           // System.out.println(sum);
        }
        System.out.println("输出累加的和为:");
        System.out.println(sum);
    }
}

运行结果:
输出累加的和为:
1275

注意:

如果我们把变量定义在循环的里面,那么当前变量只能在本次循环中有效

当本次循环结束之后,变量就会从内存中消失

第二次循环开始的时候,又会重新定义一个新的变量。

**练习:**求和

需求:在实际开发中,如果要获取一个范围中的每一个数据时,会用到循环。

​ 但是此时,大多数情况下,不会获取所有的数据,而是获取其中符合要求的数据。

​ 此时就需要循环和其他语句结合使用了。

比如:求 1 - 100 之间的偶数和

package Just.test;

public class Test15 {
    public static void main(String[] args) {
        int sum = 0;
        for(int i = 1;i <= 100;i++){
            if(i % 2 == 0){
                sum = sum + i;
            }
        }
        System.out.println("输出 1~100之间的偶数和");
        System.out.println(sum);
    }
}

运行结果:
输出 1~100之间的偶数和
2550

**练习:**统计满足条件的数字

需求:键盘录入两个数字,表示一个范围

​ 统计这个范围中。

​ 既能被 3 整除,用能被 5 整除数字有多少个?

package Just.test;

import java.util.Scanner;

public class Test16 {
    public static void main(String[] args) {
        //键盘录入两个数字
        Scanner sc = new Scanner(System.in);
        System.out.println("请录入一个数字表示范围的开始:");
        int start = sc.nextInt();
        System.out.println("请录入一个数字表示范围的结束:");
        int end = sc.nextInt();
        //定义统计变量
        int number = 0;
        for(int i = start;i <=end;i++ ){
            if(i % 3 == 0 && i % 5 == 0 ){
                System.out.print(i + "、");
                number = number + 1;
            }
        }
        System.out.println();
        System.out.println("输出能被3和5同时整除的个数;");
        System.out.println(number);
    }
}

运行结果:
请录入一个数字表示范围的开始:
20
请录入一个数字表示范围的结束:
60
304560、
输出能被35同时整除的个数;
3
while

while 循环的执行流程

初始化语句;
while (条件判断语句){
     循环体语句;
     条件控制语句;
}
循环下面的其他语句

注意:

  • 初始化语句只执行一次
  • 判断语句为 true ,循环继续
  • 判断语句为 false,循环结束
package Just.whiledemo;

public class WhileDemo1 {
    public static void main(String[] args) {
        //打印换行变量
        int number = 0;
        int i = 1;
        while(i <= 100){
            System.out.print(i + "、  " );
            number++;
            //每行10个数字
            if(number % 10 == 0){
                System.out.println();
            }
            i++;
        }
    }
}

运行结果:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
for 和 while 的对比

***相同点:***运行规则都是一样的

for 和 while 的区别:

  • for 循环中:知到循环次数或者循环的范围
  • while 循环:不知道循环的次数和范围,只知道循环的结束条件

**练习:**打印折纸的次数

需求:世界最高峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。

请问,我折叠多少次,可以折成珠穆朗玛峰的高度?

package Just.test;

public class Test17 {
    public static void main(String[] args) {
        //计数器 number
        int number = 0;
        //纸张的初始厚度
        double i = 0.1;
        while(i <= 8844430){
            //折一次,纸张厚度为原来的两倍
            i = i * 2;
            //每折一次,计数器计数加一
            number = number + 1;
        }
        System.out.println("输出纸张折叠的次数: ");
        System.out.println(number);
    }
}

运行结果:
输出纸张折叠的次数: 
27

**练习:**回文数

需求:给你一个整数 x。

​ 如果 x 是一个回文数,打印 true ,否则,返回 false

解释:回文数是指正序(从左到右) 和倒序(从右到左)读都是一样的整数。

例如,121是回文数,而123不是

package Just.test;

public class Test18 {
    public static void main(String[] args) {
        //定义数字
        int x = 12345;
        int temp = x;
        //记录倒过来之后的结果
        int number = 0;
        while (x != 0){
            //从右往左获取每一个数字
            int unit = x % 10;
            //修改一下 x 记录的值
            x = x / 10;
            //把当前获取的数字拼接到最右边
            number = number * 10 + unit;
        }
        System.out.println("12345反过来为;");
        System.out.println(number);
        System.out.println("判断是否为回文数:");
        System.out.println(number == temp);
    }
}

运行结果:
12345反过来为;
54321
判断是否为回文数:
false

**核心思路:**把数字倒过来跟原来的数字进行比较。

**练习:**求商和余数

需求:给定两个整数,被除数和除数(都是正数,且不超过 int 的范围)。

将两数相除,要求不使用乘法、除法和 % 运算符。

得到商和余数。

package Just.test;

import java.util.Scanner;

public class Test19 {
    public static void main(String[] args) {
        //键盘录入被除数和除数
        Scanner sc = new Scanner(System.in);
        System.out.println("键盘录入被除数:");
        int dividend = sc.nextInt();
        System.out.println("键盘录入除数:");
        int divisor = sc.nextInt();
        //记录商和余数
        int discuss = 0;
        int remainder = 0;
        while(dividend >=divisor){
            dividend = dividend - divisor;
            discuss = discuss + 1;
        }
        remainder = dividend;
        System.out.println("输出商为:");
        System.out.println(discuss);
        System.out.println("输出余数为:");
        System.out.println(remainder);
    }
}

键盘录入被除数:
61
键盘录入除数:
15
输出商为:
4
输出余数为:
1
do…while

格式:

初始化语句;
do{
   循环体语句;
   条件控制语句;
}while(条件判断语句)

注意:

  • 限制性后判断
循环高级综合练习
无限循环

**无限循环:**循环一直停不下来

1、for 循环的无限循环

for( ; ; ){
    System.out.println("学习")}

2、while 循环的无限循环

while(true){
     System.out.println("学习")}

3、do…while 循环的无限循环

do{
    System.out.println("学习")}while(true)

**注意:**最常用 while 无限循环

package Just.infiniteloopDemo;

public class InfiniteloopDemo1 {
    public static void main(String[] args) {
        //for 格式的无限循环
        /*for(;;){
            System.out.println("学习");
        }*/
        //while 格式的无限循环
        while(true){
            System.out.println("sb");
        }
    }
}

注意事项:

无限循环的下面不能再写其他代码了,因为循环永远停不下来,那么下面的代码永远都执行不到

跳转控制语句

1、continue 结束本次循环,继续下次循环

**练习:**小老虎吃包子

小老虎吃包子,第三个包子有虫子,跳过。

package Just.infiniteloopDemo;

public class InfiniteloopDemo2 {
    public static void main(String[] args) {
        for(int i = 1;i <= 5;i++){
            if(i == 3){
                //结束本次循环,继续下次循环
                continue;
            }
            System.out.println("小老虎在吃第" + i + "个包子");
        }
    }
}

运行结果:
小老虎在吃第1个包子
小老虎在吃第2个包子
小老虎在吃第4个包子
小老虎在吃第5个包子

2、break结束整个循环

**练习:**小老虎吃包子

小老虎吃包子,吃完第三个就饱了

package Just.infiniteloopDemo;

public class InfiniteloopDemo3 {
    public static void main(String[] args) {
        for(int i = 1;i <= 5;i++){
            System.out.println("小老虎在吃第" + i + "个包子");
            if(i == 3){
                //结束整个循环
                break;
            }
        }
    }
}

运行结果:
小老虎在吃第1个包子
小老虎在吃第2个包子
小老虎在吃第3个包子

3、return

**ruturn 😗*其实跟循环没有什么关系,跟方法有关的,表示 1 结束循环、2 返回结果

​ 如果方法执行到了 return,那么整个方法全部结束,里面的循环也会随之结束了。

**练习:**判断是否存在

需求:定义一个方法判断数组中的某个数是否存在,将结果返回个调用处

import java.util.Scanner;

public class Test7 {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {12,34,56,78,90,58,39,42,93,63,81};
        //输入待判定的数
        Scanner sr = new Scanner(System.in);
        System.out.println("输入待判定的数:");
        int number = sr.nextInt();
        System.out.println(contains(number,arr));
    }
    //定义一个方法,判断数组中的数是否存在,将结果返回给调用处
    public static boolean contains(int number,int[] arr){
        for (int i = 0; i < arr.length; i++) {
            if(number == arr[i]) {
                return true;
            }
        }
        return false;
    }
}

运行结果:
输入待判定的数:
90
true
练习

**练习1:**逢7过

朋友聚会的时候可能会玩一个游戏:逢7过

游戏规则:从任意一个数字开始报数,当你要报的数字是包含 7 或者是 7 的倍数时都要说: 过

需求:使用程序在控制台打印出 1 - 100 之间的满足逢 7 必过规则的数据

package Just.test;

public class Test1 {
    public static void main(String[] args) {
        int number = 0;
        for(int i = 1;i <= 100;i++){
            number++;
            if(i % 7 ==0||i % 10 == 7||i / 10 ==7){
                System.out.print( "过、");
                if(number % 10 == 0){
                    System.out.println();
                }
                continue;
            }
            System.out.print(i + "、");
            if(number % 10 == 0){
                System.out.println();
            }
        }
    }
}

运行结果:
123456、过、8910111213、过、1516、过、181920、
过、2223242526、过、过、293031323334、过、36、过、38394041、过、43444546、过、48、过、505152535455、过、过、5859606162、过、646566、过、6869、过、
过、过、过、过、过、过、过、过、过、80818283、过、8586、过、888990、
过、9293949596、过、过、99100

**练习2:**求平方根

需求:键盘录入一个大于等于 2 的整数 x ,计算并返回 x 的平方根。

结果只保留整数部分,小数部分将被舍去

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        //键盘录入一个大于2的数
        Scanner sc = new Scanner(System.in);
        System.out.println("键盘录入大于 2 的数是:");
        int number = sc.nextInt();
        for(int i = 1;i <= number;i++){
            if(i * i <= number&& (i +1)*(i + 1) > number){
                System.out.println("输出" + number + "平方根的整数部分:");
                System.out.println(i);
            }
        }
    }
}

运行结果:
键盘录入大于 2 的数是:
20
输出20平方根的整数部分:
4
public class Test2 {
    public static void main(String[] args) {
        //键盘录入一个大于2的数
        Scanner sc = new Scanner(System.in);
        System.out.println("键盘录入大于 2 的数是:");
        int number = sc.nextInt();
        for(int i = 1;i <= number;i++){
            if(i * i == number){
                System.out.println("输出" + number + "平方根的整数部分:");
                System.out.println(i);
                break;
            }
            if(i * i > number){
                System.out.println("输出" + number + "平方根的整数部分:");
                System.out.println(i - 1);
                break;
            }
        }
    }
}

运行结果:
键盘录入大于 2 的数是:
20
输出20平方根的整数部分:
4

练习3: 求质数

需求: 键盘录入一个正整数 x ,判断该整数是否为一个质数。

质数,只有 1 和 它本身两个因数的数。

package Just.test;

import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
        //键盘录入一个数
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个整数: ");
        int number = sc.nextInt();
        //定义一个变量,表示标记,标记 number 是否为质数
        //true:是一个质数
        //false:不是一个质数

        //最初认为 number 是一个质数
        boolean flag = true;
        for(int i = 2;i < number;i++) {
            if(number % i == 0){
                flag = false;
                break;
            }
        }
        if(flag){
            System.out.println(number + "是一个质数");
        }else{
            System.out.println(number + "不是一个质数");
        }
    }
}

运行结果:
输入一个整数: 
31
31是一个质数

运行结果:
输入一个整数: 
25
25不是一个质数

优化后的代码:

思路:减少 for 循环的次数, a * b = c , 则 a 和 b 中必有一个数是 小于等于 c 平方根

于是把 for循环中的 i < number 换成 i < number 的平方根,就可以减少 for循环的次数,从而提高效率,达到优化的目的。

**练习:**猜数字小游戏

需求:程序自动生成一个 1 ~ 100之间的随机数字,使用程序实现猜出这个数字是多少?

package Just.test;

import java.util.Random;
import java.util.Scanner;

public class Test4 {
    public static void main(String[] args) {
        //生成一个 1 ~ 100 之间的随机数
        Random r = new Random();
        int number = 1 + r.nextInt(100);
        //键盘录入你所猜的数
        Scanner sc = new Scanner(System.in);
        //无限循环,当未猜中时,一直循环下去,不断猜测
        while (true){
            System.out.println("请输入你要猜的数字:");
            int guessNumber = sc.nextInt();
            if(guessNumber > number){
                System.out.println("大了");
            }else if(guessNumber < number){
                System.out.println("小了");
            }else{
                System.out.println("中了");
                //猜中后,跳出循环
                break;
            }
        }
    }
}

注意事项:

1、生成随机数的代码是不能写在循环的里面,否则每一次都会产生一个新的随机数

2、抽奖机制:保底

​ 加一个计数器,当抽奖未抽中而达到保底次数时,直接输出 “ 抽中 ” ,跳出循环。

public class Test4 {
    public static void main(String[] args) {
        .......
        int count = 0
        while (true){
            ......
            count++;
            ......
            if(count == n){
                System.out.println("中了");
                 break;
            }
            
            /*if(guessNumber > number){
                System.out.println("大了");
            }else if(guessNumber < number){
                System.out.println("小了");
            }else{
                System.out.println("中了");
                //猜中后,跳出循环
                break;
            }*/
        }
    }
}

获取随机数

Java 已经帮我们写好一个类叫 Random , 这个类就可以生成一个随机数。

使用步骤:

1、导包

import java.util.Random;

导包的动作必须出现在定义的上边

2、创建对象

Random r = new Random();

上面这个格式里面,只有 r 是变量名,可以变,其他的都不允许变。

3、生成随机数

int number = r.nextInt(随机数的范围)

上面这个格式里面,number 是变量名,可以变

注意事项:随机数范围

在小括号中书写的是随机数的范围,这个范围是从零开始的,到这个数的 - 1 结束。

口诀:包头不包尾,包左不包右。

用来生成任意数到任意数之间的随机数:

  • 让这个范围头尾都减去一个值,让这个数范围从 0 开始
  • 尾巴 + 1
  • 最终的结果,再加上第一步减去的值

例如:生成 7 ~ 15 之间的随机数

1、- 7,变成 0 ~ 8

2、尾巴 + 1 , 变成 0 ~ 9

3、加上 1、 减去的 7 ,变成 7 + ( 0 ~ 9)

编程实现:

Random r = new Random();
int number = 7 + r.nextInt(9);
System.out.println(number);

数组

数组介绍

**数组:**数组指的是一种容器,可以用来存储同种数据类型的多个值

  • 数组容器在存储数据的时候,需要结合隐式转换考虑。

    例如: int 类型的数组容器可以存储( byte、short、int ) , 不可以存储( boolean、double)

​ 例如: double 类型的数组容器可以存储( byte、short、int、long、float、double )

  • 建议:容器的类型,和存储的数据类型保持一致

数组的定义:

格式一数据类型 [] 数组名 (常用)

​ 范例: int [] array

格式二数据类型 数组名 []

​ 范例: int array []

数组的初始化
数组的静态初始化

初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程

简化格式数据类型 [] 数组名 = {元素1,元素2,元素3,…};

非简化格式:数据类型 [] 数组名 = new 数据类型 [] {元素1,元素2,元素3,…};

  • 范例:int [] array = {11,22,33};
  • 范例:double [] array2 = {11.1, 22.2, 33.3};

注意事项:

1、数组中元素的个数就是数组的长度

2、数组一旦创建完毕,其长度就固定了

package Just.arraydemo;

public class ArrayDemo {
    public static void main(String[] args) {
        //定义数组存储5个学生的年龄
        int[] array1= {12,13,14,16,17};
        //定义数组存储3个学生的姓名
        String[] array2 = {"张三","李四","王五"};
        //定义数组存储4个学生的身高
        double[] array3 = {187.3,178.5,179.5,176.8};
    }
}
数组的地址值和元素访问
数组的地址值

表示数组在内存中的位置

数组元素访问

格式数组名 [索引];

索引:

  • 索引:也叫做下标,角标
  • 索引的特点:从 0 开始,逐个 + 1增长,连续不间断,到数组的长度减一
存储数组元素

格式数组名[索引] = 具体数据/变量;

注意:一旦覆盖之后,原来的数据就不存在了

package Just.arraydemo;

public class ArrayDemo2 {
    public static void main(String[] args) {
        //利用索引对数组的元素进行访问
        int[] arr = {1,2,3,4,5};
        int number = arr[0];
        System.out.println("输出数组中索引0对应的元素:");
        System.out.println(number);
        //获取数组中1索引对应的数据,并直接打印出来
        System.out.println("输出数组中索引1对应的元素:");
        System.out.println(arr[1]);

        //把数据存储到数组当中
        arr[1] = 12;
        System.out.println("输出覆盖后数组中索引1对应的元素:");
        System.out.println(arr[1]);
    }
}

运行结果:
输出数组中索引0对应的元素:
1
输出数组中索引1对应的元素:
2
输出覆盖后数组中索引1对应的元素:
12
数组的遍历

**数组遍历:**将数组中所有内容取出来,取出来之后可以(打印、求和、判断)

**注意:**遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印

在 Java 当中,关于数组的一个长度属性length

调用方式:数组名.length

扩展:

idea 提供的,自动的快速生成数组的遍历方式

数组名.fori

package Just.arraydemo;

public class ArrayDemo4 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        /*for(int i = 0;i < 5;i++){
            System.out.println(arr[i]);
        }*/
        System.out.println("输出正序:");
        for(int i = 0;i < arr.length;i++){
            System.out.print(arr[i]);
        }
        System.out.println();
        System.out.println("输出逆序:");
        for (int i = arr.length - 1; i >= 0; i--) {
            System.out.print(arr[i]);

        }
    }
}

运行结果:
输出正序:
12345
输出逆序:
54321

**练习:**遍历数组并求和

定义一个数组,存储 1,2,3,4,5

遍历数组得到每一个元素,求数据里面所有的数据和

package Just.test;

public class Test5 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        //求数组的和
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum = sum + arr[i];
        }
        System.out.println("输出数组中元素的和为:");
        System.out.println(sum);
    }
}

运行结果:
输出数组中元素的和为:
15

**练习:**统计个数

定义一个数组,存储 1,2,3,4 ,5,6,7,8,9,10

遍历数组得到每一个元素,统计数组里面一共有多少个能被 3 整除的数字

package Just.test;

public class Test6 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        //定义计数器
        int number = 0;
        //循环遍历数组
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] % 3 ==0){
                number++;
            }
        }
        System.out.println("输出数组里面能被3整除的元素个数:");
        System.out.println(number);
}

运行结果:
输出数组里面能被3整除的元素个数:
3

**练习:**变化数据

定义一个数组,存储 1,2,3,4,5,6,7,8,9,10

遍历数组得到每一个元素。

要求:

1、如果是奇数,则将当前数字扩大两倍

2、如果是偶数,则将当前数字变成二分之一

package Just.test;

public class Test7 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        //定义换行计数器
        int cout = 0;
        //循环遍历
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] % 2 == 0){
                System.out.print(arr[i]/2 + "、");
            }else{
                System.out.print(arr[i]*2 + "、");
            }
            cout++;
            if(cout % 5 == 0){
                System.out.println();
            }

        }
    }
}

运行结果:
2162103144185
数组的动态初始化

**动态初始化:**初始化时只指定数组长度,由系统为数组分配初始值。

格式数据类型 [] 数组名 = new 数据类型 [数组长度];

范例:int [] arr = new int [3];

package Just.arraydemo;

public class ArrayDemo3 {
    public static void main(String[] args) {
        //定义一个数组,用来存储班级中50个学生的姓名
        String[] arr = new String[50];
        //添加学生
        arr[0] = "张三";
        arr[1] = "李四";
        //获取
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

运行结果:
张三
李四
null
数组默认初始化值的规律
  • 整数类型:默认初始化值 0
  • 小数类型:默认初始化值 0.0
  • 字符类型:默认初始化值’/u0000’ 也就是 ’ 空格 ’
  • 布尔类型:默认初始化值 false
  • 引用数据类型:默认初始化值 null
静态、动态初始化区别

动态初始化:手动指定数组长度,由系统给出默认初始化值。

  • 明确元素个数,不明确具体数值,推荐使用动态初始化
 举例:使用数组容器来存储键盘录入的5个整数。
  int[] arr = {?,?,?,?,?,?,?};
  int[] arr = new int[5];

静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度。

  • 需求中已经明确要操作的数据,直接静态初始化即可。
 举例:将全班的学生成绩存入数组中 113345
  int[] arr = {11,33,45};

索引越界异常:

原因:访问了不存在的索引

避免:索引范围

最小索引:0

最大索引:数组长度 - 1

练习
求最值

需求:已知数组元素为{33,5,22,44,55}

请找出数组中最大值并打印在控制台

package Just.test;

public class Test8 {
    public static void main(String[] args) {
        //定义数组
        int [] arr = {33,5,22,44,55};
        //定义变量记录最大值,并临时认为arr[0]为数据最大值
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] > max){
                max = arr[i];
            }
        }
        //输出最大值
        System.out.println("输出数组中的最大元素值:");
        System.out.println(max);
    }
}

运行结果:
输出数组中的最大元素值:
55

注意事项:

  • max 的初始值不能默认为 0

  • max 的初始化值一定是数组中的元素

  • 当 max 的初始值为 arr[0] 时,for 循环的 i 可以从 1 开始

遍历数组并求和

**需求:**生成 10 个 1 ~ 100 之间的随机数存入数组。

1)求出所有数据的和

2)求所有数据的平均数

3)统计有多少个数据比平均值小

package Just.test;

import java.util.Random;

public class Test9 {
    public static void main(String[] args) {
        //随机生成 10 个,1 ~ 100 之间的随机数存入数组
        Random r = new Random();
        //定义数组
        int [] arr = new int [10];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = 1 + r.nextInt(100);
        }
        //定义计数器
        int number = 0;
        //输出随机生成的10个数
        System.out.println("输出随机生成的10个数:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "、");
            number++;
            if(number % 5 == 0){
                System.out.println();
            }
        }
        //定义10个数的和的变量
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum = sum + arr[i];
        }
        //输出随机生成的10个数的和
        System.out.println("随机生成的10个数的和:");
        System.out.println(sum);
        System.out.println();
        //定义平均数变量
        double average = (double)sum / arr.length;
        //输出10个数的平均数
        System.out.println("输出10个数的平均数:");
        System.out.println(average);
        //定义计数器
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] < average){
                count++;
            }
        }
        //输出比平均数小的数据个数
        System.out.println("输出比平均数小的数据个数:");
        System.out.println(count);
    }
}

运行结果:
输出随机生成的10个数:
10473662288931933812、
随机生成的10个数的和:
446

输出10个数的平均数:
44.6
输出比平均数小的数据个数:
6
交换数组中的数据

需求:定义一个数组,存入 1,2,3,4,5。按照要求交换索引对应的元素。

交换前:1,2,3,4,5

交换后:5,4,3,2,1

package Just.test;

public class Test10 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {1,2,3,4,5};
        //for循环遍历数组
        System.out.println("交换前:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "、");
        }
        System.out.println();
        //按照要求进行交换
        for (int i = 0,j = arr.length - 1; i < j; i++,j--) {
            int temp;
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //for循环遍历
        System.out.println("交换后:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "、");
        }
    }
}

运行结果:
交换前:
12345、
交换后:
54321
打乱数组中的数据

**需求:**定义一个数组,存入 1 ~ 5。要求打乱数组中的所有数据的顺序。

package Just.test;

import java.util.Random;

public class Test11 {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {1,2,3,4,5};
        //循环遍历数组
        for (int i = 0; i < arr.length; i++) {
            //获取随机索引
            Random r = new Random();
            int randomIndex = r.nextInt(arr.length);
            //定义第三方变量
            int temp = arr[i];
            arr[i] = arr[randomIndex];
            arr[randomIndex] = temp;
        }
        //for循环遍历输出
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "、");
        }
    }
}

运行结果:
2154313452
数组的内存图
Java 内存分配
  • 方法运行时使用的内存,比如 main 方法运行,进入方法栈中执行
  • :存储对象或者数组,new 来创建的,都存储在堆内存
  • 方法区:存储可以运行的 class 文件
  • 本地方法栈:JVM 在使用操作系统功能的时候使用,和我们开发无关
  • 寄存器:给 CPU使用,和我们开发无关
    在这里插入图片描述
    在这里插入图片描述

注意:变量存储的是数值

数组的内存分配

在这里插入图片描述

注意:数组存储的是地址

总结:

  • 只要是 new 出来的一定是在堆里面开辟了一个小空间,而且开辟出的空间是有地址值的
  • 如果 new 了多次,那么在堆里面有多个小空间,每个小空间都有各自的数据
两个数组指向同一个空间的内存图

在这里插入图片描述
**总结:**当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候是修改之后的结果了。

二维数组

二维数组:数组中存数组

二维数组的应用场景:当我们需要把数据分组管理的时候,就需要用到二维数组

二维数组的初始化

1、静态初始化

格式:

数据类型 [][] 数组名 = new 数据类型[][] {{元素1,元素2}{元素1,元素2}}

范例:

int [][] arr = new int[][]{{11,22},{33,44}};

简化格式

数据类型[][] 数组名 = {{元素1,元素2}{元素1,元素2}}

范例:

int[][] arr = {{11,22},{33,44}};
int arr[][] = {{11,22},{33,44}};
package Just.twodimensionarr;

public class TwoDimensionDemo1 {
    public static void main(String[] args) {
        //1、二维数组静态初始化格式
        //数据类型[][] 数组名 = new 数据类型[][] {{元素1,元素2},{元素1,元素2}};
        int [][] arr1 = new int[][] {{1,2,3},{4,5,6,7,8}};
        int [][] arr2 = {{1,2,3},{4,5,6,7,8}};
        //书写二维数组,建议把每一个一维数组单独写成一行
        //注意:每一个一维数组其实是二维数组中的元素,所以每一个一维数组之间需要用" , "隔开。最后一个一维数组后面不需要加逗号
        int [][] arr3 = {
                {1,2,3},
                {4,5,6,7,8}
        };

        //2、获取元素
        /*
        arr[i][j]
        arr:二维数组
        i:二维数组的索引,获取出来的是里面的一维数组
        j:表示一维数组中的索引,获取出来的就是真正的元素
         */
        System.out.println(arr3[0]);//表示获取二维数组中的第一个一维数组(的地址值)

        //arr3[0]:二维数组中的第一个一维数组
        //arr3[0][0]:获取第一个一维数组中的0索引的元素
        System.out.println(arr3[0][0]);

        //arr3[1]:二维数组中的第二个一维数组
        //arr3[1][4]:获取第二个一维数组中的4索引元素
        System.out.println(arr3[1][4]);

        //遍历二维数组
        //方法:先得到一维数组,再遍历一维数组获取元素
        
        //外循环:遍历二维数组,得到里面的每一个一维数组
        for (int i = 0; i < arr3.length; i++) {
            //i:表示二维数组中的每一个索引
            //arr3[i]:表示二维数组中的每一个元素,即一维数组
            
            //内循环:遍历一维数组,得到里面的,每一个元素
            for (int j = 0; j < arr3[i].length; j++) {
                System.out.print(arr3[i][j] + " ");
            }
            //内循环结束后,表示一个一维数组就遍历完毕了,换行
            System.out.println();
        }
    }
}

运行结果:
[I@1d251891
1
8
1 2 3 
4 5 6 7 8 

2、动态初始化

格式:

数据类型 [][] 数组名 = new 数据类型[m][n];

m:表示这个二维数组,可以存放多少个一维数组

n:表示每一个一维数组,可以存放多少个元素

范例:

int [][] arr = new int[2][3];

该数组可以存放2个一维数组,每个一维数组可以存放3个int 类型元素

package Just.twodimensionarr;

public class TwoDimensionDemo2 {
    public static void main(String[] args) {
        //1、利用动态初始化创建创建二维数组
        //3:表示二维数组长度为3,可以装3个一维数组
        //5:表示每一个一维数组的长度都是5,可以装5个 int 类型的元素
        int [][] arr = new int[3][5];

        //给二维数组赋值元素
        arr[0][0] = 10;
        arr[2][4] = 23;
        arr[0][3] = 45;
        arr[1][2] = 21;

        //遍历二维数组
        //外循环:遍历二维数组获取里面的每一个一维数组
        //内循环;遍历一维数组获取每一个元素
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + "、");
            }
            //遍历完一个一维数组后换行
            System.out.println();
        }
    }
}

运行结果:
1000450002100000023
二维数组的内存图

在这里插入图片描述

特殊情况一

自己创建一维数组,一维数组的长度可以不同
在这里插入图片描述

特殊情况二
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

练习:二维数组的练习

某商城每一个季度的营业额如下:单位(万元)

第一季度:22,66,44

第二季度:77,33,88

第三季度:25,45,65

第四季度:11,66,99

要求计算出每一季度的总的营业额和全年的营业额

package Just.twodimensionarr;

public class Test {
    public static void main(String[] args) {
        //定义二维数组
        int[][] arr ={
                {22,66,44},
                {77,33,88},
                {25,45,65},
                {11,66,99}
        };
        int yearSum = 0;
        for (int i = 0; i < arr.length; i++) {
            int sum = getSum(arr[i]);//arr[i]即为 对应一维数组的 数组名
            yearSum = yearSum + sum;
            System.out.println("第" +(i + 1) + "个季度的总营业额为:" + sum);
        }
        System.out.println("四季度总的营业额为:" + yearSum);
    }
    //定义一个方法,用于计算每一个季度的营业额
    public static int getSum(int[] arr){
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum = sum + arr[i];
        }
        return sum;
    }
}

运行结果:
第1个季度的总营业额为:1322个季度的总营业额为:1983个季度的总营业额为:1354个季度的总营业额为:176
四季度总的营业额为:641

注意:

对于任意二维数组:

数据类型 [][] 数组名 = .......

其中对应的一维数组名为:数组名[i]

方法

方法介绍

1、什么是方法?

方法 (method) 是程序中最小执行单元

2、实际开发中,什么时候用到方法?

重复的代码、具有独立功能的代码可以抽取到方法中。

3、实际开发中,方法有什么好处?

  • 可以提高代码的复用性
  • 可以提高代码的可维护性
方法的格式

方法定义

把一些代码打包在一起,该过程称为方法定义

方法的定义格式:

public static 返回值类型  方法名 (参数){
     方法体;
     return 返回值;
}

方法调用

方法定义后不是直接运行的,需要手动调用才能执行,该过程称为方法调用

1、最简单的方法定义和调用

方法 定义

格式:

public static void 方法名(){
     方法体(就是打包起来的代码)}

范例:
public static void playGame(){
     打印语句;
}

方法 调用

格式:

格式:
     方法名();
范例:
     playGame();

注意:****方法必须先定义后调用,否则程序将报错

package Just.methoddemo;

public class MethodDemo1 {
    public static void main(String[] args) {
        //调用方法
        playGame();

    }
    //定义一个方法
    public static void playGame(){
        System.out.println("选人物");
        System.out.println("准备开局");
        System.out.println("对线");
        System.out.println("崩盘");
        System.out.println("骂队友");
        System.out.println("送人头");
        System.out.println("GG");
    }
}

运行结果:
选人物
准备开局
对线
崩盘
骂队友
送人头
GG

练习:展示女朋友的信息

需求:定义一个方法,在方法内部打印你女朋友的所有信息

package Just.methoddemo;

public class MethodDemo2 {
    public static void main(String[] args) {
        //函数调用
        printGFInformation();
    }
    //定义方法
    public static void printGFInformation(){
        System.out.println("鑫鑫");
        System.out.println("萌妹子");
        System.out.println("18岁");
    }
}

运行结果:
鑫鑫
萌妹子
18

练习:人肉计算器

需求:定义一个方法,在方法内部定义两个变量。

​ 求出它们的和并进行打印。

package Just.methoddemo;

public class MethodDemo3 {
    public static void main(String[] args) {
        getSum();
    }
    //定义方法
    public static void getSum(){
        int num1 = 10;
        int num2 = 20;
        //求和
        int result = num1 + num2;
        System.out.println("输出两个数的和:");
        System.out.println(result);
    }
}

运行结果:
输出两个数的和:
30
2、带参数的方法定义和调用

单个参数 定义:

格式:

public static void 方法名 (参数){
     ......
}

范例:
public static void method(int number){
     ......
}

多个参数 定义:

格式:

public static void 方法名(参数1,参数2......){
     ......
}

范例:
public static void getSum(int number1,int number2,......){
     ......
}

带参数方法 调用:

单个参数

单个参数:方法名(参数);

范例1method(10);
范例2method(变量)

多个参数

多个参数:方法名(参数1,参数2......);

范例1getSum(10,20);
范例2getSum(变量1,变量2)

注意:

  • 方法调用时,参数的数量类型必须与方法中定义小括号里面的变量一 一对应,否则程序将报错
package Just.methoddemo;

import java.util.Scanner;

public class MethodDemo4 {
    public static void main(String[] args) {
        //输入需要相加的数
        System.out.println("输入需要相加的数:");
        Scanner sc = new Scanner(System.in);
        int number1 = sc.nextInt();
        int number2 = sc.nextInt();
        System.out.println("输出相加的结果为:");
        getSum(number1,number2);
    }
    //定义求和方法
    public static void getSum(int number1,int number2){
        int result = number1 + number2;
        System.out.println(result);
    }
}

运行结果:
输入需要相加的数:
12
15
输出相加的结果为:
27

形参实参

形参:全称形式参数,是指方法定义中的参数

**实参:**全称实际参数,方法调用中的参数
在这里插入图片描述

注意方法调用时,形参和实参必须一 一对应,否则程序将报错

方法定义小技巧:

1、我要干什么? 方法体

2、我干这件事情需要什么才能完成? 形参

练习:

人肉计算机1

需求:定义一个方法,求长方形的周长,将结果在方法中进行打印。

package Just.test;

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        //键盘录入长方形的长、宽
        Scanner sc = new Scanner(System.in);
        System.out.println("长方形的长为:");
        double length = sc.nextDouble();
        System.out.println("长方形的宽为:");
        double width = sc.nextDouble();
        System.out.println("输出长方形的周长为:");
        getLength(length,width);
    }
    //定义求长方形周长的函数
    public static void getLength(double length,double width){
        double result = (length + width)*2;
        System.out.println(result);
    }
}

运行结果为:
长方形的长为:
12
长方形的宽为:
8
输出长方形的周长为:
40.0

人肉计算机2

需求:定义一个方法,求圆的面积,将结果在方法中进行打印。

package Just.test;

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        //输入圆的半径
        Scanner sc = new Scanner(System.in);
        System.out.println("输入圆的半径:");
        double radius = sc.nextDouble();
        System.out.println("输出圆的面积:");
        getArea(radius);
    }
    //定义函数,求圆的面积 ,半径的平方 * Π
    public static void getArea(double radius){
        double result = radius * radius *3.14;
        System.out.println(result);
    }
}

运行结果:
输入圆的半径:
1
输出圆的面积:
3.14
3、带返回值方法的定义和调用

方法的返回值就是方法运行的最总结果

  • 如果在调用处要根据方法的结果,去编写另外一段代码逻辑
  • 为了在调用处拿到方法的产生结果,就需要定义带有返回值的方法

定义:

格式

public static 返回值类型  方法名(参数){
     方法体;
     return 返回值;
}

范例:
public static int getSum(int a ,int b){
     int c = a + b;
     return c;
}

调用:

(1) 直接调用

方法名(实参)

(2) 赋值调用

返回值类型 变量名 = 方法名(实参);

(3) 输出调用

System.out.println(方法名(实参));

练习:

人肉计算机

需求:定义一个方法,求一家商场每个季度的营业额。

根据方法结果再计算出全年营业额。

package Just.methoddemo;

public class MethodDemo5 {
    public static void main(String[] args) {
        //计算第一季度的营业额
        double sum1 = getSum(12.2,13.4,11.5);
        //计算第二季度的营业额
        double sum2 = getSum(11.2,14.4,12.7);
        //计算第三季度的营业额
        double sum3 = getSum(13.2,10.4,13.5);
        //计算第四季度的营业额
        double sum4 = getSum(12.6,13.4,14.5);
        //计算全年总营业额
        double sum = sum1 + sum2 + sum3 + sum4;
        System.out.println("输出全年的总营业额:");
        System.out.println(sum);
    }
    //定义函数,求每季度的营业额
    public static double getSum(double number1,double number2,double number3){
        double result = number1 + number2 + number3;
        return result;
    }
}

运行结果:
输出全年的总营业额:
153.0

注意:

1、什么时候用到有返回值的方法?

在调用处要根据方法的结果,去编写另外一段代码

练习:

需求:定义方法,比较两个长方形的面积。

package Just.test;

import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
        //输入量长方形的长、宽
        Scanner sr = new Scanner(System.in);
        //输入长方形1的长、宽
        System.out.println("输入长方形1的长、宽");
        double length1 = sr.nextDouble();
        double width1 = sr.nextDouble();
        double area1 = getArea(length1,width1);
        //输入长方形2的长、宽
        System.out.println("输入长方形2的长、宽");
        double length2 = sr.nextDouble();
        double width2 = sr.nextDouble();
        double area2 = getArea(length2,width2);
        System.out.println();
        //输出两长方形的面积
        System.out.println("输出两长方形的面积:");
        System.out.println(area1);
        System.out.println(area2);
        System.out.println();
        //把两长方形的面积进行比较
        System.out.println("输出两长方形中的面积较大者:");
        compareArea(area1,area2);
    }
    //定义方法,计算长方形的面积
    public static double getArea(double length,double width){
        double area = length * width;
        return area;
    }
    //定义方法,比较长方形的面积
    public static  void compareArea(double area1,double area2){
        if(area1 > area2){
            System.out.println("长方形1");
        }else{
            System.out.println("长方形2");
        }
    }
}

运行结果:
输入长方形1的长、宽
2.5
1.2
输入长方形2的长、宽
2.8
0.8

输出两长方形的面积:
3.0
2.2399999999999998

输出两长方形中的面积较大者:
长方形1
4、方法的完整定义格式

带返回值方法定义:

格式

public static 返回值类型 方法名 (参数){
     方法体;
     return 返回值;
}

方法的注意事项:

  • 方法不调用就不执行

  • 方法与方法之间是平级关系,不能互相嵌套定义

  • 方法的编写顺序和执行顺序无关

  • 方法的返回值类型为 void ,表示该方法没有返回值,

    没有返回值的方法可以省略 return 语句不写。

    如果要编写 return ,后面不能跟具体的数据。

  • return 语句下面,不能编写代码,因为永远执行不到,属于无效的代码

方法的重载

方法重载:

  • 在同一个类中,定义了多个同名的方法,这些同名的方法具有同种的功能
  • 每个方法具有不同的参数类型参数个数,这些同名的方法,就构成了重载关系。

**简单记:**同一个类中,方法名相同,参数不同的方法与返回值无关

​ 参数不同:个数不同、类型不同、顺序不同(不建议使用)

Java虚拟机会通过参数的不同来区分同名的方法

**练习:**方法重载

需求:使用方法重载的思想,设计比较两个整数是否相同的方法。

需求:兼容全整数类型(byte ,short ,int ,long)

package Just.test;

public class Test4 {
    public static void main(String[] args) {
        System.out.println("输出两个数中的较大值:");
        compare((long)12,(long)15);
        compare(45,48);
        compare((short)23,(short)43);
        compare((byte)78,(byte)90);
    }
    //定义方法判断两个数的大小
    public static  void compare(long number1,long number2){
        System.out.println("long");
        if(number1 > number2){
            System.out.println(number1);
        }else {
            System.out.println(number2);
        }
    }
    public static  void compare(int number1,int number2){
        System.out.println("int");
        if(number1 > number2){
            System.out.println(number1);
        }else {
            System.out.println(number2);
        }
    }
    public static  void compare(short number1,short number2){
        System.out.println("short");
        if(number1 > number2){
            System.out.println(number1);
        }else {
            System.out.println(number2);
        }
    }
    public static  void compare(byte number1,byte number2){
        System.out.println("byte");
        if(number1 > number2){
            System.out.println(number1);
        }else {
            System.out.println(number2);
        }
    }
}

运行结果:
输出两个数中的较大值:
long
15
int
48
short
43
byte
90

**练习:**数组遍历

需求:设计一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11, 22, 33, 44, 55 ]

package Just.test;

public class Test5 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {11,22,33,44,55};
        System.out.println("打印数组:");
        printArr(arr);
    }
    public static void printArr(int[] arr){
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if(i < arr.length - 1){
                System.out.print(arr[i] + ",");
            }else{
                System.out.print(arr[i]);
            }
        }
        System.out.println("]");
    }
}

运行结果:
打印数组:
[1122334455]

**练习:**数组最大值

需求:设计一个方法求数组的最大值,并将最大值返回

package Just.test;

public class Test6 {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {12,34,56,78,99};
        //输出数组中的最大值
        System.out.println("输出数组中的最大值:");
        System.out.println(getMax(arr));
    }
    //设计函数求数组的最大值,并将最大值返回
    public static int getMax(int[] arr){
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if(max < arr[i]){
                max = arr[i];
            }
        }
        return max;
    }
}

运行结果:
输出数组中的最大值:
99

**练习:**判断是否存在

需求:定义一个方法判断数组中的某个数是否存在,将结果返回个调用处

import java.util.Scanner;

public class Test7 {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {12,34,56,78,90,58,39,42,93,63,81};
        //输入待判定的数
        Scanner sr = new Scanner(System.in);
        System.out.println("输入待判定的数:");
        int number = sr.nextInt();
        System.out.println(contains(number,arr));
    }
    //定义一个方法,判断数组中的数是否存在,将结果返回给调用处
    public static boolean contains(int number,int[] arr){
        for (int i = 0; i < arr.length; i++) {
            if(number == arr[i]) {
                return true;
            }
        }
        return false;
    }
}

运行结果:
输入待判定的数:
90
true

**ruturn 😗*其实跟循环没有什么关系,跟方法有关的,表示 1 结束循环、2 返回结果

​ 如果==方法执行到了 return,那么整个方法全部结束==,里面的循环也会随之结束了。

练习:

需求:定义一个方法 copyOfRange(int[] arr,int from,int to)

功能:将数组 arr 中从索引 from(包含 from) 开始。

​ 到索引 to 结束(不包含 to)的元素复制到数组中,

​ 将新数组返回

package Just.test;

public class Test8 {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {1,2,3,4,5,6,7,8,9};
        int[] newArr = copyOfRange(arr,2, 7) ;
        System.out.println("打印数组:");
        printArr(newArr);

    }
    //定义一个函数,返回数组 int[]
    public static int[] copyOfRange(int[] arr,int from,int to){
        //定义新数组
        int[] newArr = new int[to - from];
        //定义新数组索引
        int index = 0;
        for(int i = from;i < to;i++){
            //通过 for循环把数组arr 中的from到to-1上对应元素直接拷贝到newArr中
            newArr[index] = arr[i];
            index++;
        }
        return newArr;
    }
    //定义一个函数,打印数组
    public static void printArr(int[] arr){
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if(i < arr.length - 1){
                System.out.print(arr[i] + ",");
            }else{
                System.out.print(arr[i]);
            }
        }
        System.out.println("]");
    }
}

运行结果:
打印数组:
[3,4,5,6,7]
方法的内存
1、方法调用的基本内存原理

在这里插入图片描述

注意:方法执行完,回到调用处

栈内存的特点:先进栈的,先出栈

2、方法传递基本数据类型的内存原理

基本数据类型
在这里插入图片描述

举例:
在这里插入图片描述

总结:传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值

形参不影响实际参数

3、方法传递引用数据类型的内存原理

引用数据类型
在这里插入图片描述

举例:
在这里插入图片描述

总结:传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值

形参影响实际参数

4、总结

在这里插入图片描述

面向对象

面向对象介绍:

  • 面向:拿、找
  • 对象:能干活的东西
  • 面向对象的编程:拿东西过来做对应的事情

面向对象的重点学习什么?

1、学习获取已有对象并使用

2、学习如何自己设计对象并使用——>面向对象的语法

设计对象并使用

类和对象

类(设计图):是对象共同特征的描述;

对象: 是真实存在的具体实例

在 Java 中,必须先设计类,才能获得对象。

如何定义类

public class 类名 {

1、成员变量代表属性,一般是名词)只定义,不给值

2、成员方法代表行为,一般是动词)(定义方法时,不要 static)

​ 3、构造器(后面学习)

​ 4、代码块(后面学习)

​ 5、代码块(后面学习)

}

定义一个手机类:

public class Phone{
     //属性(成员变量)
     String brand;
     double price;
     
     //行为(方法)
     public void call(){
     
     }
     public void playGame(){
     
     }
}
如何创建类的对象

类名 对象名 = new 类名( );

举例:定义一个手机对象

Phone p = new Phone();
如何使用对象
  • 访问属性:对象名.成员变量
  • 访问行为:对象名.方法名(…)
package Just.test;

public class PhoneTest {
    public static void main(String[] args) {
        //创建手机的对象   类名 对象名 = new 类名();
        Phone p = new Phone();

        //给手机赋值
        p.brand = "小米";
        p.price = 1999.9;

        //获取手机对象中的值
        System.out.println(p.brand);
        System.out.println(p.price);

        //调用手机中的方法
        p.call();
        p.playGame();

        //创建第二个手机对象
        Phone p2 = new Phone();

        p2.brand = "苹果";
        p2.price = 8999.9;

        System.out.println(p2.brand);
        System.out.println(p2.price);

        p2.call();
        p2.playGame();
    }
}
=================================================
package Just.test;

public class Phone {
    //属性
    String brand;//手机品牌
    double price;//手机价格

    //行为
    public void call(){
        System.out.println("手机在打电话");
    }
    public void playGame(){
        System.out.println("手机在打游戏");
    }
}

运行结果:
小米
1999.9
手机在打电话
手机在打游戏
苹果
8999.9
手机在打电话
手机在打游戏
类的种类及注意事项
类的种类功能举例
Javabean 类用来描述一类事物的类比如,Student, Teacher, Dog, Cat 等
测试类编写 main 方法的类,我们可以在测试类创建 Javabean类对象并进行赋值调用
工具类帮助我们做一些事情的,但是不描述任何事情的类

Javabean 类

格式:

public  class  类名{                                                                                                                                                                    

​         成员变量 (代表属性)

​         成员方法(代表行为)

}

举例:

public class Student {
     //属性(成员变量)
     String name;
     double height;
     //行为(方法)
     public void study{
     
     }
     public void sleep{
     
     }
}
  • 类名首字母建议大写,需要见名知意,驼峰模式

  • 一个 Java 文件可以定义多个 class 类,且只能一个类是 public 修饰,而且 public 修饰的类名必须成为代码文件名。

    实际开发中建议还是一个文件定义一个 class 类

  • 成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;,一般无需指定初始化值,存在默认值。

  • 数据类型明细默认
    基本类型byte、short、int、long0
    基本类型float、double0.0
    基本类型booleanfalse
    引用类型类、接口、数组、Stringnull

工具类

工具类书写规则:

  • 类名见名知意

  • 私有化构造方法

  public class ArrUtil{
      //私有构造方法
      private ArrUtil(){}

构造方法一旦私有,在外界就无法创建这个类的对象。

由于测试类不描述任何事物,所以创建其对象也毫无意义。

  • 方法定义为静态
 public class ArrUtil{
      //私有构造方法
      private ArrUtil(){}
      
      //方法定义为静态
      public static int getMax(...){...}
      public static int getMin(...){...}
      public static int getSum(...){...}
      public static int getAvg(...){...}
  }

练习:女朋友类

编写女朋友类,创建女朋友类的对象

给女朋友的属性赋值并调用女朋友类中的方法。

自己思考,女朋友类中有哪些属性,有哪些行为?

package Just.test1;

public class GirlFriend {
    //属性(成员变量)
    String name;
    int age;
    String gender;
    //行为(方法)
    public void sleep(){
        System.out.println("女朋友在睡觉");
    }
    public void eat(){
        System.out.println("女朋友在吃饭");
    }
}
======================================================
package Just.test1;

public class GirlFriendTest {
    public static void main(String[] args) {
        //创建女朋友的对象
        GirlFriend gf1 = new GirlFriend();
        gf1.name = "鑫鑫";
        gf1.age = 18;
        gf1.gender = "萌妹子";
        System.out.println(gf1.name);
        System.out.println(gf1.age);
        System.out.println(gf1.gender);

        gf1.eat();
        gf1.sleep();

        System.out.println("=================");

        GirlFriend gf2 = new GirlFriend();
        gf2.name = "肉墩";
        gf2.age = 20;
        gf2.gender = "萌妹子";
        System.out.println(gf2.name);
        System.out.println(gf2.age);
        System.out.println(gf2.gender);

        gf2.sleep();
        gf2.eat();

    }
}

运行结果:
鑫鑫
18
萌妹子
女朋友在吃饭
女朋友在睡觉
=================
肉墩
20
萌妹子
女朋友在睡觉
女朋友在吃饭
开发中类的设计

名词提炼法:找属性(成员变量)

1、看有几类事物,每一类事物定义成一个类

2、名词提炼法:找属性(成员变量)

3、操作(行为),定义成方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值