Scanner对象
java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是java5的新特性,我们可以通过Scanner类获取用户的输入。
基本语法:
Scanner s= new Scanner(System.in)
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入数据。
next():
- 一定要读取到有效字符后才可以结束输入。
- 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next()不能得到带有空格的字符串。
nextLine():
- 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
- 可以获得空白。
public class demo1 {
public static void main(String[] args) {
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收:");
//判断用户有没有输入字符串
if (scanner.hasNext()){
//使用next方式接收
String str= scanner.next();//程序等待用户输入完毕
System.out.println("输出内容为:"+ str);
}
//凡是属于IO流的类如果不关闭会一直占用资源,要养成好习惯用完就关闭
scanner.close();
}
}
break continue
-
break在任何循环语句的主体部分,均可以用break控制循环的流程。break用于强行退出循环,不执行循环中的剩余的语句。break语句也在switch语句中使用。
-
continue语句用在循环语句中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
-
关于goto关键字
- goto关键字很早就在程序设计语言中出现,尽管goto仍是java的一个保留字,但并未在语言中得到正式使用;
- "标签"是指后面一个冒号的标识符,如:label;
- 对java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是: 我们希望在其中镶嵌另一个循环,由于break和continue语句只中断当前循环,但若随同标签使用,他们就会中断到存在标签的地方。
public class demo2 { public static void main(String[] args) { //打印101-150之间的所有质数 //质数是指在大于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+" "); } } }
方法
java方法是语句的集合,它们在一起执行一个功能
- 方法是解决一类问题的步骤的有序组合
- 方法包含与类或对象中
- 方法在程序中创建,在其他地方引用
原则:
方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。
方法重载
就是在一个类中,有相同的函数名称,但形参不同的函数。
规则:
- 方法名必须相同
- 参数列表必须不同(个数不同,或类型不同,参数排列顺序不同等)
- 方法的返回类型可以相同也可以不同
- 仅仅返回类型不同不足以成为方法的重载
理论:
方法名称相同时,编译器会根据调用方法的参数个数,参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
可变参数
- JDK1.5开始,Java支持传递同类型的可变参数的方法。
- 在方法声明中,在指定参数类型后加一个省略号(…)。
- 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
递归
A方法调用A方法 自己调用自己
利用递归可以用简单的程序来解决一些复杂的问题。通常把一个大型复杂问题层层转换为一个原问题相识的规模较小的问题来求解,递归策略只需要少量程序就可描述出解题过程所需要的多次重复计算,大大地减少程序的代码量。递归的能力在与用有限的语句来定义对象的无限集合。
组成两大部分
- 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
- 递归体:什么时候需要调用自身方法。
public class demo3 {
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);
}
}
}
数组
- 数组是相同类型数据的有序集合。
- 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
- 其中,每个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。
基本特点
- 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 其元素必须是相同类型,不允许出现混合类型。
- 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
- 数据变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中。
Arrays类
- 数组工具类java.util.Arrays
- 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
- Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用" 使用对象来调用(注意:是"不用" 而不是 “不能”)
常用功能
- 给数组赋值:通过fill方法
- 对数组排序:通过sort方法,按升序。
- 比较数组: 通过equals方法比较数组中元素值是否相等。
- 查找数组元素:通过binarySearch方法能对排序好的的数组进行二分查找法操作。
冒泡排序
- 冒泡排序是最为出名的排序算法之一,总共八大算法。
- 冒泡的代码还是相当简单的,两层循环,外层冒泡排序,里层以此比较,江湖人尽皆知。
import java.util.Arrays;
public class demo4 {
public static void main(String[] args) {
int[] a={1,2,23,4,45,56,34,99};
int[] sort = sort(a);
System.out.println(Arrays.toString(sort));
}
/*
冒泡排序
1. 比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置。
2. 每一次比较,都会产生出一个最大的,或者最小的数字;
3. 下一轮则可以少一次排序
4. 依次循环,直到结束
*/
public static int[] sort(int[] array){
//定义临时变量
int temp=0;
//外层循环,判断我们这个要走多少次;
for (int i = 0; i < array.length-1; i++) {
//内层循环,比价判断两个数,如果第一个数,比第二个数大,则交换位置
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;
}
}
}
return array;
}
}
面向对象
- 面向过程思想
- 步骤清晰简单,第一步做什么,第二步做什么
- 面对过程合适处理一些较为简单的问题
- 面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要那些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
- 面向对象适合处理复杂问题,适合处理需要多人协作的问题。
- 对于描述复杂的事务,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
**本质:**以类的方式组织代码,以对象的组织(封装)数据。
**三大特征:**封装,继承,多态
构造器
- 和类名相同
- 没有返回值
作用
- new 本质在调用构造方法
- 初始化对象的值
注意点
- 定义有参构造之后,如果想使用无参构造,显示的定义一个无参构造
- Alt+Insert
封装
- 该露的露,该藏的藏
- 我们程序设计要追求"高内聚,低耦合"。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
- 封装(数据的隐藏)
- 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
继承
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
- extends的意思是"扩展"。子类是父类的扩展。
- Java中类只有单继承,没有多继承!
- 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖,组合,聚合等。
- 继承关系的俩个类,一个为子类(派生类),一个为符类(基类)。子类继承父类,使用关键字extends来表示。
- 子类和父类之间,从意义上讲应该具有"is a"的关系。
super注意点:
- super调用父类的构造方法,必须在构造方法的第一个。
- super必须只能出现在子类的方法或者构造方法中。
- super和this不能同时调用构造方法。
this:
代表的对象不同:
this: 本身调用者这个对象
super: 代表父类对象的应用
前提:
this: 没有继承也可以使用
super: 只能在继承条件才可以使用
构造方法
this();本类的构造
super(); 父类的构造
重写
- 需要有继承关系,子类重写父类的方法!
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大但不能缩小:public > Protected > Default > private
- 抛出的异常: 范围,可以被缩小,但不能扩大:ClassNotFoundException --> Exception(大)
- 子类的方法和父类必须保持一致:方法体不同;
多态
- 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。
- 多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类
- 多态是方法的多态,属性没有多态性
- instanceof
抽象类
- abstract修饰可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
- 抽象类中可以没有抽象方法,但是抽象方法的类一定声明为抽象类。
- 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。
- 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
- 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则孩子类也要声明为抽象类。
- implements接口
异常
分类
- 检查性异常: 最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常发生了,这些异常在编译是不能被简单的忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行是异常可以在编译时被忽略。
- 错误error: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如:当栈溢出是,一个错误就发生了,它们在编译也检查不到的。