[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b2gPyAnt-1676810001349)(./assets/%E7%8E%84%E5%AD%90Share%E4%B8%89%E7%89%88.jpg)]
前言:
此文为玄子,复习BCSP一二期后整理的文章,文中对知识点的解释仅为个人理解,源码均可直接复制运行
配套PPT,站点源码,等学习资料请加文章封面联系方式
Java 是 Sun Microsystems 于1995年推出的高级编程语言
詹姆斯·高斯林(James Gosling)是一名软件专家,1955年5月19日出生于加拿大,Java编程语言的共同创始人之一,一般公认他为Java之父
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zCAFcG6d-1676810001353)(./assets/java.jpg)]
跨平台是Java
语言的核心优势,赶上最初互联网的发展,并随着互联网的发展而发展,建立了强大的生态体系,目前已经覆盖 IT 各行业的第一大语言
,是计算机界的英语
JavaSE(Java Standard Edition):标准版,定位在个人计算机上的应用
JavaEE(Java Enterprise Edition):企业版,定位在服务器端的应用
JavaME(Java Micro Edition):微型版,定位在消费性电子产品的应用上
计算机高级语言的类型主要有编译型和解释型两种,而Java 语言是两种类型的结合
Java Virtual Machine (JVM) :用于执行字节码的”虚拟计算机”。不同的操作系统有不同版本 JVM,屏蔽了底层运行平台的差别,是实现跨平台的核心。
Java Runtime Environment (JRE) 包含:Java 虚拟机、库函数等。
Java Development Kit (JDK)包含:JRE,编译器和调试器等。
ORACLE官网
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dSZ5LIQ6-1676810001354)(./assets/202212221415811.png)]
下滑找到 Windows x64 安装程序,点击后方链接下载安装包。
按照图中指引一直下一步就可以了
!!!中间可以更改安装位置,但不建议更改,为了方便后期配置环境变量。
右键此电脑属性
高级系统设置
点击右下角环境变量
新建环境变量
变量名:
JAVA_HOME
变量值:java JDK 安装路径
默认为:
C:\Program Files\Java\jdk1.8.0_341
设置完成后点击确定
再次点击新建
变量名:
CLASSPATH
变量值:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
!!!变量值是固定的,注意变量值开头为英文字符点
.
下滑找到Path
双击变量值进入设置
然后点击右上角新建,值为 JDK 安装的bin
目录
默认为:
C:\Program Files\Java\jdk1.8.0_341\bin
!!!请注意这个值和 JAVA_HOME 是不一样的,要进入到
bin
目录的路径后在复制
然后继续添加两条变量
变量固定分别为:
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
这里直接点击编辑本文,在变量尾部一次添加完效果是一样的
变量值:
C:\Program Files\Java\jdk1.8.0_341\bin;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
键盘按下Win + R
输入cmd
后按回车
在窗体输入:
Java -version
!!!java 后面有一个空格
显示 java version “1.8.0_341” 即为环境变量配置成功
后面的1.8.0_341
就是所安装 java 的 JDK 版本
恭喜你!到这里 JDK 的下载、安装、配置环境变量就已经全部完成了
在桌面上右键新建文本文档
将新建的文本文档更名为ChangeTheWorld
如果你新建的文本文档没有显示.txt
后缀的话需要在文件资源管理器中设置显示
鼠标双击打开文本文档输入以下代码
public class ChangeTheWorld {
public static void main(String[] args) {
System.out.println("Change The World!");
}
}
class 后面的代码要和文件名一致
!!!全文都是在英文输入法下编写
将文件名后缀修改为.java
例如:ChangeTheWorld.java
将修改后的 Java 文件复制到任意磁盘根目录
点击文件地址栏输入cmd
回车
分别输入javac
和java
代码执行编译,下面显示的Change The World
即为我们编写的 Java 输出语句所输出的代码
javac ChangeTheWorld.java
java ChangeTheWorld
javac 后面跟文件全名,需要带
.java
后缀java 后直接写文件名即可
到这里你已经可以独立编写,编译 Java 代码了,后面我们会在学习一些计算基础知识
熟练的使用电脑快捷键,可以让我们的工作效率事半功倍
按键 | 说明 |
---|---|
Ctrl + C | 复制 |
Ctrl + V | 粘贴 |
Ctrl + A | 全选 |
Ctrl + X | 剪切 |
Ctrl + Z | 撤销 |
Ctrl + Y | 撤回 |
Ctrl + S | 保存 |
Alt + F4 | 关闭窗体 |
Alt + Tab | 窗体切换 |
Windows + R | 运行 |
Windows + L | 快速锁屏 |
Windows + E | 资源管理器 |
Ctrl + Shift + ESC | 任务管理器 |
功能性快捷键在大多软件中都适用,如
按键 | 说明 |
---|---|
Ctrl + C | 复制 |
Ctrl + V | 粘贴 |
开始 > 系统 > 命令提示符
按下 Win + R 输入 cmd 打开控制台(推荐使用)
在任意的文件夹下面,按住 Shift + 鼠标右键点击,在此处打开命令行窗口
资源管理器的地址栏输入cmd
命令 | 说明 | 备注 |
---|---|---|
C: | 选择盘符 | 盘符名称加冒号 |
dir | 查看当前目录下的所有文件 | |
cd /d C: | 盘符切换 | Change Directory |
cd 文件名\文件名 | 目录切换 | |
cd… | 返回上一级目录 | |
cls | 清理屏幕 | Clear Screen |
exit | 退出 | |
ipconfig | 查看电脑 IP 地址 | |
clac mspaint notepad |
打开本地程序 | 计算器 画图 记事本 |
ping 网址 | ping命令 | |
md 文件名 | 创建文件夹 | Make Directory |
cd> a.txt | 创建文件 | 注意文件后缀 |
del a.txt | 删除文件 | 注意文件后缀 |
rd 文件名 | 移除目录 | Remove Directory |
机器语言:
我们都知道计算机的基本计算方式都是基于二进制的方式。
二进制:010111001010110010110100
这种代码是直接输入给计算机使用的,不经过任何的转换!
十进制 | 二进制 |
---|---|
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
16 | 10000 |
32 | 100000 |
汇编语言
解决人类无法读懂机器语言的问题
指令代替二进制
目前应用
高级语言
大体上分为:面向过程和面向对象两大类
C语言是典型的面向过程的语言。C++、JAVA是典型的面向对象的语言
高级语言
C
C++
JAVA
C#
Python
先有
C
语言,改良后为C++
面向对象语言,再有JAVA
,C#
是微软基于JAVA
研发的.NET
平台软件
Intellij IDEA 是目前主流的 Java 开发工具(付费软件),安装教程这里不过多介绍
Intellij IDEA官网
详细免费安装教程请加文章封面联系方式QQ:3336392096
工欲善其事比先利其器,Idea 有许多实用的插件和设置,可以提高我们的工作效率
汉化,分别点击左上角File
> Settings
按照下图点击Plugins
搜索Chinese
下载汉化包后点击右下角Apply
应用安装,重启软件即可生效
还有一些实用插件分享,从上到下分别是:代码规范,UI美化,汉化包,快捷键提示,彩虹括号,代码提示补全等
以及保存代码时自动格式化代码和方法间分割线
package CH01_JAVABase;
//Change The World!
public class XZ01_ChangeTheWorld {
public static void main(String[] args) {
System.out.println("Change The World!");
//Change The World!
}
}
public class XZ01_ChangeTheWorld {}
// public 关键字,表示访问权限
// XZ01_ChangeTheWorld 类名与文件名要完全一样
public static void main(String[] args) {}
// main( )方法四要素必不可少 public static void main
// main( )方法是 Java 程序执行的入口点
System.out.println("Change The World!");
// 从控制台输出信息
代码语句 | 说明 | 快捷语句 |
---|---|---|
public static void main(String[] args) { } | Main函数,程序主入口 | main/psvm |
System.out.println( ); | 输出语句 | sout |
注释不会出现在字节码文件中,即Java 编译器编译时会跳过注释语句
单行注释使用//
开头
//我是单行注释
多行注释以/*
开头以*/
结尾。注意,多行注释不能嵌套使用
/*
我是多行注释
我是多行注释
*/
文档注释以/**
开头以 */
结尾,注释中包含一些说明性的文字及一些 JavaDoc 标签(后期写项目时,可以生成项目的API文档)
/**
* XZ04_Annotate 类(我是文档注释)
* @author 玄子 (作者)
* @version 1.0 (版本)
*/
package CH01_JAVABase;
//注释
/**
* XZ04_Annotate 类(我是文档注释)
*
* @author 玄子 (作者)
* @version 1.0 (版本)
*/
public class XZ04_Annotate {
//我是单行注释
public static void main(String[] args) {
System.out.println("Change The World!");
/*
System.out.println("Change The World!");
System.out.println("我是多行注释!");
*/
}
}
注释语法 | 注释名称 | 快捷键 |
---|---|---|
// | 单行注释 | Ctrl + / |
/* */ | 多行注释 | |
/** */ | 文档注释 |
文档注释参数 | 描述 |
---|---|
@author | 作者名 |
@version | 版本号 |
@since | 指明需要最早使用的jdk版本 |
@param | 参数名 |
@return | 返回值情况 |
@throws | 异常抛出情况 |
JavaDoc 命令是用来生成 API 文档的
JAVA API 文档提供了很多官方的介绍和类、方法、变量的解释
一般很系统,涉及所有的方面,如果开发人员对正在使用的类不熟悉,想查看类里面的变量或者方法,就可以打开JavaAPI文档进行阅读和查看
很多开发语言都提供了官方的文档,可以让开发人员迅速地提高能力
Java API 帮助文档 Java8 API 帮助文档
Java 数据类型分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)
package CH01_JAVABase;
//八大数据类型
public class XZ02_DataType {
public static void main(String[] args) {
int num1 = 1;
byte num2 = 1;
short num3 = 1;
long num4 = 1L;
// long 的数值后面需要加大写字母 L
//整型
}
}
类型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1 字节 | -27 ~ 27-1(-128~127) |
short | 2 字节 | -215 ~ 215-1 (-32768~32767) |
int | 4 字节 | -231 ~ 231-1 (-2147483648~2147483647) 约21 亿 |
long | 8 字节 | -263~ 263-1 |
package CH01_JAVABase;
//八大数据类型
public class XZ02_DataType {
public static void main(String[] args) {
double num5 = 1.1;
float num6 = 1.2F;
// float 的数值后面需要加大写字母 F
//浮点型
}
}
类型 | 占用存储空间 | 表数范围 |
---|---|---|
float | 4 字节 | -3.403E38~3.403E38 |
double | 8 字节 | -1.798E308~1.798E308 |
package CH01_JAVABase;
//八大数据类型
public class XZ02_DataType {
public static void main(String[] args) {
char ch = 'a';
char ch = '玄';
//单字符
}
}
字符型在内存中占 2 个字节,在 Java 中使用单引号来表示字符常量。例如
'A'
是一个字符,它与"A"
是不同的,"A"
表示含有一个字符的字符串char 类型用来表示在 Unicode 编码表中的字符
Unicode 编码被设计用来处理各种语言的文字,它占 2 个字节,可允许有 65536 个字符
package CH01_JAVABase;
//八大数据类型
public class XZ02_DataType {
public static void main(String[] args) {
boolean is = false;
boolean is = true;
// 只有两个结果 true false
//布尔型
}
}
package CH01_JAVABase;
//八大数据类型
public class XZ02_DataType {
public static void main(String[] args) {
String string = "Change The World!";
//引用型,不属于基本数据类型
}
}
八种基本数据类型,除了boolean 类型之外的七种类型是可以自动转化的
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。如图下所示,的实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失
可以将整型常量直接赋值给byte、short、char 等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可
package CH01_JAVABase;
//数据类型转换
public class XZ03_TypeConversion {
public static void main(String[] args) {
int a = 1;
double b = a;
System.out.println(b);
// b = 1.0
//隐式数据类型转换,自动转换
}
}
package CH01_JAVABase;
//数据类型转换
public class XZ03_TypeConversion {
public static void main(String[] args) {
double c = 1.2;
int d = (int) c;
System.out.println(d);
// d = 1
//显式数据类型转换转换变量前加 (转换类型)
}
}
package CH01_JAVABase;
//数据类型转换
public class XZ03_TypeConversion {
public static void main(String[] args) {
char e = 'a';
int f = e + 1;
System.out.println((int) e);
// 97
System.out.println(f);
// 98
System.out.println((char) f);
// b
}
}
package CH01_JAVABase;
//变量
public class XZ05_Variable {
static String str = "XuanZi"; //类变量
//成员变量
int age; //默认值 0
String Sex = "男"; //默认值null
boolean IsNull; //默认值false
public static void main(String[] args) {
//局部变量
int value = 1;
String name = "玄子";
//创建类的对象调用方法
XZ05_Variable variable = new XZ05_Variable();
System.out.println(name);
//输出局部变量
variable.set();
//调用类方法
System.out.println(variable.IsNull);
//实例变量需要创建对象后才能调用
System.out.println(str);
//类变量可直接调用
}
public void set() {
String conn = "XuanZiShare"; //局部变量
System.out.println(age);
System.out.println(Sex);
System.out.println(conn);
}
}
类变量具有默认值,声明时可不对其赋值
变量类型 | 默认值 |
---|---|
整型(int,byte,short,long) | 0 |
单精度浮点型(float) | 0.0f |
双精度浮点型(double) | 0.0d |
字符型(char) | /u0000 |
布尔型(boolean) | false |
引用类型(array,String,class,……) | null |
变量有三种类型:局部变量、成员变量(实例变量)和静态变量(类变量)
类型 | 声明位置 | 从属于 | 生命周期(作用域) |
---|---|---|---|
局部变量 | 方法或语句块内部 | 方法/语句块 | 从声明位置开始,直到方法或语 句块执行完毕,局部变量消失 |
成员变量 | 类内部,方法外部 | 对象 | 对象创建,成员变量也跟着创建 对象消失,成员变量也跟着消失 |
静态变量 | 类内部,static 修饰 | 类 | 类被加载,静态变量就有效 类被卸载,静态变量消失 |
package CH01_JAVABase;
//常量
public class XZ06_Constant {
// final 数据类型 常量名 = 值;
public static final double PI = 3.14;
// public static 修饰符,不存在先后顺序
public static void main(String[] args) {
System.out.println(PI);
}
}
计算机的基本用途就是执行数学运算,Java 提供了一套丰富的运算符来操作变量
int num1 = 1;
double num2 = 2.5;
System.out.println(num1+num2);// 1
// mum1 + 1 上一句输出后才+1 2
// 1 + mum1 下一句输出前就+1 3
System.out.println(num2 % num1); //0.5
// + - * / %
// 加 减 乘 除 余
加、减 、乘、除。与正常数学运算用法一致,余(%)在 Java 中表示求余数 例如
2.5 % 1
的余数就是0.5
如果两个数都为
int
型的话,余数会舍去尾数,取整数
int num1 = 1;
System.out.println(num1++);
// ++ 写在变量后面等于 mum1 + 1 输出后才 +1 = 2
System.out.println(++num1);
// ++ 写在变量前面等于 1 + mum1 输出前就 +1 = 2 + 1 = 3
System.out.println(num1 + 1); // 4
// 二元运算符,是改变,变量实际值进行运算,值会随着运算而改变
// ++ --
// 自增 自减
int num1 = 1;
System.out.println(num1);
// =
// 赋值
int a = 10;
int b = 20;
System.out.println(a += b);
// a = a + b = 10 + 20 = 30
System.out.println(a); // 30
//和二元运算符一样,运算时,是改变自身实际值运算
// += -= *= /= %
// 加等 减等 乘等 除等 余等
int num1 = 1;
double num2 = 2.5;
System.out.println(num1 <= num2);
// 结果是布尔型 true 或 false
// > < >= <= != ==
// 大于 小于 大于等于 小于等于 不等于 等等于
int num1 = 1;
double num2 = 2.5;
System.out.println(num1 > num2 || num2 > num1);
//两个条件一个为真就返回true
//如果第一个条件就为假直接返回 false,不再判断第二个条件
System.out.println(num1 > num2 && num2 > num1);
//两个条件均为真才返回 true
System.out.println(!(num1 > num2 && num2 > num1));
//判断结果取反
// 结果是布尔型 true 或 false
// && || !
// 与 或 非
char A = 'A';
char B = 'B';
System.out.println("A:" + (int) A);
System.out.println("B:" + (int) B);
System.out.println(A ^ B);
// -------二进制---------
// A = 0011 1100
// B = 0000 1101
// --------判断--------
// A&B = 0000 1100 不同为0相同为1
// A|B = 0011 1101 有1即为1
// A^B = 0011 0001 相同为0不同为1
// ~B = 1111 0010 1为0 0为1
System.out.println(2 << 3);
// -------二进制---------
// 0000 0000 0
// 0000 0001 1
// 0000 0010 2
// 0000 0011 3
// 0000 0100 4
// 0000 1000 8
// 0001 0000 16
// & | ^ ~ << >>
// 与 或 非 异或(按位取反) 左移(*) 右移(/)
int score = 60;
String type = score >= 60 ? "及格" : "不及格";
System.out.println(type);
// ? :
// 布尔 ? 条件1 : 条件2
// 如果布尔结果为 true 那么结果为条件1,否则结果为条件2
System.out.println("" + 10 + 20); // 1020
System.out.println(10 + 20 + ""); // 30
// String写在前后的区别
System.out.println("" + (10 + 20)); // 30
// ()加强运算优先级
System.out.println("Math.pow(2, 3) = " + Math.pow(2, 3));
// 2的三次方 8.0
System.out.println("Math.pow(3, 2) = " + Math.pow(3, 2));
// 3的二次方 9.0
// Math.方法
运算符种类 | 符号 | 描述 |
---|---|---|
算术运算符(一元) | +,-,*,/,% | 加,减,乘,除,余 |
算术运算符(二元) | ++,– | 自增,自增 |
赋值运算符 | = | 赋值 |
扩展运算符 | +=,-=,*=,/=,%= | 加等,减等,乘等,除等,余等 |
关系运算符 | >,<,>=,<=,==,!=,instanceof | 大于,小于,大于等于,小于等于,等等于,不等于,实例判断 |
逻辑运算符 | &&,||,!,^ | 与,或,非,按位 |
位辑运运算符 | &,|,^,~ , >>,<< | 与,或,非,异或(按位取反),左移(*),右移(/) |
条件运算符(三目) | ? : | 布尔 ? 条件1 : 条件2 如果布尔结果为 true 那么结果为条件1,否则结果为条件2 |
字符串连接符 | + | 拼接两个字符串 |
System.out.println("Change The World!");
// 打印完引号中的信息后会自动换行
System.out.println("Change The World!");
// 打印输出信息后不会自动换行
package CH01_JAVABase;
//转义符
public class XZ08_EscapeCharacter {
public static void main(String[] args) {
System.out.println("人生若只如初见,何事秋风悲画扇。");
System.out.println("============================");
System.out.print("人生若只如初见,");
//这里的输 print 加上ln同样表示换行
System.out.println("何事秋风悲画扇。");
System.out.println("============================");
System.out.println("人生若只如初见,\n何事秋风悲画扇。");
System.out.println("============================");
System.out.println("人生若只如初见,\t何事秋风悲画扇。");
//\n 换行
//\t 占位符
}
}
转义字符 | 意义 | ASCII码值(十进制) |
---|---|---|
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\ | 代表一个反斜线字符’’ | 092 |
’ | 代表一个单引号(撇号)字符 | 039 |
" | 代表一个双引号字符 | 034 |
? | 代表一个问号 | 063 |
\0 | 空字符(NULL) | 000 |
\ooo | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 十六进制所代表的任意字符 | 十六进制 |
package CH01_JAVABase;
//命名规范
public class XZ09_NamingSpecification {
public static void main(String[] args) {
// Java 所有的组成部分都需要名字。
// 类名、变量名以及方法名都被称为标识符。
String name;
int num;
double value;
boolean is;
//尽量使用英语单词作为标识符
//常用命名法
String studentName = "玄子";
//驼峰命名法:以小写字母开头,第二个及以后单词首字母大写
String StudentName = "玄子";
//帕斯卡命名法:以大写字母开头,第二个及以后单词首字母大写
}
}
——— | ——— | ——— | ——— | ——— |
---|---|---|---|---|
abstract | assert | boolean | break | byte |
case | catch | char | class | continue |
default | do | double | else | enum |
extends | final | finally | float | for |
if | implements | import | int | interface |
instanceof | long | native | new | package |
private | protected | public | return | short |
static | strictfp | super | switch | synchronized |
this | throw | throws | transient | try |
void | volatile | while |
package CH01_JAVABase;
//包机制
public class XZ10_PackageMechanism {
public static void main(String[] args) {
// 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。
// 包语句的语法格式为:
// package pkg1[. pkg2[. pkg3...]];
// 一般利用公司域名倒置作为包名;com.XuanZiShare.www
// 为了能够使用某一个包的成员,我们需要在Java程序中明确导入该包。
// 使用“import”语句可完成此功能
// import package1[.package2...].(classname|*);
// *通配符 所有
}
}
Scanner 类是在 jdk1.5 版本引入的,它在 java 的 util 工具包下,主要用于扫描用户从控制台输入的文本。当我们需要通过控制台输入数据时,只需要事先导入 java.util 包中的 Scanner 类,然后调用 Scanner 类,我们的程序就能获取我们在控制台所输入的数据了
import java.util.Scanner;
在 IDEA 中可直接创建 Scanner 对象 IDEA 会自动帮我们导包
package CH02_JAVAProcessControl;
//基础Scanner
import java.util.Scanner;
//导包
public class XZ01_UserInteraction {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 创建Scanner对象
// input 是对象名称,在符合命名规范前提下,可随意命名
System.out.println("请输入:");
if (input.hasNext()) {
// 判断用户是否输入数据
String i = input.next();
// 声明变量接收用户输入数据,例如
// input.nextDouble();
// input.nextInt();
System.out.println(i);
// 输出接收用户输入数据的变量
}
input.close();
// 关闭Scanner对象
}
}
通过 Scanner 类的 next() 与 nextLine() 方法获取输入的字符串,在读取前我们一般需要使用 hasNext() 与 hasNextLine() 判断是否还有输入的数据
使用完Scanner后,我们一定要记得将它关闭,因为使用Scanner本质上是打开了一个 IO 流,如果不关闭的话,它将会一直占用系统资源。注意一旦你关闭后,就算在
input.close();
这行代码后你再重新创建 Scanner 对象也不能重新再打开一个扫描器了,如果继续使用程序会报错,所以一定要在用不到扫描器之后再关闭,即把input.close();
放到代码的最后
package CH02_JAVAProcessControl;
//基础Scanner
import java.util.Scanner;
public class XZ01_UserInteraction2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("next() 与 nextLine() 的区别");
String i2 = input.nextLine();
// String i2 = input.next();
System.out.println(i2);
// NextLine与Next的区别:
// NextLine会记录用户输入直到按下回车键的所有数据
// Next遇到空格就自动停止
input.close();
}
}
nextLine() 用法总结:
package CH02_JAVAProcessControl;
//基础Scanner
import java.util.Scanner;
public class XZ01_UserInteraction3 {
public static void main(String[] args) {
//我们可以输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,
//通过输入非数字来结束输入并输出执行结果:
Scanner input = new Scanner(System.in);
double sum = 0;
// 声明变量记录用户输入数据和
int count = 0;
// 声明变量记录用户输入数据次数
System.out.println("请输入数字(输入字母停止)");
while (input.hasNextDouble()) {
// 只有用户输入Double类型数据才会执行
sum += input.nextDouble();
// 记录和的变量,加上用户当前输入数据
count++;
// 用户输入数据次数+1
}
System.out.println(count + "个数的和为:" + sum);
input.close();
}
}
package CH02_JAVAProcessControl;
//单层 if 选择结构
public class XZ02_SelectStructure {
public static void main(String[] args) {
int i = 60;
if (i >= 60) {
System.out.println("及格");
//当结果为true执行
} else {
System.out.println("不及格");
//当结果为false执行
}
}
}
package CH02_JAVAProcessControl;
//多重 if 选择结构
import java.util.Scanner;
public class XZ02_SelectStructure2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 判断用户输入数据,对数据进行分区
System.out.println("请输入成绩");
double score = input.nextDouble();
if (score > 100) {
System.out.println("数据非法");
} else if (score <= 100 && score >= 90) {
System.out.println("A级");
} else if (score >= 80) {
System.out.println("B级");
} else if (score >= 70) {
System.out.println("C级");
} else if (score >= 60) {
System.out.println("D级");
} else {
System.out.println("不及格");
}
input.close();
}
}
package CH02_JAVAProcessControl;
//嵌套if
import java.util.Scanner;
public class XZ02_SelectStructure3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 判断用户输入数据,对数据进行分区
System.out.println("请输入成绩");
if (input.hasNextDouble()) {
double score = input.nextDouble();
// if判断用户输入数据是否为double类型
// 然后在进行分级判断
if (score > 100) {
System.out.println("数据非法");
} else if (score <= 100 && score >= 90) {
System.out.println("A级");
} else if (score >= 80) {
System.out.println("B级");
} else if (score >= 70) {
System.out.println("C级");
} else if (score >= 60) {
System.out.println("D级");
} else {
System.out.println("不及格");
}
}
input.close();
}
}
package CH02_JAVAProcessControl;
//switch判断整数
import java.util.Scanner;
public class XZ02_SelectStructure4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入数字");
int var = input.nextInt();
switch (var) {
case 0:
System.out.println("值1");
break;
case 1:
System.out.println("值2");
break;
case 2:
System.out.println("值3");
break;
default:
System.out.println("默认值");
}
input.close();
}
}
选择结构:
多选择结构还有一个实现方式就是switch case 语句
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支
package CH02_JAVAProcessControl;
//switch判断字符串
import java.util.Scanner;
public class XZ02_SelectStructure5 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入值");
String var = input.next();
switch (var) {
case "玄子":
System.out.println("玄子");
break;
case "XuanZiShaer":
System.out.println("XuanZiShaer");
break;
default:
System.out.println("默认值");
}
input.close();
}
}
switch 语句中的变量类型可以是:
package CH02_JAVAProcessControl;
// 输入一个日期判断这个日期已经过了多少天
import java.util.Scanner;
public class XZ02_SelectStructure6 {
public static void main(String[] args) {
// 普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年。
// 能被4整除,且不能被100整除
// 世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年)。
// 能被100整除且被400整除
Scanner input = new Scanner(System.in);
System.out.println("请输入日期年:");
int year = input.nextInt();
System.out.println("请输入日期月:");
int month = input.nextInt();
System.out.println("请输入日期日:");
int day = input.nextInt();
switch (month - 1) {
case 11:
day += 30;
case 10:
day += 31;
case 9:
day += 30;
case 8:
day += 31;
case 7:
day += 31;
case 6:
day += 30;
case 5:
day += 31;
case 4:
day += 30;
case 3:
day += 31;
case 2:
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
System.out.println("闰年");
day += 29;
} else {
System.out.println("平年");
day += 28;
}
case 1:
day += 31;
break;
}
System.out.println(day);
input.close();
}
}
package CH02_JAVAProcessControl;
//while输出100以内的和
public class XZ03_CirculateStructure {
public static void main(String[] args) {
int sum = 0;
int i = 0;
while (i <= 100) {
sum += i;
i++;
}
System.out.println(sum);
}
}
while 是最基本的循环,它的结构为:
package CH02_JAVAProcessControl;
//do while 和while的区别
public class XZ03_CirculateStructure2 {
public static void main(String[] args) {
int i = 0;
while (i < 0) {
i++;
System.out.println(i);
}
System.out.println("=====================");
do {
i++;
System.out.println(i);
} while (i < 0);
}
}
do…while 循环:
package CH02_JAVAProcessControl;
//for循环输出100以内的和
public class XZ03_CirculateStructure3 {
public static void main(String[] args) {
int a = 0;
//初始化 //条件判断 //迭代
for (int i = 0; i <= 100; i++) {
a += i;
}
System.out.println(a);
}
}
for 循环:
package CH02_JAVAProcessControl;
//增强for
public class XZ03_CirculateStructure7 {
public static void main(String[] args) {
//遍历数组中的值
int[] a = new int[]{10, 20, 30, 40, 50, 60};
for (int x : a) {
System.out.println(x);
}
}
}
增强 for:
package CH02_JAVAProcessControl;
//break和continue的区别
public class XZ03_CirculateStructure1_break_continue {
public static void main(String[] args) {
int i = 0;
while (i < 100) {
i++;
System.out.print(i + " ");
if (i == 30) {
break;
}
}
System.out.println();
System.out.println("========================");
int j = 0;
while (j < 100) {
j++;
if (j % 10 == 0) {
System.out.println();
continue;
}
System.out.print(j);
}
}
}
package CH02_JAVAProcessControl;
public class XZ04_GoToKeyWord {
public static void main(String[] args) {
// 打印101-159之间所有的质数
// 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
int count = 0;
outer:
for (int i = 101; i < 150; i++) {
for (int j = 2; j < i / 2; j++) {
if (i % j == 0) {
continue outer;
}
}
System.out.print(i + " ");
}
}
}
go to关键字:
package LearnJava.进制转换;
import java.util.Scanner;
public class 二进制转换十进制 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//先判断有几位数
//输入数*输入位数减去1的平方
//转换后数值相加
//输出最终结果
System.out.println("请输入二进制数字:");
int erjinzhi = input.nextInt();
int shijinzhi = 0, p = 0;
while (erjinzhi != 0) {
shijinzhi += ((erjinzhi % 10) * Math.pow(2, p));
erjinzhi = erjinzhi / 10;
p++;
}
System.out.println(shijinzhi);
}
}
package LearnJava.进制转换;
import java.util.Scanner;
public class 十进制转换二进制 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入十进制数字");
int n = input.nextInt();
int t = 0;
//用来记录位数
int bin = 0;
//用来记录最后的二进制数
int r = 0;
//用来存储余数
while (n != 0) {
r = n % 2;
n = n / 2;
bin += r * Math.pow(10, t);
t++;
}
System.out.println(bin);
}
}
package CH02_JAVAProcessControl;
//for循环输出100以内的奇数与偶数和
public class XZ03_CirculateStructure4 {
public static void main(String[] args) {
int ji = 0;
int oh = 0;
for (int i = 0; i <= 100; i++) {
if (i % 2 == 0) {
oh += i;
} else {
ji += i;
}
}
System.out.println(ji);
System.out.println(oh);
System.out.println(ji + oh);
}
}
package CH02_JAVAProcessControl;
//用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
public class XZ03_CirculateStructure5 {
public static void main(String[] args) {
for (int i = 1; i < 1000; i++) {
if (i % 5 == 0) {
System.out.print(i + "\t");
}
if (i % (3 * 5) == 0) {
System.out.println();
}
}
}
}
package CH02_JAVAProcessControl;
//打印正反99乘法表
public class XZ03_CirculateStructure6 {
public static void main(String[] args) {
// 1.我们先打印第一列,这个大家应该都会
// 2.我们把固定的1再用一个循环包起来
// 3.去掉重复项,i<=j
// 4.调整样式
for (int j = 1; j <= 9; j++) {
for (int i = 1; i <= j; i++) {
System.out.print(j + "*" + i + "=" + (j * i) + "\t");
}
System.out.println();
}
System.out.println("===========================");
for (int j = 9; j >= 0; j--) {
for (int i = 1; i <= j; i++) {
System.out.print(j + "*" + i + "=" + (j * i) + "\t");
}
System.out.println();
}
}
}
package CH02_JAVAProcessControl;
//打印三角形
public class XZ03_CirculateStructure8 {
public static void main(String[] args) {
// 空白与实体之间的关系 2*i-1
for (int i = 0; i <= 5; i++) {
for (int j = 5; j >= i; j--) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print("*");
}
System.out.println();
}
System.out.println("===========================");
for (int i = 1; i <= 5; i++) {
for (int j = 5; j >= i; j--) {
System.out.print(" ");
}
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
for (int j = 1; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
package CH03_JAVAMethod;
import java.util.Scanner;
//方法的定义
public class XZ01_DefinitionOfMethod {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int x = input.nextInt();
System.out.println("请输入第二个数字:");
int y = input.nextInt();
// 声明变量x和y接收用户输入变量
int result = sum(x, y);
// 调用方法获取返回值
System.out.println("大数是:" + result);
// 输出返回值
input.close();
}
public static int sum(int x, int y) {
// 修饰符 返回值类型 方法名(参数类型 参数名){
int result = 0;
// 声明变量返回结果
if (x == y) {
return 0;
}
if (x > y) {
result = x;
} else {
result = y;
}
// 方法体
return result;
// return 返回值;
}
}
Java方法是语句的集合:
设计方法的原则:
package CH03_JAVAMethod;
//方法的重载
public class XZ02_OverloadingOfMethod {
public static void main(String[] args) {
// 声明变量x和y接收用户输入变量
int result = add(10, 20, 30);
int result2 = add(10, 20);
double result3 = add(10, 20, 30.6, 40);
// 方法名相同,根据传递参数数量,类型不同自动判断
System.out.println("和为:" + result);
System.out.println("和为:" + result2);
System.out.println("和为:" + result3);
// 输出返回值
}
public static int add(int x, int y) {
// 修饰符 返回值类型 方法名(参数类型 参数名){
int result = 0;
// 声明变量返回结果
result = x + y;
// 方法体
return result;
// return 返回值;
}
public static int add(int x, int y, int z) {
// 修饰符 返回值类型 方法名(参数类型 参数名){
int result = 0;
// 声明变量返回结果
result = x + y + z;
// 方法体
return result;
// return 返回值;
}
public static double add(double x, double y, double z, double n) {
// 修饰符 返回值类型 方法名(参数类型 参数名){
double result = 0;
// 声明变量返回结果
result = x + y + z + n;
// 方法体
return result;
// return 返回值;
}
}
方法的重载重载就是在一个类中,有相同的函数名称,但形参不同的函数。
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
package CH03_JAVAMethod;
//传参
public class XZ03_ChuanshenOfMethod {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
命令行传参有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数 给main( ) 函数实现。
通过cmd窗体编译 java 文件传递参数
编译文件javac XZ03_ChuanshenOfMethod.java
cd…/ 回退到 src 目录下
书写全路径java CH03_JAVAMethod/XZ03_ChuanshenOfMethod
加上传递参数java CH03_JAVAMethod.XZ03_ChuanshenOfMethod XuanZi XuanZiShaer
!!! 注释可能无法编译,导致编译失败
package CH03_JAVAMethod;
//可变参数
public class XZ04_VariableParameterOfMethod {
public static void main(String[] args) {
printMax(312, 22.2, 3213, 32131);
}
public static void printMax(int a, double... numbers) {
if (numbers.length == 0) {
System.out.println("No argument passed");
return;
}
double result = numbers[0];
//排序!
for (int i = 1; i < numbers.length; i++) {
if (numbers[i] > result) {
result = numbers[i];
}
}
System.out.println("The max value is " + result);
}
}
可变参数:
package CH03_JAVAMethod;
//递归
public class XZ05_RecursionOfMethod {
public static void main(String[] args) {
System.out.println(f(25));
}
public static long f(long n) {
if (n == 1) {
return 1;
} else {
return n * f(n - 1);
}
}
}
递归:
package CH04_JAVAArrays;
//数组的定义
public class XZ01_DefinitionOfArray {
public static void main(String[] args) {
int[] nums;
// 声明数组
nums = new int[10];
// 定义数组空间
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
nums[3] = 4;
nums[4] = 5;
nums[5] = 6;
nums[6] = 7;
nums[7] = 8;
nums[8] = 9;
nums[9] = 10;
// 对数组进行赋值
// nums[10] = 11;
// 数组素引超出范围
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
System.out.println("和为:" + sum);
}
}
数组的定义:
package CH04_JAVAArrays;
//数组状态
public class XZ02_ArrayState {
public static void main(String[] args) {
int[] nums = new int[10];
nums[0] = 1;
// 动态状态
int[] nums2 = {10, 20, 30, 40, 50};
// 静态状态
System.out.println(nums[0]);
System.out.println(nums[1]);
System.out.println(nums2[0]);
}
}
数组的默认初始化:
package CH04_JAVAArrays;
//数组下标越界
public class XZ03_ArraySubscriptOutOfBounds {
public static void main(String[] args) {
int[] nums = new int[10];
System.out.println(nums[10]);
//打印数组下标超过数组存储就会报错: 数组下标越界
}
}
package CH04_JAVAArrays;
//数组基础案例
public class XZ04_ArrayBasicCase {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
System.out.println("=========遍历数组============");
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "\t");
}
System.out.println();
System.out.println("==========遍历数组============");
for (int num : nums) {
System.out.print(num + "\t");
}
System.out.println();
System.out.println("==========计算和============");
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
System.out.print("和为:" + sum);
System.out.println();
System.out.println("==========计算最大数============");
int max = nums[0];
for (int i = 0; i < nums.length; i++) {
if (nums[i] > max) {
max = nums[i];
}
}
System.out.print("最大数为:" + max);
System.out.println();
System.out.println("==========反转数组============");
for (int i = 0; i < reverse(nums).length; i++) {
System.out.print(reverse(nums)[i] + "\t");
}
}
public static int[] reverse(int[] nums) {
// 反转数组
int[] result = new int[nums.length];
for (int i = 0, j = result.length - 1; i < nums.length; i++, j--) {
result[i] = nums[j];
}
return result;
}
}
package XuanZi.CH08.数组;
//数组插入
import java.util.Arrays;
public class XuanZi06 {
public static void main(String[] args) {
int[] lao = {18, 17, 55, 19, 51, 45};
//老数组
int num = 52;
//插入数
int[] xin = new int[lao.length + 1];
//新数组长度等于老数组长度加一
//新数组的i位成语老数组的i位
System.arraycopy(lao, 0, xin, 0, lao.length);
xin[lao.length] = num;
//新数组最后一位等于插入数
Arrays.sort(xin);
for (int i = 0; i < xin.length; i++) {
System.out.println(xin[i]);
//排序输出
}
}
}
package XuanZi.CH08.数组;
public class XUanZi07 {
public static void main(String[] args) {
int[] a = new int[]{10, 20, 30};
int[] b = new int[]{40, 50, 60};
int[] xin = new int[a.length + b.length];
int c = 0;
System.out.print("第一个数组中的元素:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
if (i < a.length - 1) {
System.out.print(",");
}
}
System.out.println();
System.out.print("第二个数组中的元素:");
for (int i = 0; i < a.length; i++) {
System.out.print(b[i]);
if (i < b.length - 1) {
System.out.print(",");
}
}
System.out.println();
for (int i = 0; i < xin.length; i++) {
if (i < a.length) {
xin[i] = a[i];
} else {
xin[i] = b[c];
c++;
}
}
System.out.print("两个数组合并后:");
for (int i = 0; i < xin.length; i++) {
System.out.print(xin[i]);
if (i < xin.length - 1) {
System.out.print(",");
}
}
System.out.println();
System.out.print("逆序后:");
for (int i = 0; i < xin.length; i++) {
System.out.print((xin[xin.length - i - 1]));
if (i < xin.length - 1) {
System.out.print(",");
}
}
}
}
package CH04_JAVAArrays;
//多维数组
public class XZ05_multidimensionalArray {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
int[][] ages = {{1, 2}, {2, 3}, {3, 4}, {4, 5}};
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "\t");
}
System.out.println();
System.out.println("==========打印多维数组======");
for (int i = 0; i < ages.length; i++) {
for (int j = 0; j < ages[i].length; j++) {
System.out.print(ages[i][j] + "\t");
}
}
}
}
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组
package CH04_JAVAArrays;
//Arrays类
import java.util.Arrays;
public class XZ06_ArrayClass {
public static void main(String[] args) {
int[] nums = {2, 4, 6, 7, 5};
Arrays.sort(nums);
//数组排序
System.out.println(Arrays.toString(nums));
//打印数组
Arrays.fill(nums, 2, 4, 0);
// 填充数组 起始下标 填充值
System.out.println(Arrays.toString(nums));
}
}
Arrays 类:
java.util.Arrays
fill
方法sort
方法,按升序equals
方法比较数组中元素值是否相等binarySearch
方法能对排序好的数组进行二分查找法操作package CH04_JAVAArrays;
import java.util.Arrays;
//冒泡排序
public class XZ07_bubbleSort {
public static void main(String[] args) {
// 比较数组中,两个相邻的元素,如果第一个数比第二个数大
// 我们就交换他们的位置
// 每一次比较,都会产生出一个最大,或者最小的数字
// 下一轮则可以少一次排序
// 依次循环,直到结束
int[] a = {1, 4, 5, 6, 72, 2, 2, 2, 25, 6, 7};
int[] sort = sort(a);
//调用完我们自己写的排序方法以后,返回一个排序后的数组
System.out.println(Arrays.toString(sort));
}
public static int[] sort(int[] array) {
//临时变量
int temp = 0;
//外层循环,判断我们这个要走多少次;
for (int i = 0; i < array.length - 1; i++) {
boolean flag = false;//减少没有意义的比较
//内层循环,比价判断两个数,如果第一个数,比第二个数大,则交换位置
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j + 1] > array[j]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag = true;
}
}
if (!flag) {
break;
}
}
return array;
}
}
OOP
面向过程思想
步骤清晰简单,第一步做什么,第二步做什么……
面对过程适合处理一些较为简单的问题
面向对象思想
对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
面向对象编程:(Object-Oriented Programming);简称OOP
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起
对象是具有类,类型的变量。类和对象是面向对象编程技术中的最基本的概念
类是对象的类型,对象是类的实例
package CH05_JAVAObjectOriented;
//类与对象的创建
public class XZ01_Student {
// 学生类
String name;
// 默认值 null
int age;
// 默认值 0
public void study() {
System.out.println(this.name + "在学习");
// this 代表当前类的属性
}
}
package CH05_JAVAObjectOriented;
//一个项目应该只存在一个 Main 方法
public class XZ01_Main {
public static void main(String[] args) {
//类:抽象的,实例化
//类实例化后会返回一个自己的对象!
XZ01_Student xiaoMing = new XZ01_Student();
// 使用new关键字创建对象
System.out.println(xiaoMing.name);
System.out.println(xiaoMing.age);
xiaoMing.study();
XZ01_Student xiaoHong = new XZ01_Student();
System.out.println("------------------------");
xiaoHong.name = "小红";
// 对属性进行赋值
xiaoHong.age = 16;
System.out.println(xiaoHong.name);
System.out.println(xiaoHong.age);
xiaoHong.study();
//xiaoHong,xiaoHong就是一个Student类的具体实例!
}
}
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下特点:
package CH05_JAVAObjectOriented;
public class XZ02_Constructors {
//一个类即使什么都不写,它也会存在一个方法
//显示的定义构造器
String name;
public XZ02_Constructors(String name) {
//有参构造:一旦定义了有参构造,无参就必须显示定义
//只要定义了有参构造就也定义个无参构造
this.name = name;
}
public XZ02_Constructors() {
this.name = "玄子";
}
}
package CH05_JAVAObjectOriented;
public class XZ02_Main {
public static void main(String[] args) {
XZ02_Constructors constructors = new XZ02_Constructors("玉玉诏");
System.out.println(constructors.name);
// 这里看不懂可尝试 Debug 一下
}
}
快捷键: Alt + Instant
笔记本用户根据自己机型考虑加上 Shift
即同时按下 Alt + Shift + Instant
package CH05_JAVAObjectOriented;
//封装
public class XZ03_Encapsulation {
private String name;
private int age;
private char sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
// 为了避免赋值错误,需对属性设置限制,在set()方法中进行验证
if (age >= 100) {
System.out.println(age + ":为非法数据");
this.age = 18;
} else {
// this代表当前对象
this.age = age;
}
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
package CH05_JAVAObjectOriented;
public class XZ03_Main {
public static void main(String[] args) {
XZ03_Encapsulation encapsulation = new XZ03_Encapsulation();
encapsulation.setName("玄子");
encapsulation.setAge(12);
encapsulation.setSex('男');
System.out.println(encapsulation.getName());
System.out.println(encapsulation.getAge());
System.out.println(encapsulation.getSex());
System.out.println("------------------");
XZ03_Encapsulation encapsulation2 = new XZ03_Encapsulation();
encapsulation2.setAge(112);
System.out.println(encapsulation2.getAge());
}
}
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
我们程序设计要追求“高内聚,低耦合”
高内聚:就是类的内部数据操作细节自己完成,不允许外部干涉
低耦合:仅暴露少量的方法给外部使用
将属性私有通过
get/set
方法操作属性
快捷键: Alt + Instant
笔记本用户根据自己机型考虑加上 Shift
即同时按下 Alt + Shift + Instant
选择
Getter 和 Setter
是对一个对象的默认引用
调用成员变量
调用成员方法
调用已定义的构造方法
this 关键字是在对象内部指代自身的引用,所以它只能调用实例变量、实例方法和构造方法,不能调用类变量和类方法,也不能调用局部变量
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
package CH03_JAVAMethod;
//方法的重载
public class XZ02_OverloadingOfMethod {
public static void main(String[] args) {
// 声明变量x和y接收用户输入变量
int result = add(10, 20, 30);
int result2 = add(10, 20);
double result3 = add(10, 20, 30.6, 40);
// 方法名相同,根据传递参数数量,类型不同自动判断
System.out.println("和为:" + result);
System.out.println("和为:" + result2);
System.out.println("和为:" + result3);
// 输出返回值
}
public static int add(int x, int y) {
// 修饰符 返回值类型 方法名(参数类型 参数名){
int result = 0;
// 声明变量返回结果
result = x + y;
// 方法体
return result;
// return 返回值;
}
public static int add(int x, int y, int z) {
// 修饰符 返回值类型 方法名(参数类型 参数名){
int result = 0;
// 声明变量返回结果
result = x + y + z;
// 方法体
return result;
// return 返回值;
}
public static double add(double x, double y, double z, double n) {
// 修饰符 返回值类型 方法名(参数类型 参数名){
double result = 0;
// 声明变量返回结果
result = x + y + z + n;
// 方法体
return result;
// return 返回值;
}
}
方法的重载重载就是在一个类中,有相同的函数名称,但形参不同的函数。
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
package CH05_JAVAObjectOriented;
//继承父类
public class XZ04_Extend /* extends Object*/ {
public String name = "玄子";
// 所有的 Java 类都直接或间接地继承了Object类
private int money;
public void say() {
System.out.println("我是父级:XZ04_Extend");
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
package CH05_JAVAObjectOriented;
//继承子类
public class XZ04_Student extends XZ04_Extend {
// extends 父级:XZ04_Extend 的所有方法
// Ctrl + H 查看继承结构
public String name = "XuanZi";
public void test(String name) {
System.out.println(name);
// XuanZiShare
System.out.println(this.name);
// XuanZi
System.out.println(super.name);
// 玄子
}
}
package CH05_JAVAObjectOriented;
public class XZ04_Main {
public static void main(String[] args) {
XZ04_Student student =new XZ04_Student();
student.say();
student.setMoney(1000);
System.out.println(student.getMoney());
System.out.println("------------------");
student.test("XuanZiShare");
}
}
一个类获取现有类的所有属性和行为的机制
创建基于现有类的新类,可以重用现有类的属性和方法
可以在新创建的子类中添加新属性和方法
有效的解决了代码的重用问题,使代码拓展更加灵活
从始至终完整的体现了一个应用系统,逻辑更加清晰
增加软件的可扩展性,以适应不同的业务需求
JAVA中类只有单继承,没有多继承!
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等
继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示
子类和父类之间,从意义上讲应该具有is a
的关系
public class XZ04_Student extends XZ04_Extend {
// extends 后跟继承父级
// 继承 XZ04_Extend 类的所有方法
}
所有的 Java 类都直接或间接地继承了Object类,位于java.lang包中。在定义一个类时,如果没有使用extends关键字,即没有显式地继承某个类,那么这个类直接继承Object类
public class XZ04_Extend /* extends Object*/ {
// 默认继承Object类
}
Ctrl + H 查看继承结构树
子类访问父类成员super
代表父类对象
super只能出现在子类的方法和构造方法中
super调用构造方法时,只能是第一句
super不能访问父类的 private 成员
代表的对象不同
前提
构造方法
this(); 本类的构造
super(); 父类的构造
方法的重写或方法的覆盖Override
在子类中,根据需求对从父类继承的方法体进行重新编写,以实现子类需求
必须遵守的规则
重写方法和被重写方法必须具有相同的方法名
重写方法和被重写方法必须具有相同的参数列表
重写方法返回值类型必须和被重写方法的返回值类型相同或为其子类
重写方法不能缩小被重写方法的访问权限
玄子:2023年2月19日