JavaSE简介
数据类型
运算符
流程控制
方法的定义、调用、重载
数组
JavaSE简介
美国SUN(Stanford University Network)公司,Java的发明人 James Gosling
JavaSE(Java Standard Edition):标准版,定位在个人计算机上的应用
JavaEE(Java Enterprise Edition):企业版,定位在服务器端的应用
JavaME(Java Micro Edition):微型版,定位在消费性电子产品的应用上
Java的特性及优势
跨平台/可移植性
安全性
面向对象
简单性
高性能
分布式
多线程
健壮性
注意:SUN公司已经被oracle公司收购,目前每半年更新一次java的版本。但是,企业中的主流仍然以7和8为主。对于初学者,应该以企业主流应用版本为核心进行学习,没有必须在此处追求最新版本。
不同版本JDK说明
JDK Version 1.1
于1997-02-19发行。
引入的新特性包括:
引入JDBC(Java Database Connectivity);
支持内部类;
引入Java Bean;
引入RMI(Remote Method Invocation);
引入反射(仅用于内省)。
J2SE Version 1.2
开发代号为Playground(操场),于1998-12-08发行。
引入的新特性包括:
引入集合(Collection)框架;
对字符串常量做内存映射;
引入JIT(Just In Time)编译器;
引入对打包的Java文件进行数字签名;
引入控制授权访问系统资源的策略工具;
引入JFC(Java Foundation Classes),包括Swing 1.0、拖放和Java 2D类库;
引入Java 插件;
在JDBC中引入可滚动结果集、BLOB、CLOB、批量更新和用户自定义类型;
在Applet中添加声音支持。
J2SE Version 1.3
开发代号为Kestrel(红隼),于2000-05-08发行。
引入的新特性包括:
引入Java Sound API;
jar文件索引;
对Java的各个方面都做了大量优化和增强。
J2SE Version 1.4
开发代号为Merlin(隼),于2004-02-06发行(首次在JCP下发行)。
引入的新特性包括:
XML处理;
Java打印服务;
引入Logging API;
引入Java Web Start;
引入JDBC 3.0 API;
引入断言;
引入Preferences API;
引入链式异常处理;
支持IPv6;
支持正则表达式;
引入Image I/O slot machine API。
Java Version SE 5.0
开发代号为Tiger(老虎),于2004-09-30发行。
引入的新特性包括:
引入泛型;
增强循环,可以使用迭代方式;
自动装箱与自动拆箱;
类型安全的枚举;
可变参数;
静态引入;
元数据(注解);
引入Instrumentation。
Java Version SE 6
开发代号为Mustang(野马),于2006-12-11发行。
引入的新特性包括:
支持脚本语言;
引入JDBC 4.0 API;
引入Java Compiler API;
可插拔注解;
增加对Native PKI(Public Key Infrastructure)、Java GSS(Generic Security Service)、Kerberos和LDAP(Lightweight Directory Access Protocol)的支持;
继承Web Services;
做了很多优化。
Java Version SE 7
开发代号是Dolphin(海豚),于2011-07-28发行。
引入的新特性包括:
switch语句块中允许以字符串作为分支条件;
在创建泛型对象时应用类型推断;
在一个语句块中捕获多种异常;
支持动态语言;
支持try-with-resources;
引入Java NIO.2开发包;
数值类型可以用2进制字符串表示,并且可以在字符串表示中添加下划线;
钻石型语法;
null值的自动处理。
Java Version SE 8
开发代号是Spider(蜘蛛),于2014-03-18发行。
支持 lambda支持;
增强日期与时间API的功能;
对垃圾回收的性能也进行了改进;
并且移除了permgen区。
Lambdas表达式与Functional接口
接口的默认与静态方法
方法引用
重复注解
更好的类型推测机制
扩展注解的支持
核心机制
垃圾收集机制
垃圾收集的目的在除不再使用的对象,当对象建立的时候垃圾收集期,就开始监控对象的动态情况,垃圾收集主要是对内存的释放。创建对象的时候申请一个空间
不再使用的内存空间应回收—》垃圾收集;
Java消除了程序员回收无用内存空间的职责;提供一种系统级线程跟踪存储空间的分配情况。在JVM的空闲时,检查并释放可被释放的存储器空间;相比c++,开发人员负责要自己收回无用内存。
垃圾收集在Java程序运行过程中自动进行,程序员无法精确控制和干预;
GC的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄露。
后续:更高级问题,待研究
垃圾收集器有几种
垃圾收集器底层原理剖析
垃圾收集器算法,优化
跨平台原理
(重点)
JVM(Java Virtual Machine)就是一个虚拟的用于执行bytecode字节码的”虚拟计算机”。他也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。JVM负责将Java字节码解释运行,边解释边运行,这样,速度就会受到一定的影响。
不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。 Java虚拟机是实现跨平台的核心机制
我们说的语言跨平台是编译后的文件跨平台,而不是源程序跨平台。 接下来我们再比较下两种方式的差异:第一,C语言是编译执行的,编译器与平台相关,编译生成的可执行文件与平台相关;第二,Java是解释执行的,编译为中间码的编译器与平台无关,编译生成的中间码也与平台无关(一次编译,到处运行),中间码再由解释器解释执行,解释器是与平台相关的,也就是不同的平台需要不同的解释器
常用DOS命令
Microsoft公司推出的操作系统。(在windows之前的操作系统)
DOS是英文”Disk Operating System”的缩写,其中文含意是”磁盘操作系统”.
DOS是单用户、单任务的操作系统.(只能执行一个任务)
windows中,通过鼠标菜单等来操作系统,而在dos操作系统中,要通过dos命令来操作系统。
DOS操作系统的命令,是一种面向磁盘的操作命令,不区分大小写。
windows给我们保留了类似dos系统的操作界面,可以直接操作磁盘!
dos 也是一种操作系统,是在windows出现以前用的,后来windows出来后基本没人用了,但是当windows崩溃的时候,还是要的dos方式解决
它是一种纯命令方式,cmd其实就是在windows状态下进入dos方式。
控制命令台:win+r--->cmd
具体dos命令(不区分大小写)
切换盘符: c: d: e:
显示详细信息:dir
改变当前目录:cd youdir
或 pushd youdir
代表当前目录:.
代表上一层目录:..
清屏:cls
切换历史命令:上下箭头
补全命令: tab
按键
创建目录:md a
删除目录:rd a
复制文件命令:copy old.txt a/new.txt
删除文件:del
del后面如果接的是文件夹/目录,那么删除的就是这个文件夹下的文件,而不是文件夹
JDK环境
下载 JDK
安装JDK:一直下一步就行
卸载JDK:控制面板卸载
验证安装:① 去安装目录下看一眼;② 通过控制命令台查看;③ 通过控制面板查看
JDK: Java Development kit —->编写Java程序的程序员使用的软件
JRE : Java Runtime Enviroment —-》运行Java程序的用户使用的软件
添加环境变量
Notepad、IDEA安装 这里使用 IDEA ……
编写代码 1 2 3 4 5 6 7 8 9 public class Test { public static void main (String[] args) { HelloWord(); } public static void HelloWord () { String a = "hi 这是\n一段\tJava程序。。。" ; System.out.println(a); } }
编译、解析/翻译/执行
1 2 javac Test.java java Test
扩展
1 2 3 javac Test.java javap -v Test.class
代码中常见问题
最低级的错误:单词拼写错误
要求源文件名字(Test.java)和类名(Test)必须一模一样
所有的标点必须是英文状态下的
中文状态:【】() {} ! ; : “ ‘ 《》 ?
英文状态:[] () {} ! ; : " ' <> ?
成对编程:[] {} () <> "" ''
注意缩进 :只要遇到{}就进行缩进 —>为了格式好看
编译:javac Test.java
执行:java Test
Java中大小写严格区分,大小敏感
一个源文件中可以有多个类,只能有一个类被public修饰,源文件的名字必须跟public修饰的那个类名保持一致
环境变量
classpath 环境变量
JAVA_HOME 环境变量
代码注释 为了方便程序的阅读,Java语言允许程序员在程序中写上一些说明性的文字,用来提高程序的可读性,这些文字性的说明就称为注释;注释不会出现在字节码文件中,即Java编译器编译时会跳过注释语句
单行注释:单行注释使用//
开头,//
后面的单行内容均为注释
多行注释:多行注释以/*
开头以*/
结尾,在使用时要注意,多行注释不能嵌套使用
文档注释:文档注释以/**
开头以*/
结尾,注释中包含一些说明性的文字及一些JavaDoc标签(后期写项目时,可以生成项目的API)
文档注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class Test { public static void main (String[] args) { System.out.println("hi....java1" ); } public void eat (String name,int age) { System.out.println("hello" ); } }
一般文档注释可以配合:jdk提供的工具javadoc.exe来一起使用,通过javadoc.exe可以对文档注释进行解析,生成一套以网页文件形式体现的该程序的说明文档(自定义类对应的API)
1 javadoc -encoding UTF-8 -d myHello -author -version Test.java
扩展面试题
JDK,JRE,JVM的区别
JDK(Java Development Kit)是Java开发工具包,是面向开发者的
JRE(Java Runtime Enviroment)是Java的运行环境,面向使用JAVA程序的用户
JVM( java virtual machine)是常常听到Java虚拟机
JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre(JVM+Lib=JRE)
具体点就是bin目录下的jvm.dll文件, jvm.dll无法单独工作,当jvm.dll启动后,会使用explicit的方法(就是使用Win32 API之中的LoadLibrary()与GetProcAddress()来载入辅助用的动态链接库),而这些辅助用的动态链接库(.dll)都必须位 于jvm.dll所在目录的父目录之中。因此想使用哪个JVM,只需要设置PATH,指向JRE所在目录下的jvm.dll
数据类型 Java是一种强类型语言,每个变量都必须声明其数据类型 Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)
PS:巧妙记忆,除了基本数据类型以外的所有类型都属于引用数据类型,这里说一下基本数据类型
标识符
标识符:读音 biao zhi fu
包,类,变量,方法…..等等,只要是起名字的地方,那个名字就是标识符
标识符定义规则
四个可以(组成部分):数字,字母,下划线_,美元符号$
注意:字母概念比较宽泛,指的是英文字母,汉字,日语,俄语……
一般起名字尽量使用英文字母
两个不可以:不可以以数字开头,不可以使用java中的关键字
见名知意:增加可读性
大小写敏感: int a ; int A;
遵照驼峰命名
类名:首字母大写,其余遵循驼峰命名
方法名,变量名:首字母小写,其余遵循驼峰命名
包名:全部小写,不遵循驼峰命名
长度无限制,但是不建议太长 asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasfd
关键字
被JAVA语言赋予了特殊含义,用作专门用途的单词
特点:JAVA中所有关键字都为小写
官网
变量与常量
变量
常量:指的是一个固定的值,主要是利用关键字final来定义一个常量
字面常量:一般将1、2、3、’a’、’b’、true、false、”helloWorld”等称为字面常量
整型常量:123 33
实型常量:3.1415925
字符常量:’a’
逻辑常量:true false
字符串常量:”helloworld”
字符常量:使用final修饰的PI等称为符号常量(字符常量)
变量的声明
如果你只定义一个变量,没有给变量进行赋值的话,那么其实这个变量相当于没有定义
变量如果没有进行赋值的话,那么使用的时候会出错,告诉你:尚未初始化变量
变量定义的时候直接就可以用一句话定义:int age = 10;
变量的值可以更改(age = age+10),变量不可以重复定义(int age=10;int age=20)
变量的作用域
作用域指的就是作用范围,变量在什么范围中有效;作用范围就是离它最近的{}
备注:以下写的代码,不要去运行,会出错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public class TestVar { int b = 20 ; public static void main (String[] args) { System.out.println(a); int a = 10 ; System.out.println(a); System.out.println(b); { int c = 40 ; System.out.println(c); int a = 50 ; } System.out.println(c); } public void eat () { System.out.println(b); System.out.println(a); int a = 30 ; System.out.println(a); } }
整数类型
常量
十进制整数,如:99, -500, 0
八进制整数,要求以 0 开头,如:015
十六进制数,要求 0x 或 0X 开头,如:0x15
二进制:要求0b或者0B开头,如:0b11
几进制:就是逢几进1的问题
平时实际生活中用的最多的是十进制;计算机用二进制最多
变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public class TestVar05 { public static void main (String[] args) { int num1 = 12 ; System.out.println(num1); int num2 = 012 ; System.out.println(num2); int num3 = 0x12 ; System.out.println(num3); int num4 = 0b10 ; System.out.println(num4); byte b = 126 ; System.out.println(b); short s = 30000 ; System.out.println(s); int i = 1234 ; System.out.println(i); long num5 = 12345678910L ; System.out.println(num5); long num6 = 12 ; System.out.println(num6); } }
浮点类型
常量
十进制数形式,例如:3.14 314.0 0.314
科学记数法形式
314e2 314E2 (E的大小写没有区分) 314E-2
double f = 314e2; //31410^2–>31400.0
double f2 = 314e-2; //314 10^(-2)–>3.14
变量
float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。 而double表示这种类型的数值精度约是float类型的两倍,又被称作双精度类型,绝大部分应用程序都采用double类型。 float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。 也可以在浮点数值后添加后缀D或者d, 以明确其为double类型。
PS:有效数字指的是从左开始第一个不为0的数到最后一个数,并不是小数点后开始数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public class TestVar { public static void main (String[] args) { double num1 = 3.14 ; System.out.println(num1); double num2 = 314E-2 ; System.out.println(num2); float f1 = 3.14234567898623F ; System.out.println(f1); double d1 = 3.14234567898623D ; System.out.println(d1); float f2 = 0.3F ; double d2 = 0.3 ; System.out.println(f2==d2); } }
字符类型
Java中使用单引号
来表示字符常量,字符型在内存中占2个字节
char 类型用来表示在Unicode编码表中的字符
Unicode编码被设计用来处理各种语言的文字,它占2个字节,可允许有65536个字符
转义字符
ASCII表
Unicode编码表
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class TestVar { public static void main (String[] args) { char ch1 = 'a' ; System.out.println(ch1); char ch2 = 'A' ; System.out.println(ch2); char ch3 = '4' ; System.out.println(ch3); char ch4 = '中' ; System.out.println(ch4); char ch5 = '?' ; System.out.println(ch5); char ch6 = ' ' ; System.out.println(ch6); System.out.println("--------------------------------" ); char ch7 = '\n' ; System.out.println("aaa" +ch7+"bbb" ); System.out.println("aaa\nbbb" ); System.out.println("aaaaaaa\tbbb" ); System.out.println("aaa\bbbb" ); System.out.println("aaa\rbbb" ); System.out.println("\"java\"" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class TestVar { public static void main (String[] args) { char ch1 = 'A' ; System.out.println(ch1); System.out.println(ch1+90 ); System.out.println(155 -ch1); char ch2 = '中' ; System.out.println(ch2); System.out.println(ch2+90 ); System.out.println(20103 -ch2); int num1 = (int )ch2; System.out.println(num1); char ch = (char )20013 ; System.out.println(ch); int num2 = '中' ; char ch5 = 20013 ; System.out.println(ch5); char ch6 = '2' +2 ; System.out.println(ch6); } }
布尔类型 boolean类型有两个常量值,true和false,在内存中占一位(不是一个字节),不可以使用 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。 boolean 类型用来判断逻辑条件,一般用于程序流程控制
1 2 3 4 5 6 7 8 9 10 11 12 13 public class TestVar { public static void main (String[] args) { boolean flag1 = true ; System.out.println(flag1); boolean flag2 = false ; System.out.println(flag2); boolean flag3 = 5 ==9 ; System.out.println(flag3); boolean flag4 = 5 <9 ; System.out.println(flag4); } }
基本数据类型的转换 在赋值运算或者算数运算的时候,要求数据类型一致,就要进行类型的转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public class TestVar { public static void main (String[] args) { double d = 6 ; System.out.println(d); int i = (int )6.5 ; System.out.println(i); double d2 = 12 +1294L +8.5F +3.81 +'a' ; System.out.println(d2); int i2 = (int )(12 +1294L +8.5F +3.81 +'a' ); System.out.println(i2); byte b = 12 ; System.out.println(b); byte b2 = (byte )270 ; System.out.println(b2); } }
习题
实现求圆的周长和面积
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package com.excepenxi;import java.util.Scanner;public class Test2 { public static void main (String[] args) { final double PI = 3.14 ; Scanner sc = new Scanner (System.in); System.out.print("请输入一个半径:" ); int r = sc.nextInt(); double c = 2 *PI*r; System.out.println("周长为:" +c); double s = PI*r*r; System.out.println("面积为:" +s); } }
加深Scanner使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import java.util.Scanner;public class TestVar { public static void main (String[] args) { Scanner sc = new Scanner (System.in); System.out.print("请录入年龄:" ); int age = sc.nextInt(); System.out.print("请录入身高:" ); double height = sc.nextDouble(); System.out.print("请录入姓名:" ); String name = sc.next(); System.out.print("请录入性别:" ); String sexStr = sc.next(); char sex = sexStr.charAt(0 ); System.out.println("该学生的信息为:姓名是:" +name+",年龄是:" +age+",身高为:" +height+",性别是:" +sex); } }
运算符
算数运算符:+,-,*,/,%,++(自增),--(自减)
赋值运算符:=
扩展赋值运算符:+=,-=,*=,/=
关系运算符:>,<,>=,<=,==,!=
逻辑运算符:&,|, &&,||,!,^
位运算符: &,|,^,~ , >>,<<,>>> (了解!!!)
条件运算符:?:
1 2 3 4 5 # 相关概念辨析 + 运算符 操作符 Operator 5+6 表达式 expression 5 6 操作数 Operand int m =5+6; 语句 Sentence
算数运算符
/ 除法运算符 : 表示两个数相除运算
% 取余运算符: 用来求余数的
+的作用
++
无论这个变量是否参与到运算中去,只要用++运算符,这个变量本身就加1操作 只是说如果变量参与到运算中去的话,对运算结果是产生影响: 看++在前还是在后,如果++在后:先运算,后加1 如果++在前,先加1,后运算
1 2 3 4 5 6 7 8 9 public class TestOpe01 { public static void main (String[] args) { System.out.println(12 /3 ); System.out.println(12 %5 ); System.out.println(12 /3.0 ); System.out.println(12 %5.0 ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class TestOpe02 { public static void main (String[] args) { System.out.println(+5 ); System.out.println(5 +6 ); System.out.println(5 +'6' ); int num = 56 ; System.out.println("num=" +num); System.out.println(5 +6 +"7" ); System.out.println(5 +'6' +"7" ); System.out.println("5" +6 +"7" ); System.out.println("5" +'6' +"7" ); System.out.println("5" +'6' +'7' ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class TestOpe03 { public static void main (String[] args) { int a = 5 ; a++; System.out.println(a); a = 5 ; ++a; System.out.println(a); a = 5 ; int m = a++ + 7 ; System.out.println(m); System.out.println(a); a = 5 ; int n = ++a + 7 ; System.out.println(n); System.out.println(a); } }
1 2 3 4 5 6 7 8 9 public class TestOpe04 { public static void main (String[] args) { int a = 5 ; System.out.println(a++ + a++); System.out.println(a++ + ++a); System.out.println(++a + a++); System.out.println(++a + ++a); } }
赋值运算符 =的作用: 将等号右侧的值赋给等号左侧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class TestOpe06 { public static void main (String[] args) { int num1 = 10 ; int num2 = 20 ; System.out.println("交换前:" +num1+"\t" +num2); int t; t = num1; num1 = num2; num2 = t; System.out.println("交换后:" +num1+"\t" +num2); } }
面试题:两个数交换的四种方式
扩展赋值运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class TestOpe07 { public static void main (String[] args) { int num1 = 10 ; int num2 = 20 ; int num3 = 30 ; int sum = 0 ; sum = sum + num1; sum = sum + num2; sum = sum + num3; System.out.println("和:" +sum); } }
a+=b 和 a=a+b 区别:
a+=b 可读性稍差 编译效率高 底层自动进行类型转换
a=a+b 可读性好 编译效率低 手动进行类型转换
面试题
请问a+=b相当于a=a+b,那么也相当于 a=b+a吗
下面的代码哪一句出错: 第4行
1 2 3 4 5 byte a = 10 ; --->1 int b = 20 ; --->2 a+=b; ---->3 a = a+b ;---->4
关系运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 public class TestOpe08 { public static void main (String[] args) { System.out.println(4 >9 ); System.out.println(4 <9 ); System.out.println(4 >=9 ); System.out.println(4 <=9 ); System.out.println(4 ==9 ); System.out.println(4 !=9 ); System.out.println((5 <9 )!=(6 ==8 )); } }
逻辑运算符 &,|, &&,||,!,^
逻辑运算符:进行逻辑运算的,运算符左右连接的都是 布尔类型的操作数,最终表达式的结果是布尔值:要么是true,要么false
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 public class TestOpe09 { public static void main (String[] args) { System.out.println(true &true ); System.out.println(true &false ); System.out.println(false &false ); System.out.println(false &true ); System.out.println(true &&true ); System.out.println(true &&false ); System.out.println(false &&false ); System.out.println(false &&true ); System.out.println(true |true ); System.out.println(true |false ); System.out.println(false |false ); System.out.println(false |true ); System.out.println(true ||true ); System.out.println(true ||false ); System.out.println(false ||false ); System.out.println(false ||true ); System.out.println(!true ); System.out.println(!false ); System.out.println(true ^true ); System.out.println(true ^false ); System.out.println(false ^false ); System.out.println(false ^true ); } }
再做一个加深的练习:看代码 说结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class TestOpe10 { public static void main (String[] args) { int i=8 ; System.out.println((5 >7 )&&(i++==2 )); System.out.println(i); int a=8 ; System.out.println((5 >7 )&(a++==2 )); System.out.println(a); int m=8 ; System.out.println((5 <7 )&&(m++==2 )); System.out.println(m); int b=2 ; System.out.println((5 <7 )&(b++==2 )); System.out.println(b); int c=2 ; System.out.println((5 <7 )&(++c==2 )); System.out.println(c); } }
条件运算符 条件运算符:又称三元运算符/三目运算符
格式:a?b:c
其中a是一个布尔类型的表达式,返回结果要么是true要么false,通过a的结果决定最终表达式的结果: 如果a的结果是true,那么表达式最终结果为b 如果a的结果是false,那么表达式最终结果为c
1 2 3 4 5 6 7 8 9 10 11 public class TestOpe11 { public static void main (String[] args) { int num = (5 >7 )?6 :9 ; System.out.println(num); String str = (4 ==4 )?"你好" :"你不好" ; System.out.println(str); System.out.println((4 ==4 )?"你好" :"你不好" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import java.util.*;public class TestOpe12 { public static void main (String[] args) { Scanner sc = new Scanner (System.in); System.out.println("请选择今晚吃什么:1.火锅 2.烧烤 3.麻辣烫 4.西餐" ); System.out.println("请男孩选择:" ); int boyChoice = sc.nextInt(); System.out.println("请女孩选择:" ); int girlChoice = sc.nextInt(); System.out.println(boyChoice==girlChoice?"听男孩的" :"听女孩的" ); } }
PS:三目运算符可以代替后续的if-else
位运算符 &,|,^,~ , >>,<<,>>>
如何区分逻辑运算符和位运算符: 逻辑运算符:左右连接的是布尔类型的操作数 位运算符:左右连接的是具体的数值
流程控制 if分支结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
实现一个功能:给出三个数(1-6),对三个数求和计算,根据和的大小来分配不同的奖品
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package com.excepenxi;public class Test5_if { public static void main (String[] args) { int num1 = (int )(Math.random()*6 ) +1 ; int num2 = (int )(Math.random()*6 ) +1 ; int num3 = (int )(Math.random()*6 ) +1 ; int sum = 0 ; sum+=num1+=num2+=num3; if (sum<=14 && sum>=10 ) { System.out.println("一等奖" ); }else if (sum<10 && sum>=6 ){ System.out.println("三等奖" ); }else if (sum<6 ){ System.out.println("四等奖" ); }else { System.out.println("未中奖" ); } System.out.println(sum>=10 ?"中奖了" :"没中奖" ); } }
程序的优化:会员购物时,不同积分享受的折扣不同,规则如下
会员积分x
折扣
x≥8000
6折
4000≤x<8000
7折
2000≤x<4000
8折
x<2000
9折
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package com.excepenxi;import java.util.Scanner;public class Test6_if { public static void main (String[] args) { Scanner sc = new Scanner (System.in); System.out.print("请输入会员积分:" ); if (sc.hasNextInt()==true ) { int score = sc.nextInt(); if (score>=0 ) { String discount = "" ; if (score >= 8000 ) { discount = "0.6" ; } else if (score >= 4000 ) { discount = "0.7" ; } else if (score >= 2000 ) { discount = "0.8" ; } else { discount = "0.9" ; } System.out.println("该会员享受的折扣是:" +discount); }else { System.out.println("您输入的是负数,不符合需求!!!" ); } }else { System.out.println("会员积分请输入整数!!!" ); } } }
逻辑题:小朋友搬桌子
年龄大于7岁,可以搬桌子; 如果年龄大于5岁,性别是男,可以搬桌子; 否则不可以搬动桌子,提示:你还太小
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package com.excepenxi;import java.util.Scanner;public class Test7_if { public static void main (String[] args) { Scanner sc = new Scanner (System.in); System.out.print("请输入你的年龄:" ); if (sc.hasNextInt()==true ) { int age = sc.nextInt(); if (age>=0 ){ if (age>=7 ) { System.out.println("搬桌子" ); }else if (age>=5 ){ System.out.print("请输入你的性别 男为1,女为0:" ); int sex = sc.nextInt(); if (sex==1 ) { System.out.println("男,可搬桌子" ); }else if (sex==0 ){ System.out.println("女,不可搬桌子" ); }else { System.out.println("性别请输入0或1" ); } }else { System.out.println("你还太小" ); } }else { System.out.println("请输入正数!!!" ); } }else { System.out.println("输入错误!!!" ); } } }
switch多分支结构 1 2 3 4 5 6 7 8 9 10 switch (表达式) { case 值1 : 语句序列1 ; [break ]; case 值2 : 语句序列2 ; [break ]; … … … … … [default :默认语句;] }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
switch语句会根据表达式的值从相匹配的case标签处开始执行,一直执行到break语句处或者是switch语句的末尾。如果表达式的值与任一case值不匹配,则进入default语句(如果存在default语句的情况)。根据表达式值的不同可以执行许多不同的操作。switch语句中case标签在JDK1.5之前必须是整数(long类型除外)或者枚举,不能是字符串,在JDK1.7之后允许使用字符串(String)。大家要注意,当布尔表达式是等值判断的情况,可以使用if-else if-else多分支结构或者switch结构,如果布尔表达式区间判断的情况,则只能使用if-else if-else多分支结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class TestSwitch { public static void main (String[] args) { int score = 86 ; switch (score/10 ){ case 10 : case 9 : System.out.println("A级" );break ; case 8 : System.out.println("B级" );break ; case 7 : System.out.println("C级" );break ; case 6 : System.out.println("D级" );break ; default :System.out.println("成绩错误" );break ; case 5 : case 4 : case 3 : case 2 : case 1 : case 0 : System.out.println("E级" );break ; } } }
while循环 1 2 3 4 5 6 7 8 9 10 11 while (布尔表达式) { 循环体; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class TestWhile { public static void main (String[] args) { int num = 1 ; int sum = 0 ; while (num<=5 ){ sum += num; num++; } System.out.println(sum); } }
练习
1+2+3+4+5+。。。。+100
2+4+6+8+。。。。+998+1000
5+10+15+20+。。。+100
99+97+95+。。5+3+1
1*3*5*7*9*11*13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 public class TestWhile02 { public static void main (String[] args) { int i = 1 ; int result = 1 ; while (i<=13 ){ result *= i; i = i+2 ; } System.out.println(result); } }
do-while循环 1 2 3 do { 循环体; } while (布尔表达式) ;
do-while循环结构会先执行循环体,然后再判断布尔表达式的值,若条件为真,执行循环体,当条件为假时,结束循环。do-while循环的循环体至少执行一次
1 2 3 4 5 6 7 8 9 10 11 12 13 while :先判断,再执行do -while :先执行,再判断---》至少被执行一次,从第二次开始才进行判断 while (考试是否通过){ 考试; } do { 考试; }while (考试是否通过);
练习:1+2+3+4+...100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class TestDoWhile { public static void main (String[] args) { int i = 101 ; int sum = 0 ; do { sum += i; i++; }while (i<=100 ); System.out.println(i); System.out.println(sum); } }
for循环 for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。for循环在第一次反复之前要进行初始化,即执行初始表达式;随后,对布尔表达式进行判定,若判定结果为true,则执行循环体,否则,终止循环;最后在每一次反复的时候,进行某种形式的“步进”,即执行迭代因子
初始化部分设置循环变量的初值
条件判断部分为任意布尔表达式
迭代因子控制循环变量的增减
for循环在执行条件判定后,先执行的循环体部分,再执行步进
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 for (初始表达式; 布尔表达式; 迭代因子) { 循环体; } for (;;){} -->死循环 int i = 1 ; for (;i<=100 ;){ sum += i; i++; } for (;;){} while (true ){} do { }while (true ); 第一类:当型 while (){} for (;;){} 第二类:直到型 do {}while ();
练习:1+2+3+..+100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class TestFor { public static void main (String[] args) { int sum = 0 ; int i; for (i = 1 ;i<=100 ;i++){ sum += i; } System.out.println(sum); System.out.println(i); } }
关键字:break、continue、return 在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class TestFor03 { public static void main (String[] args) { for (int i=1 ;i<=100 ;i++){ System.out.println(i); while (i==36 ){ break ; } } } }
break带标签的使用
1 2 3 4 5 6 7 8 9 10 11 12 public class TestFor04 { public static void main (String[] args) { outer: for (int i=1 ;i<=100 ;i++){ System.out.println(i); while (i==36 ){ break outer; } } } }
continue的作用:在循环语句体中,用于终止某次循环过程,结束本次循环,继续下一次循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class TestFor06 { public static void main (String[] args) { for (int i=1 ;i<=100 ;i++){ while (i==36 ){ System.out.println("------" ); continue ; } System.out.println(i); } } }
continue带标签的使用
1 2 3 4 5 6 7 8 9 10 11 12 public class TestFor07 { public static void main (String[] args) { outer: for (int i=1 ;i<=100 ;i++){ while (i==36 ){ continue outer; } System.out.println(i); } } }
return的作用:跟循环无关,就是程序中遇到return那么return所在的那个方法就停止执行了
1 2 3 4 5 6 7 8 9 10 11 12 public class TestFor08 { public static void main (String[] args) { for (int i=1 ;i<=100 ;i++){ while (i==36 ){ return ; } System.out.println(i); } System.out.println("-----" ); } }
循环练习
输出1-100中被5整除的数,每行输出6个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class TestFor09 { public static void main (String[] args) { int count = 0 ; for (int i=1 ;i<=100 ;i++){ if (i%5 ==0 ){ System.out.print(i+"\t" ); count++; if (count%6 ==0 ){ System.out.println(); } } } } }
实现一个功能
请录入10个整数,当输入的数是666的时候,退出程序
判断其中录入正数的个数并输出
判断系统的退出状态:是正常退出还是被迫退出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import java.util.Scanner;public class TestFor10 { public static void main (String[] args) { int count = 0 ; boolean flag = true ; Scanner sc = new Scanner (System.in); for (int i=1 ;i<=10 ;i++){ System.out.println("请录入第" +i+"个数:" ); int num = sc.nextInt(); if (num>0 ){ count++; } if (num==666 ){ flag = false ; break ; } } System.out.println("你录入的正数的个数为:" +count); if (flag){ System.out.println("正常退出!" ); }else { System.out.println("被迫退出!" ); } } }
双重循环
乘法口诀
1 2 3 4 5 6 7 8 9 10 1 *1 =1 1 *2 =2 2 *2 =4 1 *3 =3 2 *3 =6 3 *3 =9 1 *4 =4 2 *4 =8 3 *4 =12 4 *4 =16 1 *5 =5 2 *5 =10 3 *5 =15 4 *5 =20 5 *5 =25 1 *6 =6 2 *6 =12 3 *6 =18 4 *6 =24 5 *6 =30 6 *6 =36 1 *7 =7 2 *7 =14 3 *7 =21 4 *7 =28 5 *7 =35 6 *7 =42 7 *7 =49 1 *8 =8 2 *8 =16 3 *8 =24 4 *8 =32 5 *8 =40 6 *8 =48 7 *8 =56 8 *8 =64 1 *9 =9 2 *9 =18 3 *9 =27 4 *9 =36 5 *9 =45 6 *9 =54 7 *9 =63 8 *9 =72 9 *9 =81
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 public class TestFor11 { public static void main (String[] args) { for (int j=1 ;j<=9 ;j++){ for (int i=1 ;i<=j;i++){ System.out.print(i+"*" +j+"=" +i*j+"\t" ); } System.out.println(); } } }
1 2 3 4 5 6 7 8 9 1 *9 =9 2 *9 =18 3 *9 =27 4 *9 =36 5 *9 =45 6 *9 =54 7 *9 =63 8 *9 =72 9 *9 =81 1 *8 =8 2 *8 =16 3 *8 =24 4 *8 =32 5 *8 =40 6 *8 =48 7 *8 =56 8 *8 =64 1 *7 =7 2 *7 =14 3 *7 =21 4 *7 =28 5 *7 =35 6 *7 =42 7 *7 =49 1 *6 =6 2 *6 =12 3 *6 =18 4 *6 =24 5 *6 =30 6 *6 =36 1 *5 =5 2 *5 =10 3 *5 =15 4 *5 =20 5 *5 =25 1 *4 =4 2 *4 =8 3 *4 =12 4 *4 =16 1 *3 =3 2 *3 =6 3 *3 =9 1 *2 =2 2 *2 =4 1 *1 =1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class TestFor12 { public static void main (String[] args) { for (int j=9 ;j>=1 ;j--){ for (int i=1 ;i<=j;i++){ System.out.print(i+"*" +j+"=" +i*j+"\t" ); } System.out.println(); } } }
打印各种形状
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 for (int j=1 ;j<=4 ;j++){ for (int i=1 ;i<=9 ;i++){ System.out.print("*" ); } System.out.println(); } for (int j=1 ;j<=4 ;j++){ for (int i=1 ;i<=5 ;i++){ System.out.print(" " ); } for (int i=1 ;i<=9 ;i++){ System.out.print("*" ); } System.out.println(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 for (int j=1 ;j<=4 ;j++){ for (int i=1 ;i<=(9 -j);i++){ System.out.print(" " ); } for (int i=1 ;i<=9 ;i++){ System.out.print("*" ); } System.out.println(); } for (int j=1 ;j<=4 ;j++){ for (int i=1 ;i<=(9 -j);i++){ System.out.print(" " ); } for (int i=1 ;i<=(2 *j-1 );i++){ System.out.print("*" ); } System.out.println(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 for (int j=1 ;j<=4 ;j++){ for (int i=1 ;i<=(9 -j);i++){ System.out.print(" " ); } for (int i=1 ;i<=(2 *j-1 );i++){ System.out.print("*" ); } System.out.println(); } for (int j=1 ;j<=3 ;j++){ for (int i=1 ;i<=(j+5 );i++){ System.out.print(" " ); } for (int i=1 ;i<=(7 -2 *j);i++){ System.out.print("*" ); } System.out.println(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 for (int j=1 ;j<=4 ;j++){ for (int i=1 ;i<=(9 -j);i++){ System.out.print(" " ); } for (int i=1 ;i<=(2 *j-1 );i++){ if (i==1 ||i==(2 *j-1 )){ System.out.print("*" ); }else { System.out.print(" " ); } } System.out.println(); } for (int j=1 ;j<=3 ;j++){ for (int i=1 ;i<=(j+5 );i++){ System.out.print(" " ); } for (int i=1 ;i<=(7 -2 *j);i++){ if (i==1 ||i==(7 -2 *j)){ System.out.print("*" ); }else { System.out.print(" " ); } } System.out.println(); }
菱形第二种打印方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class TestFor14 { public static void main (String[] args) { int size = 17 ; int startNum = size/2 +1 ; int endNum = size/2 +1 ; boolean flag = true ; for (int j=1 ;j<=size;j++){ for (int i=1 ;i<=size;i++){ if (i>=startNum&&i<=endNum){ System.out.print("*" ); }else { System.out.print(" " ); } } System.out.println(); if (endNum==size){ flag = false ; } if (flag){ startNum--; endNum++; }else { startNum++; endNum--; } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class TestFor14 { public static void main (String[] args) { int size = 17 ; int startNum = size/2 +1 ; int endNum = size/2 +1 ; boolean flag = true ; for (int j=1 ;j<=size;j++){ for (int i=1 ;i<=size;i++){ if (i==startNum||i==endNum){ System.out.print("*" ); }else { System.out.print(" " ); } } System.out.println(); if (endNum==size){ flag = false ; } if (flag){ startNum--; endNum++; }else { startNum++; endNum--; } } } }
三重循环 二重循环可以帮我们解决:二元一次方程组的问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class TestFor15 { public static void main (String[] args) { for (int a=1 ;a<=5 ;a++){ for (int b=3 ;b<=6 ;b++){ if (a+b==7 ){ System.out.println(a+"----" +b); } } } } }
三重循环可以帮我们解决:三元一次方程组的问题
百钱买百鸡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public class TestFor16 { public static void main (String[] args) { for (int x=1 ;x<=19 ;x++){ for (int y=1 ;y<=31 ;y++){ int z = 100 -x-y; if ((5 *x+3 *y+z/3 ==100 )&&(z%3 ==0 )){ System.out.println(x+"\t" +y+"\t" +z); } } } } }
方法的定义、调用、重载
方法(method)就是一段用来完成特定功能的代码片段,类似于其它语言的函数(function)
方法用于定义该类或该类的实例的行为特征和功能实现,方法是类和对象行为特征的抽象
方法很类似于面向过程中的函数;面向过程中,函数是最基本单位,整个程序由一个个函数调用组成
面向对象中,整个程序的基本单位是类,方法是从属于类和对象的
方法的定义、调用 1 2 3 4 5 6 [修饰符1 修饰符2 …] 返回值类型 方法名(形式参数列表){ Java语句;… … … } 对象名.方法名(实参列表)
形式参数:在方法声明时用于接收外界传入的数据
实参:调用方法时实际传给方法的数据
返回值:方法在执行完毕后返还给调用它的环境的数据
返回值类型:事先约定的返回值的数据类型,如无返回值,必须显示指定为为void
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public class TestMethod01 { public static int add (int num1,int num2) { int sum = 0 ; sum += num1; sum += num2; return sum; } public static void main (String[] args) { int num = add(10 ,20 ); System.out.println(num); int sum = add(30 ,90 ); System.out.println(sum); System.out.println(add(50 ,48 )); } }
方法是:对特定的功能进行提取,形成一个代码片段,这个代码片段就是我们所说的方法
方法和方法是并列的关系,所以我们定义的方法不能写到main方法中
方法的定义–》格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 修饰符 方法返回值类型 方法名(形参列表){ 方法体; return 方法返回值; } 对象名.方法名(实参列表) public static int add (int num1,int num2) { int sum = 0 ; sum += num1; sum += num2; return sum; } public static void main (String[] args) { System.out.println(add(50 ,48 )); }
方法的作用:提高代码的复用性
总结方法定义的格式:
修饰符: 暂时使用public static —>具体查看面向对象
方法返回值类型 : 方法的返回值对应的数据类型
数据类型: 可以是基本数据类型(byte,short,int,long,float,double,char,boolean)
也可以是引用数据类型
方法名 :见名知意,首字母小写,其余遵循驼峰命名, eg: addNum ,一般尽量使用英文来命名
形参列表 :方法定义的时候需要的形式参数
int num1, int num2 –>相当于告诉方法的调用者:需要传入几个参数,需要传入的参数的类型
实际参数:方法调用的时候传入的具体的参数: 10,20 –>根据形式参数的需要传入的
方法体:具体的业务逻辑代码
return 方法返回值
方法如果有返回值的话: return+方法返回值,将返回值返回到方法的调用处
方法没有返回值的话:return可以省略不写了,并且方法的返回值类型为:void
什么时候有返回值,什么时候没有返回值? 看心情–》看需求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class TestMethod02 { public static void add (int num1,int num2) { int sum = 0 ; sum += num1; sum += num2; System.out.println(sum); } public static void main (String[] args) { add(10 ,20 ); add(30 ,90 ); } }
方法的定义需要注意什么?
形参列表要怎么写:定义几个参数,分别是什么类型的 —》不确定因素我们会当做方法的形参
方法到底是否需要返回值 ,如果需要的话,返回值的类型是什么
方法的调用需要注意什么?
实际参数要怎么传入:传入几个参数,传入什么类型的
方法是否有返回值需要接收
练习
功能:我心里有一个数,你来猜,看是否猜对
TestMethod03 1 2 3 4 5 6 7 8 9 10 11 12 13 import java.util.Scanner;public class TestMethod03 { public static void main (String[] args) { Scanner sc = new Scanner (System.in); System.out.print("请你猜一个数:" ); int yourGuessNum = sc.nextInt(); int myHeartNum = 5 ; System.out.println(yourGuessNum==myHeartNum?"猜对了" :"猜错了" ); } }
对猜数功能提取为一个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import java.util.Scanner;public class TestMethod03 { public static void main (String[] args) { Scanner sc = new Scanner (System.in); System.out.print("请你猜一个数:" ); int yourGuessNum = sc.nextInt(); guessNum(yourGuessNum); } public static void guessNum (int yourNum) { int myHeartNum = (int )(Math.random()*6 )+1 ; System.out.println(yourNum==myHeartNum?"猜对了" :"猜错了" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class TestM { public static void main (String[] args) { int a=10 ; int b=20 ; System.out.println("输出交换前的两个数:" +a+"---" +b); changeNum(a,b); System.out.println("输出交换后的两个数:" +a+"---" +b); } public static void changeNum (int num1,int num2) { int t; t=num1; num1=num2; num2=t; } }
1 2 3 4 5 输出交换前的两个数:10 ---20 输出交换后的两个数:10 ---20
方法的重载 方法的重载是指一个类中可以定义多个方法名相同,但参数不同的方法。 调用时,会根据不同的参数自动匹配对应的方法。
注意本质:重载的方法,实际是完全不同的方法,只是名称相同而已!
构成方法重载的条件:
不同的含义:形参类型、形参个数、形参顺序不同
只有返回值不同不构成方法的重载
如:int a(String str){}与 void a(String str){}不构成方法重载
只有形参的名称不同,不构成方法的重载
如:int a(String str){}与int a(String s){}不构成方法重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class TestMethod05 { public static void main (String[] args) { int sum = add(10 ,20 ); System.out.println(sum); System.out.println(add(20 ,40 ,80 )); System.out.println(add(30 ,60 ,90 ,120 )); System.out.println(add(9.8 ,4.7 )); } public static int add (int num1,int num2) { return num1+num2; } public static int add (int num1,int num2,int num3) { return num1+num2+num3; } public static int add (int num1,int num2,int num3,int num4) { return num1+num2+num3+num4; } public static double add (double num1,double num2) { return num1+num2; } }
方法的重载:在同一个类中,方法名相同,形参列表不同的多个方法,构成了方法的重载
方法的重载只跟:方法名和形参列表有关,与修饰符,返回值类型无关
注意:形参列表不同指的是什么?
个数不同
add() add(int num1) add(int num1,int num2)
顺序不同
add(int num1,double num2) add(double num1,int num2)
类型不同
add(int num1) add(double num1)
请问下面的方法是否构成了方法的重载?
add(int a) 和 add(int b) —>不构成,相当于方法的重复定义
public static int add(int a) 和 public static void add(int b) —>不构成
扩展
TestMethod06 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class TestMethod06 { public static void main (String[] args) { add(5 ); } public static void add (double num1) { System.out.println("------2" ); } public static void add (float num1) { System.out.println("------3" ); } public static void add (long num1) { System.out.println("------4" ); } }
数组 定义 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import java.util.Scanner;public class TestArray01 { public static void main (String[] args) { int sum = 0 ; Scanner sc = new Scanner (System.in); for (int i=1 ;i<=10 ;i++){ System.out.print("请录入第" +i+"个学生的成绩:" ); int score = sc.nextInt(); sum += score; } System.out.println("十个学生的成绩之和为:" +sum); System.out.println("十个学生的成绩平均数为:" +sum/10 ); } }
缺点:就是不能求每个学生的成绩具体是多少
解决:将成绩进行存储 —-》 引入 : 数组
数组的作用:数组用来存储数据的,在程序设计中,为了处理方便,数组用来将相同类型的若干数据组织起来,这个若干数据的集合我们称之为数组
数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们
数组的四个基本特点:
长度是确定的。数组一旦被创建,它的大小就是不可以改变的
其元素的类型必须是相同类型,不允许出现混合类型
数组类型可以是任何数据类型,包括基本类型和引用类型
数组有索引的:索引从0开始,到 数组.length-1 结束
数组变量属于引用类型,数组也是对象
PS:数组变量属于引用类型,数组也是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中存储的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public class TestArray02 { public static void main (String[] args) { int [] arr; arr = new int [4 ]; arr[0 ] = 12 ; arr[3 ] = 47 ; arr[2 ] = 98 ; arr[1 ] = 56 ; arr[2 ] = 66 ; System.out.println(arr[2 ]); System.out.println(arr[0 ]+100 ); System.out.println("数组的长度是:" +arr.length); } }
数组遍历 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 import java.util.Scanner;public class TestArray03 { public static void main (String[] args) { int [] scores = new int [10 ]; int sum = 0 ; Scanner sc = new Scanner (System.in); for (int i=1 ;i<=10 ;i++){ System.out.print("请录入第" +i+"个学生的成绩:" ); int score = sc.nextInt(); scores[i-1 ] = score; sum += score; } System.out.println("十个学生的成绩之和为:" +sum); System.out.println("十个学生的成绩平均数为:" +sum/10 ); for (int i=0 ;i<=9 ;i++){ System.out.println("第" +(i+1 )+"个学生的成绩为:" +scores[i]); } int count = 0 ; for (int num:scores){ count++; System.out.println("第" +count+"个学生的成绩为:" +num); } for (int i=9 ;i>=0 ;i--){ System.out.println("第" +(i+1 )+"个学生的成绩为:" +scores[i]); } } }
用IDEA验证数组的确将数据进行存储
数组的三种初始化
静态初始化:除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值
1 2 3 4 5 6 7 eg: int [] arr = {12 ,23 ,45 };int [] arr = new int []{12 ,23 ,45 };注意: 1. new int [3 ]{12 ,23 ,45 };-->错误,不需要再定义长度2. int [] arr ; arr = {12 ,23 ,45 }; --->错误,不能分开写
动态初始化:数组定义与为数组元素分配空间并赋值的操作分开进行
1 2 3 4 5 6 eg: int [] arr ;arr = new int [3 ] arr[0 ] = 12 ; arr[1 ] = 23 ; arr[2 ] = 45 ;
默认初始化:数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化
1 int [] arr = new int [3 ]; ---> 数组有默认的初始化值
数组最值问题 实现一个功能:给定一个数组int[] arr = {12,3,7,4,8,125,9,45}; ,求出数组中最大的数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class TestArray04 { public static void main (String[] args) { int [] arr = {12 ,3 ,7 ,4 ,8 ,125 ,9 ,45 ,666 ,36 }; int maxNum = arr[0 ]; for (int i=0 ;i<arr.length;i++){ if (arr[i]>maxNum){ maxNum = arr[i]; } } System.out.println("当前数组中最大的数为:" +maxNum); } }
将求最大值的方法提取出来 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class TestArray04 { public static void main (String[] args) { int [] arr = {12 ,3 ,7 ,4 ,8 ,725 ,9 ,45 ,666 ,36 }; int num = getMaxNum(arr); System.out.println("当前数组中最大的数为:" +num); } public static int getMaxNum (int [] arr) { int maxNum = arr[0 ]; for (int i=0 ;i<arr.length;i++){ if (arr[i]>maxNum){ maxNum = arr[i]; } } return maxNum; } }
画内存
方法的实参传递给形参的时候一定要注意:一切都是值传递
如果是基本数据类型,那么传递的就是字面值
如果是引用数据类型,那么传递的就是地址值
数组的查询问题 查询指定位置的元素 1 2 3 4 5 6 7 8 9 public class TestArray05 { public static void main (String[] args) { int [] arr = {12 ,34 ,56 ,7 ,3 ,10 }; System.out.println(arr[2 ]); } }
上面代码体现了数组的一个优点:在按照位置查询的时候,直接一步到位,效率非常高
查询指定元素的位置,找出元素对应的索引 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class TestArray06 { public static void main (String[] args) { int [] arr = {12 ,34 ,56 ,7 ,3 ,56 }; int index = -1 ; for (int i=0 ;i<arr.length;i++){ if (arr[i]==56 ){ index = i; break ; } } if (index!=-1 ){ System.out.println("元素对应的索引:" +index); }else { System.out.println("查无此数!" ); } } }
将查指定元素对应的索引的功能提取为方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class TestArray06 { public static void main (String[] args) { int [] arr = {12 ,34 ,56 ,7 ,3 ,56 }; int index = getIndex(arr,999 ); if (index!=-1 ){ System.out.println("元素对应的索引:" +index); }else { System.out.println("查无次数!" ); } } public static int getIndex (int [] arr,int ele) { int index = -1 ; for (int i=0 ;i<arr.length;i++){ if (arr[i]==ele){ index = i; break ; } } return index; } }
数组添加元素
给定一个数组,在数组下标为2的位置上添加一个元素91 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public class TestArray07 { public static void main (String[] args) { int [] arr = {12 ,34 ,56 ,7 ,3 ,10 ,55 ,66 ,77 ,88 ,999 ,89 }; 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]); } } int index = 1 ; for (int i=arr.length-1 ;i>=(index+1 );i--){ arr[i] = arr[i-1 ]; } arr[index] = 666 ; System.out.print("\n增加元素后的数组:" ); for (int i=0 ;i<arr.length;i++){ if (i!=arr.length-1 ){ System.out.print(arr[i]+"," ); }else { System.out.print(arr[i]); } } } }
将添加功能提取为一个方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 import java.util.Scanner;public class TestArray07 { public static void main (String[] args) { int [] arr = {12 ,34 ,56 ,7 ,3 ,10 ,55 ,66 ,77 ,88 ,999 ,89 }; Scanner sc = new Scanner (System.in); System.out.print("请录入你要添加元素的指定下标:" ); int index = sc.nextInt(); System.out.print("请录入你要添加的元素:" ); int ele = sc.nextInt(); insertEle(arr,index,ele); System.out.print("\n增加元素后的数组:" ); for (int i=0 ;i<arr.length;i++){ if (i!=arr.length-1 ){ System.out.print(arr[i]+"," ); }else { System.out.print(arr[i]); } } } public static void insertEle (int [] arr,int index,int ele) { for (int i=arr.length-1 ;i>=(index+1 );i--){ arr[i] = arr[i-1 ]; } arr[index] = ele; } }
数组删除元素
删除指定位置上的元素 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import java.util.Arrays;public class TestArray08 { public static void main (String[] args) { int [] arr = {12 ,34 ,56 ,7 ,3 ,10 ,34 ,45 ,56 ,7 ,666 }; System.out.println("删除元素前的数组:" +Arrays.toString(arr)); int index = 0 ; for (int i=index;i<=arr.length-2 ;i++){ arr[i] = arr[i+1 ]; } arr[arr.length-1 ] = 0 ; System.out.println("删除元素后的数组:" +Arrays.toString(arr)); } }
删除指定元素 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import java.util.Arrays;public class TestArray09 { public static void main (String[] args) { int [] arr = {12 ,34 ,56 ,7 ,3 ,10 ,34 ,45 ,56 ,7 ,666 }; System.out.println("删除元素前的数组:" +Arrays.toString(arr)); int index = -1 ; for (int i=0 ;i<arr.length;i++){ if (arr[i]==3 ){ index = i; break ; } } if (index!=-1 ){ for (int i=index;i<=arr.length-2 ;i++){ arr[i] = arr[i+1 ]; } arr[arr.length-1 ] = 0 ; }else { System.out.println("根本没有你要删除的元素!" ); } System.out.println("删除元素后的数组:" +Arrays.toString(arr)); } }
详解main方法
main方法:程序的入口,在同一个类中,如果有多个方法,那么虚拟机就会识别main方法,从这个方法作为程序的入口
main方法格式严格要求
public static void main(String[] args){}
public static —>修饰符 ,暂时用这个 –>面向对象一章
void —>代表方法没有返回值 对应的类型void
main —>见名知意名字
String[] args —>形参 —》不确定因素
问题:程序中是否可以有其他的方法也叫main方法?
1 2 3 4 5 6 7 8 public class TestArray10 { public static void main (String[] args) { } public static void main (String str) { } }
形参为String[] 那么实参到底是什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class TestArray10 { public static void main (String[] args) { System.out.println(args.length); for (String str:args){ System.out.println(str); } } }
可变参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public class TestArray12 { public static void main (String[] args) { method01(30 ,40 ,50 ,60 ,70 ); } public static void method01 (int num2,int ...num) { System.out.println("-----1" ); for (int i:num){ System.out.print(i+"\t" ); } System.out.println(); System.out.println(num2); } }
Arrays工具类 为了方便我们对数组进行操作,系统提供一个类Arrays,我们将它当做工具类来使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import java.util.Arrays;public class TestArray13 { public static void main (String[] args) { int [] arr = {1 ,3 ,7 ,2 ,4 ,8 }; System.out.println(Arrays.toString(arr)); Arrays.sort(arr); System.out.println(Arrays.toString(arr)); System.out.println(Arrays.binarySearch(arr,4 )); int [] arr2 = {1 ,3 ,7 ,2 ,4 ,8 }; int [] newArr = Arrays.copyOf(arr2,4 ); System.out.println(Arrays.toString(newArr)); int [] newArr2 = Arrays.copyOfRange(arr2,1 ,4 ); System.out.println(Arrays.toString(newArr2)); int [] arr3 = {1 ,3 ,7 ,2 ,4 ,8 }; int [] arr4 = {1 ,3 ,7 ,2 ,4 ,8 }; System.out.println(Arrays.equals(arr3,arr4)); System.out.println(arr3==arr4); int [] arr5 = {1 ,3 ,7 ,2 ,4 ,8 }; Arrays.fill(arr5,10 ); System.out.println(Arrays.toString(arr5)); } }
数组的复制操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import java.util.Arrays;public class TestArray14 { public static void main (String[] args) { int [] srcArr = {11 ,22 ,33 ,44 ,55 ,66 ,77 ,88 }; int [] destArr = new int [10 ]; System.arraycopy(srcArr,1 ,destArr,3 ,3 ); System.out.println(Arrays.toString(destArr)); } }
二维数组的定义和遍历
引入:本质上全部都是一维数组
1 2 3 4 5 6 7 8 9 10 11 public class TestArray15 { public static void main (String[] args) { int [][] arr = new int [3 ][]; int [] a1 = {1 ,2 ,3 }; arr[0 ] = a1; arr[1 ] = new int []{4 ,5 ,6 ,7 }; arr[2 ] = new int []{9 ,10 }; } }
四种遍历方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 public class TestArray15 { public static void main (String[] args) { int [][] arr = new int [3 ][]; int [] a1 = {1 ,2 ,3 }; arr[0 ] = a1; arr[1 ] = new int []{4 ,5 ,6 ,7 }; arr[2 ] = new int []{9 ,10 }; for (int i=0 ;i<arr.length;i++){ for (int j=0 ;j<arr[i].length;j++){ System.out.print(arr[i][j]+"\t" ); } System.out.println(); } for (int i=0 ;i<arr.length;i++){ for (int num:arr[i]){ System.out.print(num+"\t" ); } System.out.println(); } for (int [] a:arr){ for (int num:a){ System.out.print(num+"\t" ); } System.out.println(); } for (int [] a:arr){ for (int i=0 ;i<a.length;i++){ System.out.print(a[i]+"\t" ); } System.out.println(); } } }
二维数组的初始化方式
静态初始化:除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值
1 2 3 eg: int [][] arr = {{1 ,2 },{4 ,5 ,6 },{4 ,5 ,6 ,7 ,8 ,9 ,9 }};int [][] arr =new int [][] {{1 ,2 },{4 ,5 ,6 },{4 ,5 ,6 ,7 ,8 ,9 ,9 }};
动态初始化:数组定义与为数组元素分配空间并赋值的操作分开进行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 eg: int [][] arr = new int [3 ][]; arr[0 ] = new int []{1 ,2 }; arr[1 ] = new int []{3 ,4 ,5 ,6 }; arr[2 ] = new int []{34 ,45 ,56 }; eg: int [][] arr = new int [3 ][2 ]; public class TestArray16 { public static void main (String[] args) { int [][] arr = new int [3 ][2 ]; arr[1 ] = new int []{1 ,2 ,3 ,4 }; for (int [] a:arr){ for (int num:a){ System.out.print(num+"\t" ); } System.out.println(); } } }
默认初始化:数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化