一、计算机概述
计算机简介
第一台通用计算机:ENIAC
计算机的作用:用于数据计算和处理
计算机硬件与软件
计算机硬件
运算器和控制器:CPU(计算机的大脑,计算机系统的运算和控制核心)
输入设备:鼠标、键盘
存储器:硬盘:存储本地数据(永久存储) 内存:临时储存
输出设备:显示器、打印机
计算机软件
系统软件:各种操作系统(Windows操作系统、Linux操作系统、Mac操作系统)
应用软件:QQ、微信
应用软件的架构分类:
C/S:Client/Server 客户端/服务器端(QQ、steam游戏平台):
在用户本地有一个客户端程序,在远程有一个服务器端程序 (这个软件在自己电脑上有一份安装程序,当输入用户名和密码点击登录的时候,他会到服务器端进行校验)
B/S:Browser/Server 浏览器/服务器端(京东、淘宝):
只需要一个浏览器,用户通过不同的网址,客户访问不同的服务器端程序
计算机语言
语言:沟通交流的表达方式
shutdown -s -t 300 :将在5分钟后关闭计算机
计算机语言:人与计算机沟通交流的表达方式
机器语言:就是0/1代码,计算机智能识别0和1
在计算机内部,无论是一部电影还是一首歌曲或是一张图片,最终保存的都是0/1代码
汇编语言:一句话表示要打一串代码很复杂
高级语言:使用普通英语进行编写源代码,通过编译器将源代码编译成计算机直接识别的机器语言,之后再由计算机执行
人机交互
操作计算机的两种方式:
- 图形化界面
- 命令行
DOS命令提示符
如何打开DOS命令提示符?
- 按下Win+R,在运行输入框中,输入cmd,敲回车
- 命令 shutdown -s -t 300 (后面是输入秒的单位):将在5分钟后关闭计算机
- shutdown -a 取消关闭计算机
- 切换盘符:敲D: 然后回车;E: 然后回车
- 查看盘符下有哪些内容 dir
- 进入文件夹里面 cd JavaSE(cd 输入要进入文件夹的名称)(进入单级目录)
- 回到上一级 cd..
- 一次性进入多级目录 cd JavaSE\day01\ppt 然后按回车
- 直接回到根目录,盘符下 cd/
- 清屏 cls
- 退出当前命令提示符窗口 exit
- 练习:启动QQ cd Program Files\Tencent\QQ\Bin 然后输入qq.exe 然后回车
二、Java程序初体验
Java背景介绍
Java三大平台
- Java SE
- Java ME
- Java EE
Java SE:Java 语言的(标准版),用于桌面应用的开发,是其他两个版本的基础版。
学习目的:为今后要从事的Java EE开发,打基础。
Java ME:Java 语言的 (小型版),用于嵌入式消费类电子设备
Java EE:Java语言的(企业版),用于Web方向的网站开发。
网页:通过浏览器将数据展示在用户面前,跟后台服务器没有交互。
网站:通过跟后台服务器的交互,将查询到的真实数据再通过网页展示出来。
简单理解:网站=网页+后台服务器
Java跨平台工作原理
平台与跨平台
1.平台:指的是操作系统
- Windows
- MacOS
- Linux
2.跨平台:Java程序可以在任意操作系统上运行。
跨平台原理
Java不是因为安装在操作系统中,而是因为安装在操作系统中的JVM虚拟机的软件中,所以可以实现跨平台。
注解:问:JVM本身是否可以跨平台?
答:JVM虚拟机本身不允许跨平台,允许跨平台的是Java程序
JRE和JDK
Java程序开发的三个步骤
- 编写代码
A.txt
A.java
JRE:JRE是 Java Runtime Environment 缩写,指Java运行环境,包含了JVM虚拟 机及Java核心类库。
类:Java文件在代码中的集合体现 (暂时理解为是一个单位名词,一个java文件对 应一个类)
类库:存放多个Java文件的仓库
重点理解:我们自己再编写代码的过程中,需要用到Java已经写好的这些Java文件
- 编译代码
A.java .java文件属于【源文件】,是无法被JVM所识别执行的。
解决方式:需要将其编译为JVM可以直接识别并执行
翻译方式:使用Java提供再JDK中的翻译工具
JDK:是Java语言的软件开发工具包,内部包含了JRE,和代码的编译工 具和运行工具。
A.java 使用编译工具,对A.java【源文件】进行编译,编译成功,会自动产生一个对应的 A.class文件【字节码文件】,该文件可以被JVM直接识别并执行。
到
A.class 使用运行工具将A.class运行再JVM虚拟机当中
到
JVM
- 运行代码
JRE、JDK、JVM的作用
1.编写代码的 过程中,需要使用JRE中Java已经写好的代码
2.编写代码的过程中,需要使用JDK中的翻译工具
3.运行代码的过程中,需要使用JDK中的运行工具
4.代码需要运行再JVM当中
JRE、JDK、JVM的关系
JDK的下载和安装
JDK的下载
去Java SE官网 http://www.oracle.com 然后把页面拖动到底部位置找到Java SE14 download
注意:针对不同操作系统,下载对应的JDK
注释:不能安装到带有中文 空格 逗号 这种特殊符号的安装目录下面
HelloWorld程序
新建一个Java文件把代码写到这个文件中,然后用JDK提供的编译工具把源文件编译成虚拟机可识别的.class字节码文件,然后把字节码文件运行在JVM虚拟机当中
- javac.exe是JDK bin目录下的编译工具,这个不能双击,要在命令行当中通过指令进行使用
- 先进入当前目录下
- 错误原因是要把要翻译的文件和翻译工具放在同一个目录下
- 正确展示
- 翻译完自动生成的.class文件
- 翻译完成之后要运行,运行要借助java.exe (也需要在命令行当中借用指令运行)
红框中可以改变,别的地方不能改变
Path 环境变量
- 弊端:代码只能存放在bin目录下,才能使用javac和java工具
Path环境变量作用:能够再任意目录(文件夹路径)下,都能访问到bin目录中的javac和java工具
配置完之后
注释
注释概念
- 注释是在程序指定位置添加的说明性信息
- 简单理解,就是对代码的一种解释
注释分类
- 单行注释 : 格式 ://注释信息
- 多行注释 格式 :/*注释信息*/
- 文档注释 格式 :/**注释信息*/
注意:注释内容不会参与编译和运行
三、IDEA
IDEA中的第一个代码
IDEA项目结构介绍
- project(项目、工程)
- module(模块)
- package(包)
- class(类)
- project中可以创建多个module
- module中可以创建多个package
- package中可以创建多个class
- 这些结构的划分,是为了方便管理类文件的
IDEA中的第一个代码
- 创建Project项目
- 创建Module模块
- 创建class类
- 在类中编写代码
- 完成编译运行
- 调整字体:点击File 点击Settings 搜索Font
快捷键
- 打主方法代码快捷键 psvm 然后回车
- 输出语句快捷键 sout
- Ctrl+D 向下复制一行(把光标放在你想要复制的内一行上就好了)
IDEA的项目和模块操作
IDEA中类文件相关操作
- 新建类文件
对准src右键 选择New 选择Java Class
- 删除类文件
对准类文件右键Delete(彻底删除,不走回收站)
- 修改类文件
对准要修改的类文件右键Refactor(重构) 选择Rename重命名
IDEA中模块相关操作
- 新建模块
点击File 点击Project Strcture 点击Modules 点击+ 点击New Module
Demo是示例的意思
- 删除模块
对准模块右键点击Remove Module(在idea列表中做了一个临时删除,硬盘当中代码还是 被保留下来)
- 修改模块
对着模块名称右键,点击Refactor 选择Rename 选择Rename oudule and directory(不但 改变idea上的显示还会改变硬盘上的文件夹的名的显示)
- 导入模块
点击File 点击Project Strcture 点击Modules 点击+ 点击Import Module 接着一路点击Next
导入进来的代码会报错,点击右上角黄色Setup SDK关联到本地的JDK就好了
IDEA中项目相关操作
- 关闭项目
点击File 点击Close Project
- 打开项目
选择Open or Import
- 修改项目
点击File 点击Project Strcture 点击Project(这个只是表面修改,硬盘文件夹名称没有改变)
同时修改:点击File 点击Close Project 然后在左侧的列表也点差,然后找到硬盘上面的文件 右键修改名称,再重新打开项目
- 新建项目
点击File 点击New 点击Project 点击左下角Empty Project 然后Next 然后指定名字指定路径 (如果是两个斜线,要变成一个斜线)
注释TODO(待完成任务清单)
TODO可以找一下刚才的代码写到哪里了
在注释内容中加上TODO: 在idea左下角有一个TODO标签,点击后会显示所有的标了TODO的类,双击内容会跳转
idea控制台位置调整
以下是放到右上角展示
两个类文件方便看
控制台按钮的使用:如果想进入到方法里面看 以及跳出方法
四、Java基础语法
关键字
- 关键字: 被Java赋予了特定涵义的英文单词
- 在idea中蓝色的单词为关键字
常量
常量:在程序的执行过程中,其值不会发生改变的量(数据)
常量的分类:
字符串常量:被双引号包裹的内容
整数常量:所有整数 10
小数常量:所有小数 12.3
字符常量:被单引号所包裹的内容,内部只能存放单个字符,多一个少一个都不行
布尔常量:true false
如果仅仅只是打印的话,意义不大
会在后面学习的运算符当中进行使用(比如说关系运算符也就是比较)
控制台会输出false
空常量:null (不能直接打印)
下图圈出的HelloWorld运行多次不会改变所以是常量。这个被双引号所包裹的叫字符串常量
案例
进制
进制:指进位制,是人们规定的一种进位方式
表示某一位置上的的数,运算时是逢多少进一位
十进制是逢十进一,二进制就是逢二进一,八进制是逢八进一
常见进制:二进制、八进制、十进制、十六进制
计算机中存储数据的单位:字节
每一个字节,在计算机底层,都是以二进制的形式进行体现的。
不同进制的介绍
十进制运算规则:逢十进一,借一当十
二进制介绍:二进制数据是用0和1两个数码来表示。例如:0101000。进位规则是“逢二进一”,借位规则是“借一当二”
八进制介绍:采用0,1,2,3,4,5,6,7,八个数字,逢八进1
十六进制介绍:用数字0到9和字母A到F(或a~f)表示,其中:a~f表示10~15,这些称作十六进制
【0】 【1】【2】【3】【4】【5】【6】【7】【8】【9】【a】【b】【c】【d】【e】【f】
进制转换
- 二进制到十进制的转换
- 公式:系数*技术的权次幂 相加
- 系数:每一【位】上的数
- 基数:几进制,就是几
- 权:从数值的右侧,以0开始,逐个+1增加
0+0+4=4 所以二进制100的十进制表示方式就是4
还有一个方法:电脑计算器选择程序员 DEC:十进制
OCT:八进制
BIN:二进制
HEX:十六进制
运算过程
- 一个字节由8个二进制位组成 例 0:0000 0000
例:15+16真实运算
15转换二进制 0000 1111
16转换二进制 0001 0000
相加得 31:0001 1111
不同进制的书写格式
- 十进制:Java中,数值默认都是10进制,不需要加任何修饰
- 二进制:数值前面以0b开头,b大小写都可以
- 八进制:数值前面以0开头
- 十六进制:数值前面以0x开头,x大小写都可以
注意:以上内容是jdk7版本之后才被支持
例:
变量
为什么要有变量?
变量就是内存中的存储空间,空间中存储着经常发生改变的(数据)
变量的定义格式
- 数据类型 变量名 = 数据值
- 数据类型:为空间中存储的数据,加入类型【限制】整数?小数?....
- 变量名:自己要为空间起的名字,没有难度
- 数据值:空间中要存储的数值,没有难度
变量的使用
变量名前面没有类型,是对原变量的使用,进行修改
Debug工具
- Debug:是供程序员使用的程序调试工具。它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。(另外的代码运行方式)
- Debug调试,又称为断点调试,断点其实是一个标记,告诉Debug从标记的地方开始查看。
Variables:程序目前已经创建了哪些变量,以及变量当前记录的数据
Console:可以看到打印的数据,也就是控制台
这个红框框是指强制停止正在运行的Debug
- 加断点
- 运行加了断点的程序
- 批量删除Debug
变量的注意事项
- 变量名不允许重复
以上代码改写除了把变量名改变外,还可以把数据类型删除 num=20;
- 一条语句可以定义多个变量 中间需要使用逗号分隔
- 变量在使用之前,一定要进行赋值
- 变量的作用域范围
标识符
标识符:就是给类,方法,变量等起名字的符号。
标识符的命名规则
- 由数字、字母、下划线(_)和美元符($)组成
- 不能以数字开头
- 不能是关键字
- 区分大小写
标识符命名规范
小驼峰命名法:方法、变量
- 规范1:标识符是一个单词的时候,首字母小写
- 范例1:name
- 规范2:标识符由多个单词组成的时候,第一个单词首字母小写,其他单词首字母大写。
- 范例2:firstName
大驼峰命名法:类
- 规范1:标识符是一个单词的时候,首字母大写
- 范例1:Student
- 规范2:标识符由多个单词组成的时候,每个单词的首字母大写
- 范例2:GoodStudent
数据类型
注意:在定义long类型变量的时候,需要加入L的标识(大小写都可以,建议大写)
在定义float类型变量的时候,需要加入F的标识(大小写都可以)
不同基本数据类型变量的定义和使用
- 使用思路:
整数类型变量:首选int
小数类型变量:首选double
long类型变量:需要加入L标识(大小写都可以)
float类型变量:需要加入F标识(大小写都可以)
字符串类型变量的定义使用:String (字符串类型不属于基本类型)
案例:
键盘录入
Scanner 键盘录入
- 实现键盘录入的三个步骤
1. 找到Scanner
2.召唤出Scanner,赋予名称为sc
3.指挥sc键盘录入,并定义变量接收数据
例子:
五、运算符
算术运算符
运算符和表达式
- 运算符:对常量或者变量进行操作的符号
- 表达式:用运算符把常量或者变量连接起来符合java语法的句子就可以称为表达式。 不同运算符连接的表达式体现的是不同类型的表达式。
- 举例说明:
int a = 10;
int b = 20;
int c = a+b;
+:是运算符,并且是算术运算符
a+b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式
例子:
案例:数值拆分
字符串的“+”操作
当“+”操作中出现字符串时,这个“+”是字符串连接符,而不是算术运算。
- 例:“itheima” + 666
当连续进行“+”操作时,从左到右逐个执行。
- 例:1 + 99 + “年黑马” =100 + “年黑马”
代码展示:
学会字符串的“+”操作后,案例代码改进
Package相关操作
通过Package来管理类文件代码
- 新建包:对准src右键
- 包的命名时公司的网址倒着写
- 改变包的层级划分
- 操作完成后就会有一个层级展示了
- 对准itheima创建其他的包,一般是在它下面创建其他的包进行管理
自增自减运算符
自增自减运算符:
++ :变量的值自身加一
-- :变量的值自身减一
单独使用(最常见用法):
符号在前在后,没有区别
参与运算使用:
++在前:变量先完成自增长,然后再参与运算
++在后:会先将该变量原本记录的值,提取出来参与运算,然后变量再进行自增长
注意事项:自增自减运算符只能操作变量,不能操作常量。
例子:
单独使用:
参与运算:
++在前:
++在后:
操作常量 代码报错:
类型转换
分类:
- 隐式转换
把一个取值范围小的数值或者变量,赋值给另一个取值范围大的变量
范例:
int a = 10;
double b = a;
最后结果是10.0 这个数值由10变为10.0,这就是转换过程,又因为这个转换过程并不是 明面上的,是内部自己完成的,所以称之为隐式转换。
int是4个字节,double是8个字节。a赋值给b就相当于一个4升的油放入8升的桶中,可以。
运算中的隐式转换
1> 取值范围小的数据,和取值范围大的数据进行运算,小的会先提升为大的之后,再进行运算
2> byte short char三种数据在运算的时候,都会提升为int,然后再进行运算
这个char a在ASCII数码表中代表97 所以1+97=98
练习:
- 强制转换
- 把一个取值范围大的数值或者变量,赋值给另一个取值范围小的变量,不允许直接赋值, 需要加入强制转换
- 格式:目标数据类型 变量名 = (目标数据类型)被强转的数据
- 注意:强转有可能会出现精度的损失。
范例:
double a = 12.3;
int b = (int) a;
大的往小的里面放会造成溢出来,也就是精度缺失,小数点后面都要砍掉。
因为123在int取值范围内,所以不存在精度损失
强制转换细节补充
-126的运算:
- 原码
数据的二进制体现形式,一个字节由8个二进制位组成
高位:二进制数据中,最左侧的数据,通过高位代表符号位
0代表正数
1代表负数
其余位,表示数值大小
弊端:遇到负数运算,可能会出现错误
计算机在运算的时候,都是以二进制补码的形式在运算
- 反码
正数的反码与其原码相同
负数的反码是对其原码逐位取反,但符号位除外。
- 补码
正数的补码与其原码相同
负数的补码是在其反码的末位加1
再次印证了计算机在运算的时候,都是以二进制补码的形式在运算
赋值运算符
基本赋值运算符:
= :将符号右侧的数据,赋值给左侧的变量
扩展赋值运算符:(自带强转效果)
+= :将符号左右两边的数据,做加法运算,再将结果赋值给左边
-= :将符号左右两边的数据,做减法运算,再将结果赋值给左边
*= :略
/= :略
%= :略
原先的:
运用扩展运算符(自带强转效果):
关系运算符
逻辑运算符
在数学中,一个数据x,大于5,小于15,我们可以这样来进行表示:5<x<15
再Java中,需要把上面的式子先进行拆解,再进行合并表达。
- 拆解为:x>5和x<15
- 合并后:x>5&x<15
逻辑运算符,是用来连接关系表达式的运算符。
逻辑运算符也可以直接连接布尔类型的常量或者变量。
逻辑运算符:用于【整合】多个关系式,成为一个逻辑条件
- 连接多个关系表达式
- 连接true或false
最终得到的结果都是boolean类型的true或false
逻辑运算符分类 :
&(与):并且,遇到false则false,只有符号左右两边同时为true,结果才是true。
|(或):或者,遇true则true,只有符号左右两边同时为false,结果才是false。
!(非):取反
^(异或):相同为false,不同为true
例子:
短路逻辑运算符
& 和 && 的区别
&:没有短路效果,无论左边是true还是false,右边都要继续执行
&&:具有短路效果,当符号左边为false,右边就不执行了
如果符号左边为true的话,右边还要继续执行
例子&:
例子&&:
| 和|| 的区别:
| :无论左边true false,右边都要执行
|| :如果左边为false,右边执行;如果左边为true,右边不执行
三元运算符
- 格式: 关系表达式 ? 值1 :值2;
执行流程:
首先计算关系表达式的值
如果值为true,值1就是运算结果
如果值为false,值2就是运算结果
案例:求三个整数的最大值
需求:键盘录入三个整数,找出最大值并打印在控制台。
分析:
1.使用Scanner键盘录入三个整数
int num1 = sc.nextInt();
int num2 = sc.nextInt();
int num3 = sc.nextInt();
2.用三元运算符获取前两个整数的最大值,并用临时变量保存起来
num1 > num2 ? num1 : num2;
3.用三元运算符,让临时最大值,和第三个整数,进行比较,并记录结果
temp > num3 ? temp : num3;
4.输出结果
案例:求三个整数的最小值
运算符优先级
六、分支语句
1.流程控制
流程控制语句:通过一些语句,来控制程序的【执行】流程
流程控制语句分类:
- 顺序结构
- 分支结构 (if 、switch)
- 循环结构(for、while、do...while)
顺序结构
顺序结构是Java程序默认的执行流程,没有特定的语法结构,按照代码的先后顺序,依次执行。
程序中大多数的代码都是这样执行的。
2.if语句
if语句格式1
执行流程:
- 首先计算关系表达式的值
- 如果关系表达式的值为true就执行语句体
- 如果关系表达式的值为false就不执行语句体
- 继续执行后面的语句内容
if语句的注意事项:
- if语句中,如果大括号控制的是一条语句,大括号可以省略不写(不建议)
- if语句的( )和{ }之间不要写分号
true:
false:
if语句格式2
- 首先计算关系表达式的值
- 如果关系表达式的值为true就执行语句体1
- 如果关系表达式的值为false就执行语句体2
- 继续执行后面的语句内容
if语句格式3
执行流程:
- 首先计算判断条件1的值
- 如果值为true就执行语句体1;如果值为false就计算判断条件2的值
- 向下计算如果值为true就执行语句体2;如果值为false就计算判断条件3的值
- ......
- 如果没有任何判断条件为true,就执行语句体n+1
案例:考试奖励
需求:小明快要考试了,小明爸爸对他说,会根据不同的考试成绩,送他不同的礼物,假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
分析:
1.键盘录入考试成绩
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
2.由于奖励种类较多,属于多种判断,采用if....else....if格式实现
if( ){
}else if( ){
}else if( ){
}else{
}
3.为每中判断设置对应的条件
if(score >= 95 && score <= 100){
}else if(score >= 90 && score <= 94){
}else if(score >=80 && score<=89){
}else{
}
4.为每种判断设置对应的奖励
System.out.printIn("山地自行车一辆");
System.out.printIn("游乐场玩一次");
System.out.printIn("变形金刚玩具一个");
System.out.printIn("胖揍一顿");
if语句的嵌套写法:
怎样写(有逻辑)
3.switch语句
switch语句格式和说明
格式说明:
- 表达式:(将要匹配的值)取值为byte、short、int、char,JDK5以后可以是枚举,JDK7以后可以是String(字符串) 这几个是小括号里面填写的类型
- case:后面跟的是要和表达式进行比较的值(被匹配的值)
- break:表示中断,结束的意思,用来结束switch语句
- default:表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似
执行流程:
- 拿着表达式的值,依次和case后面的值进行匹配,匹配成功,就会执行对应的语句,在执行的过程中,遇到break就会结束。
- 如果所有的case都不匹配,就会执行default里面的语句体,然后程序结束掉。
建议:
- 如果要进行的判断,是范围性的判断,建议使用if
- 如果要进行的判断,是固定值的匹配,建议使用switch
switch语句注意事项:
- case后面的值只能是常量,不能是变量。
- case后面给出的值,不允许重复。
七、面向对象基础
1.类和对象
四句代码出窗体
- 窗体绘制
面向对象思想
所谓的对象指的就是客观存在的具体事务
例:我是一名学生,今天学习了窗体,很开心一会用洗衣机庆祝一下
洗衣机能干的:
- 洗衣服
- 甩干
- 烘干
学生:
- 吃饭
- 睡觉
- 学习
窗体:
- 展示窗体
- 设置宽高
- 最小化、最大化、关闭
所以所谓的面向对象思想就是将我们生活中客观存在的事物通过代码的形式将其描述为对象,然后等我们再看到这些对象的时候就能联想到他应该具有xx功能
类的组成
想通过Java代码描述生活事物是通过类的形式,也就是class
格式:public class 类名{ }
例如:
学生:public class Student{ }
老师:public class Teacher{ }
窗体:public class JFrame{ }
类的组成:属性和行为
带有主方法的类叫做测试类
- 属性:在类中通过成员变量来体现
- 行为:在类中通过成员方法来体现
类和对象的关系
- 类:是对事物的一种描述,可以将类理解为一张设计图
- 对象:真实存在的事物
根据设计图,可以创建出具体存在的事物
根据类去创建对象,一个类可以创建出多个对象
2.成员变量
对象的创建和使用
代码改进:通过一条输出语句打印
类的定义
注意:
- 打印对象名的时候,会出现对象在内存中的地址值。
例: com.itheima.demo1.Student@b4c966a (这一串是十六进制)
- 成员变量就算没有赋值,也可以直接使用,但使用的是默认初始化值。
以下各种类型的初始化值:
整数:0
小数:0.0
布尔:false
字符:'\u0000' 空白字符
引用类型:null (比如字符串类型)
- 引用数据类型:引用、记录了一份地址值的变量。该变量所对应的数据类型就是引用数据类型(类、数组、接口) (比如上面代码的Student就是引用数据类型)
成员变量和局部变量的区别
类中位置不同:成员变量在方法外
局部变量在方法中
3.成员方法
成员方法的定义格式
- 格式:
- 范例:
成员方法调用格式:
- 格式:
- 范例:
- 方法必须先创建才可以使用,该过程称为方法定义
- 方法创建后并不是直接运行的,需要手动使用后才执行,该过程称为方法调用
方法的作用
- 提高代码的复用性
如果不调用方法需要手动写三遍才能看到控制台上的效果,很麻烦,
- 提高代码的可阅读性
将来哪里有问题锁定这个方法查看就好了
方法的注意事项
- 方法不调用就不执行
- 方法与方法之间是平级关系,不能嵌套定义
- 方法的定义顺序和执行顺序无关(执行顺序看调用顺序)
方法的调用过程
Java内存模型
- 堆 堆内存 保存程序运行时产生的对象
- 栈 当方法被调用执行的时候,会进入栈内存的空间当中 保存程序运行时所有方法执行状态 (把栈内存可以理解为弹匣,方法就是一颗颗子弹,当方法被调用执行的时候就是一颗子弹进入弹匣,当方法运行结束的时候,这颗子弹就会从弹匣中被打出去)
- 方法区 存放方法 方法没被调用的时候在这个内存中处于候命状态,等待被调用
- 本地方法栈
- 寄存器
方法调用过程
主方法是被虚拟机调用的
案例:手机类
需求:定义一个手机类,定义一个手机测试类,在手机测试类中通过对象完成成员变量和成员方法的使用。
分析:
属性:品牌,价格...
行为:打电话,发短信...
思路:
- 定义一个手机类,编写成员变量和成员方法
- 定义手机测试类,提供用于测试的main方法
- 在手机测试类中创建对象并使用成员
带参数的方法
- 格式:
- 范例:
如果定义多个:
- 格式:
- 范例:
注意:
- 方法定义时,参数中的数据类型与变量名都不能缺少,缺少任何一个程序都将报错
- 方法定义时,多个参数之间使用逗号(,)分隔
带参数方法的调用格式
- 格式:
- 范例:
如果是多个:
- 格式:
- 范例:
注意:
- 方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错 (意思是在方法编写的时候,方法的变量是一个字符串类型,那么就必须传入一个字符串,不能传int、byte、double传得类型不匹配就会报出错误)
代码展示:
形参和实参
形参:全程形式参数,是指在定义方法时,所声明的参数。
方法写好了却没有人调用这个方法,这里的变量就记录不到真实的数据,所以现在就只是形式上的数据,所以叫形式参数。
实参:全称实际参数,调用方法时,所传入的参数。
因为调用方法时我们所传入的数据是真实要做运算的数据,它就是实际参数。
注意:
- 方法调用时,形参和实参的数量和类型必须相匹配,否则将出现编译错误。
带参数方法调用过程
- 方法中的形参在内存来讲,其实就是变量而已
为什么要有带返回值的方法
我们经常会根据一个方法产出的结果,来去组织另一段代码逻辑,为了拿到这个方法产生的结果,就需要定义带有返回值的方法。
带返回值方法的定义格式
- 格式:
- 范例:
代码展示:
带有返回值方法的调用格式
- 格式:
- 范例:
带返回值方法的调用过程
return关键字会把结果返还给调用者p.add(10,20);这个位置,使用一个变量result把这个结果记录下来,result记录下来后会打印result,控制台会看到这个结果。
方法的通用格式
- 格式:
- 定义方法时,要做到两个明确
明确参数:主要是明确参数的类型和数量
(要去思考这个方法当中所使用的数据是固定写死即可,还是要更加的灵活。要灵活的话 就定义参数,如果说所使用的数据是不变的,就不用定义参数,空着就行。)
明确返回值类型:主要是明确方法操作完毕之后是否有结果数据,如果有,写对应的数 据类型,如果没有,写void。
(没有结果,就写void。如果方法的返回值类型写的是void就表示这个方法没有返回值)
- 调用方法时
void类型的方法,直接调用即可
非void类型的方法,推荐用变量接收调用
方法注意事项
- 方法不调用就不执行
- 方法与方法之间是平级关系,不能嵌套定义
- 方法的编写顺序和执行顺序无关
- 方法的返回值类型为void,就表示该方法没有返回值,没有返回值的方法可以省略return语句不写。如果要编写return,后面不能跟具体的数据
- return语句下面,不能编写代码,因为永远执行不到,属于无效的代码
4.面向对象应用
回看窗体代码就很简单了
实现过程
- 窗体绘制
- 这两句代码会使窗体居中,使窗体置顶,并且如果窗体运行时有其他软件运行会使窗体压在其它软件上面。
改进代码:
5.方法加强
方法中调用成员变量
- 当局部变量和成员变量出现了重名的情况,Java使用的是就近原则
- 如果非要使用成员变量就加一个this.
- 如果不涉及重名的话就不用加this. 系统会默认加上
this关键字
介绍:this代表当前类的对象的引用(引用指的是地址 )
哪一个对象调用的this,this就代表哪一个对象。
this可以调用到本类的成员变量,可以调用到本类的成员方法
作用:用于区分局部变量和成员变量的重名问题
代码理解:
this内存图
方法中调用成员方法
- 方法之间是允许相互调用的
- this可以用于调用本类的成员变量和成员方法
- 调用成员变量:如果跟局部变量没有重名,this可以省略
- 调用成员方法:this可以直接省略
权限修饰符
- 权限修饰符:
- private:被修饰的成员只能在本类当中进行访问(最小的一个权限)
- (defalut):(默认的权限修饰符)可以在同一个类中进行访问,也可以在同一个包中进行访问
- protected:
- public :(权限最大可以在任意地方访问)同一个类,同一个包,不同包都可以访问
方法重载
需求:在手机类中,提供4个计算方法,方法功能如下
1.计算两个整数相加的和
2.计算两个小数相加的和
3.计算三个整数相加的和
4.计算三个小数相加的和
改进代码:
所以说方法重载定义:
- 在同一个类中,定义了多个同名的方法,但每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系。
-
简单记:同一个类中,方法名相同,参数不同的方法就是重载。
参数不同:个数不同、类型不同、顺序不同
注意:识别方法之间是否是重载关系,只看方法名和参数,跟返回值无关。
代码例子展示:
方法重载的好处
- 不用记忆过多繁琐的方法名字
构造方法概述
构建、创造对象的时候,所调用的方法
格式:
- 方法名相同,大小也要一致
- 没有返回值类型,连void都没有
- 没有具体的返回值(不能由return带回结果数据)
这个是构造方法的意思
在创建对象的时候一定会走构造方法。
构造方法的执行时机:
在创建对象的时候,由系统自动调用执行。
每创建一次对象,就会执行一次构造方法。
不能手动调用构造方法。
构造方法作用
作用:用于给对象的数据(成员变量)进行初始化 (创建对象的时候直接给成员变量赋值)
最重要的作用就是创建对象
构造方法的注意事项
1.构造方法的创建
- 如果没有定义构造方法,系统将给出一个默认的无参数构造方法
- 如果定义了构造方法,系统将不再提供默认的构造方法
2.构造方法的重载
- 构造方法也是方法,允许重载关系出现
3.推荐的使用方式
- 无参数构造方法,和带参数构造方法,都自己手动给出
构造方法的的执行流程
封装
- 面向对象三大特征之一(封装,继承,多态)
- 隐藏实现细节,仅对外暴露公共的访问方式
- 将代码抽取到方法中,这是对功能的一种封装