包装类
java给出了一组包装类可以将基本数据类型包装成对象,分别为Byte、Short、Integer、Long、Float、Double、Character、Boolean,对应不同的基本数据类型。
基本数据类型 | 包装类 |
int | Integer |
char long | Character Long |
float | Float |
double | Double |
short | Short |
byte | Byte |
boolean | Boolean |
其中只有int和char的包装类需要特殊记一下其它的包装类都是对应的基本数据类型的首字母大写得出来的.
java支持自动自动装箱,所以可以直接把基本数据类型的值直接赋给包装类.
集合
常用的集合:HashMap,ArrayList,LinkedList;
当要用数组保存的数据的数量未知时,就可以用集合来保存,集合会自动增加内存所以不会出现内存不够用的情况.
数组能保存基本数据类型和引用数据类型,集合比他广泛,集合能保存数据类型(对象),但不能保存引用数据类型,要注意的是当保存的是基本数据类型时会自动将它装箱变成对象.
集合分为两种,一种是单列集合,另一种是双列集合,双列集合与单列集合是一一对应的.
单列集合: 只保存一个值,访问通过下标来完成.
双列集合: 保存两个值(Key,Value),这样访问就可以通过用户指定的Key来找到对应的Value.
异常处理
package com.nsy.arrayClass;
import java.util.InputMismatchException;
import java.util.Scanner;
public class a9_Test_Input_01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
/*
* 当我们只写一个try{}的时候,会报错:
* Syntax error, insert "Finally" to complete TryStatement
* 语法错误,插入“Finally”来完成Try块
*
* 总结: try不能单独存在,必须结合catch或finally来使用 (两个必须有一个)
* try块中没有异常,会执行finally(如果有)
* try块中有异常,会执行对应的catch块(如果有),try中异常发生点之后的代码将不会执行
*/
try{
//try块中放可能发生异常的代码。
//如果执行完try且不发生异常,则接着去执行finally块和finally后面的代码(如果有的话)。
//如果发生异常,则尝试去匹配catch块。异常点之后的代码不会运行
//这行代码有可能出错
int num1 = sc.nextInt(); //这行代码如果出现异常,那么后面的输出语句就不执行
int num2 = sc.nextInt();
System.out.println(num1+"\t"+num2);
System.out.println(num1/num2);
String str = null;
System.out.println(str.charAt(0));
}catch(InputMismatchException | NullPointerException e) {
// catch(异常对象) 当异常发生了,catch就会捕获对应的异常
// 每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。Java7中可以将多个异常声明在一个catch中。 catch(Exception1 | Exception2 | Exception3 e)
// catch后面的括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。
// 在catch块中可以使用这个块的异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问。
// 如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally,然后到这个函数的外部caller中去匹配异常处理器。
// 如果try中没有发生异常,则所有的catch块将被忽略。
System.out.println("catch块 - try里面发生了异常 - 空指针和输入不匹配异常都走这个Catch");
}catch(java.lang.ArithmeticException e){
e.getMessage();
System.out.println("算数异常:除数不能为0");
}catch(Exception e){
System.out.println("程序发生未知异常");
}finally {
// finally块通常是可选的。
// 无论异常是否发生,异常是否匹配被处理,finally都会执行。
// 一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。
// finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
System.out.println("finally块");
}
System.out.println("异常捕获之后的代码");
}
}
学长写的有关集合和异常处理的博客:http://t.csdnimg.cn/sMfsk
接口
创造接口的目的是为了规范方法的格式(返回值,参数等).
1.接口用关键字interface来定义
格式: public interace 接口名{}
2.接口不能实例化(不能有对象)
3.类和接口之间是实现与被实现的关系,通过implements关键字来表示
格式: public class 类名 implements 接口1,接口2.........{ (重写接口里的方法) }
4.接口和接口之间可以继承(单继承或多继承)
格式: public interface 接口名 extends 接口1,接口2 {}
成员变量
只能是常量.
默认修饰符: public static final
构造方法
无
成员方法
只能是抽象方法.
默认修饰符: public abstract
用default定义的方法一般是不用被强制重写的,这样就方便了以后增加接口.
样例:
public interface Inter {
public abstract void method();
public default void show(){
System.out.println("接口中的默认方法");
}
}
public class wuyon implements Inter{ //在这个实现类中我们没有重写默认类
@Override
public void method() {
System.out.println("重写后的方法");
}
}
import java.util.*;
public class test{
public static void main(String[] args) {
wuyon a=new wuyon();
a.show();
a.method();
}
}
运行结果
public class wuyon implements Inter{ //重写两个方法
@Override
public void method() {
System.out.println("重写后的方法");
}
@Override
public void show() {
System.out.println("重写后的默认方法");
}
}
运行结果
强行在重写方法中加上default报错
用static修饰的方法无法被重写
只允许在本接口中被调用
接口的应用
类和接口的关系:
类可以在继承类的同时实现多个接口或只实现一个接口(如果多个接口有相同的方法,只要重写一遍).
接口和接口的关系:
继承关系,可以单继承,也可以多继承.(实现类要重写所有的抽象方法)
内部类
内部类是建立在类里面的类.
如:
public class dog{
class body{
public String name="身体";
}
}
body为dog的内部类,dog为外部类.
内部类可以随意调用外部类的成员变量(包括私有变量).
外部类如果想要调用内部类的成员必须创建一个对象,通过对象来实现.
内部类的分类
内部类分为成员内部类,静态内部类,局部内部类,匿名内部类(重点).
成员内部类
写在成员位置,属于外部类的成员.
获取成员内部类对象的方式:
1.外部类编写方法,对外提供内部类对象(private)
2.直接创建
格式: 外部类名.内部类名 对象名 =外部类对象.内部类对象;
样例:Outer.Inner oi =new Outer().new Inner();
当内部变量与外部变量产生同名时正确的调用方法:
每一个内部类中都有一个隐藏的成员变量this用与保存外部类对象的地址
静态内部类
写在成员位置,属于外部类的成员,与成员内部类相似只是多了一个static进行修饰,可以说它是一种特殊的成员内部类.
获取静态内部类对象的方式:
直接创建:
格式 : 外部类名.内部类名 对象名 =new 外部类名.内部类名();
样例 : Outer.Inner oi =new Outer.Inner();
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建外部类的对象
调用非静态方法的格式: 先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类名.方法名();