Day02
注释
单行注释
//这个是单行注释
多行注释
/*
这是多行注释
*/
文档注释
/**
这是文档注释
*/
标识符
Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
abstract | assent | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final | finally | float |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | strictfp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
标识符的注意点
- 所有的标识符都应该以字母(A-Z或者a-z),美元符($)、下划线(_)开始
- 不能使用关键字作为变量名或方法名
- 标识符是大小写敏感的
- 可以使用中文命名,但是一般不建议这样去使用,也不建议用拼音,很low
数据类型
强类型语言
要求变量的使用要严格符合规定,所有的变量都必须先定义后才能使用
Java的数据类型分为两大类
-
基本类型(primitive type)
- 数值类型
- 整数类型
- byte占1个字节范围:-128~127
- short占2个字节范围:-32768~32767
- int占4个字节范围:-2147483648~2147463647
- long占8个字节范围:-9223372036854775808~9223372036854775807
- 浮点类型
- float占4个字节
- double占8个字节
- 字符类型:char占2个字节
- 整数类型
- boolean类型:占1位其值只有true和false
- 数值类型
-
引用类型(reference type)
- 类
- 接口
- 数组
-
String不是关键字,是类
-
BigDecimal —>数学工具类,常用于银行系统
变量的命名规范
- 所有的变量、方法、类名:见名知意
- 类成员变量:首字母小写和驼峰原则:monthSalary
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大学和驼峰原则:Man,GoodMan
- 方法名:首字母小写和驼峰原则:run(),runRun()
运算符
-
算术运算符:+ ,-,*,/,%,++,–
-
赋值运算符:=
-
关系运算符:>,<,>=,<=,==,!=,instanceof
-
逻辑运算符:&&,||,!
-
位运算符:&,|,^,~,>>,<<,>>>(了解!!!)
- <<(左移) —> *2
- (>>(右移))—> /2
-
条件运算符:?:
-
扩展赋值运算符:+=,-=,*=,/=
-
//字符串连接符 + ,String int a = 10; int b = 20; System.out.println("" + a + b); --->1020 System.out.println(a + b + ""); --->30
JavaDoc
- 通过命令行 javadoc -encoding UTF-8 -charset UTF-8 Doc.java
- 使用IDEA生产JavaDoc文件
-
Scanner对象
- 通过Scanner类来获取用户的输入
- 基本语法:Scanner s = new Scanner(System.in);
- 通过Scanner类的 next() 与 nextLine() 方法获取输入的字符串,在读取我们一般需要使用 hasNext() 与 hasNextLine() 判断是否还有输入的数据。
- next()
- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
- next() 方法不能得到带有空格的字符串
- nextLine():
- 以Enter为结束符,也就是说 nextLine() 方法返回的是输入回车之前的所有字符
- 可以获得空白
- next()
- 凡是属于IO流的类如果不关闭会一直占用资源,要养成好习惯用完就关掉!—> s.close();
Switch多选择结构
switch语句中的变量类型可以是:
-
byte、short、int、char、String
-
从 Java7 开始,变量类型可以是String,同时case标签必须为字符串常量或字面量
- Java7是如何实现String变量类型比较的,它是通过字节码文件反编译实现的,用IDEA打开编译之后的字节码文件,你会发现里面的变量类型是一个唯一的hashcode值,通过反编译的方式进行对唯一的hashcode值进行解码实现。
For循环
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。
for(初始化;布尔表达式;更新){
//代码语句
}
增强for循环
Java5 引入了一种主要用于数组或集合的增强型for循环。
格式如下:
for(声明语句:表达式){
//代码语句
}
//eg:
int[] numbers = {10,20,30,40,50};
//使用增强for循环对数组numbers进行遍历输出
for(int i:numbers){
System.out.println(i);
}
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
方法的定义
Java的方法类似于其它语言的函数,是一段 用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
- 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法,定义了该方法的访问类型。
- 返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值,在这种情况下,returnValueType的关键字为void。
- 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
- 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 形式参数:在方法被调用时用于接收外界输入的数据。
- 实参:调用方法时实际传给方法的数据。
- 方法体:方法体包含具体的语句,定义该方法的功能。
格式如下:
修饰符 返回值类型 方法名(参数类型 参数名){
...
//方法体
...
return 返回值;
}
方法的重载
重载就是在一个类中,有相同的函数名称,但是形参不同的函数。
方法的重载规则:
- 方法名称必须相同。
- 参数列表必须不同(个数不同,类型不同,顺序不同等)
- 方法的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为方法的重载。
实现理论:方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
可变参数
JDK 1.5开始,Java支持传递同类型的可变参数给一个方法。
在方法声明中,在指定参数类型后加一个省略号(…)。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,相当于一个数组。任何普通的参数必须在它之前声明。
public static void getMax(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);
}
递归
A方法调用B方法,我们很容易理解!
递归就是:A方法调用A方法!就是自己调用自己
利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归结构包括两个部分:
- 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
- 递归体:什么时候需要调用自身方法。
//5!例子
public static void main(String[] args){
System.out.println(f(5));
}
public static int f(int n){
if(n == 1){
return 1;
}else{
return n * f(n - 1);
}
}
画图解析递归的实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jo3jIxnO-1600479136587)(C:\Users\XiaoHan\Desktop\MarkDown\递归.png)]
数组
数组的定义:
- 数组是相同类型数据的有序集合。
- 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
- 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。
Java语言使用new操作符来创建数组,语法如下:
dataTpye[] arrayRefVar = new dataType[arraySize];
内存分析
Java内存分析:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vb0WKkMj-1600479136591)(C:\Users\XiaoHan\Desktop\MarkDown\Java内存分析.png)]
数组在Java内存中存放的例子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GXRiPEnG-1600479136594)(C:\Users\XiaoHan\Desktop\MarkDown\数组存放内存分析.png)]
数组的四个基本特点
- 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 其元素必须是相同的类型,不允许出现混合类型。
- 数组中元素可以是任何数据类型,包括基本类型和引用类型。
- 数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
Arrays类
数组的工具类java.util.Arrays
由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而不用使用对象来调用。
具有以下常用的方法:
- 给数组赋值:通过fill方法。
- 给数组排序:通过sort方法,升序。
- 比较数组:通过equals方法比较数组中元素值是否相等。
- 查找数组元素:通过binarySearch方法能对排序号的数组进行二分查找法操作。
冒泡排序
冒泡排序无疑是最为出名的排序算法之一,总共有八大排序!
冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层比较次数。
时间复杂度为O(n2)。
稀疏数组
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方式:
- 记录数组一共有几行几列,有多少个不同值。
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模。
面向过程 & 面向对象
面向过程思想
- 步骤简单清晰,第一步做什么,第二步做什么…
- 面对过程适合处理一些较为简单的问题。
面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题。
对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
什么是面向对象
面向对象编程(Object-Oriented Programming,OOP)
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
三大特性:
- 封装
- 继承
- 多态
从认识论角度考虑是 先有对象后有类。对象,是具体的事物。类,是抽象的,是对 对象 的抽象。
从代码运行角度考虑是先有类后有对象。类是对象的模板。
方法的调用:
-
静态方法:跟类一起加载的
-
非静态方法:类实例化后加载的
-
形参和实参
-
值传递和引用传递
-
值传递例子
-
public class Demo{ public static void main(String[] args){ int a = 1; System.out.println(a);//1 Demo.change(a); System.out.println(a);//1 } public static void change(int a ){ a = 10; } }
-
-
引用传递例子
-
public class Demo{ public static void main(String[] args){ Person person = new Person(); System.out.println(person.name);//null Demo.change(person); System.out.println(person.name);//xiaohan } public static void change(Person person){ person.name = "xiaohan"; } } //定义一个Person类,有一个属性:name class Person{ String name;//null }
-
-
-
this关键字
类与对象的关系
类是一种抽象的数据类型,它是对某一些事物整体描述/定义,但是并不能代表某一具体的事物。
- 动物、植物、手机、电脑…
- Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为。
对象是抽象概念的具体实例
- 张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例。
- 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。
package demo02;
public class Student {
//属性
String name;//null
int age;//0
//方法
public void study(){
System.out.println(this.name + "在学习!");
}
}
package demo02;
public class Application {
public static void main(String[] args) {
//类:抽象的,实例化
//类实例化后会返回一个自己的对象!
//xiaoming,xiaohong对象都是Student类的具体实例
Student xiaoming = new Student();
Student xiaohong = new Student();
xiaoming.name = "小明";
xiaoming.age = 20;
System.out.println(xiaoming.name);
System.out.println(xiaoming.age);
xiaohong.name = "小红";
xiaohong.age = 20;
System.out.println(xiaohong.name);
System.out.println(xiaohong.age);
}
}
public class Person {
//一个类什么都不写,他也会存在一个方法(无参构造器)
String name;
//显示的定义构造器
/*
构造器的作用:
1.使用new关键字,本质就是在调用构造器,实例化初始值
2.用来初始化值
*/
public Person(){
}
//有参构造器:一旦定义了有参构造器,午餐构造器就必须显示定义
public Person(String name){
this.name = name;
}
//alt + insert快捷键创建有参无参构造器
}
//总结:
/*
public class Application {
public static void main(String[] args) {
//new 实例化一个对象
Person person = new Person("XIAOHAN");
System.out.println(person.name);
}
}
构造器:
1.和类名相同
2.没有返回值
作用:
1.new 本质上实在调用构造方法
2.初始化对象的值
注意点:
1.定义了有参构造器之后,如果想要使用无参构造器,应该显示的定义一个无参的构造器
alt + insert
*/