java知识点
static
- static可以用来修饰:属性、方法、代码块、内部类
- 使用static修饰属性:静态变量(类变量)
- 按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
- 实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改
- 静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
- static修饰属性的其他说明:
- 静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用
- 静态变量的加载要早于对象的创建。
- 由于类只会加载依次,则静态变量在内存中也只会存在一份,存在方法区的静态域中。
- 使用static修饰方法:静态方法
- 随着类的加载而加载,可以通过”类.静态方法“的方式进行调用
- 静态方法中,只能调用静态的方法或属性,非静态的方法中,既可以调用非静态的方法或属性,也可以调用静态的方法火属性
- static注意点:
- 在静态的方法内,不能使用this关键字、super关键字
- 开发中,如何确定一个属性的是否要声明为static的?
- 属性是可以被多个对象所共享的,不会随着对象的不同而不同的
- 类中的常量进程使用static
- 开发中,如何确定一个方法是否要声明为static的?
- 操作静态属性的方法,通常设置为static的
- 工具类中的方法,习惯上声明为static的。比如Math、Arrays、Collections
- 按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
final
-
final修饰一个方法、类、变量。
-
final用来修饰变量:此时的”变量“就称为是一个常量。
-
final修饰属性:可以考虑赋值的位置有个:显式初始化、代码块中初始化、构造器中初始化
-
static final:全局常量
abstract
- abstract 关键字的使用
- abstract:抽象的
- abstract可以用来修饰的结构:类、方法,不能修饰:属性、构造器等结构
- abstract修饰类:抽象类
此类不能实例化
抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例话的全过程)
开发中,都会提供抽象类的子类,让子类对象实例化,完成相关操作。 - abstract修饰方法,抽象方法
抽象方法中只有方法的声明,没有方法体
包含抽象方法的类,一定是一个抽象类。反之,抽象类中 可以没有抽象方法的。
若子类重写了父类中的所有的抽象方法后,此子类方可实例话
若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰 - 匿名类 例如Person 是一个抽象类
创造一个匿名类 Person p = new Person(){Person中的匿名方法};
接口(interface)
- 接口的使用
- 接口使用interface来定义
- Java中,接口和类时并列的两个结构
- 如何定义接口:定义接口中的成员
3.1 JDK7及之前:只能定义全局常量和抽象方法
> 全局常量:public static final 的,但是书写时,可以省略不写
> 抽象方法:public abstract 的。也可以省略
3.2 jdk8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(略)
接口中定义的静态方法,只能通过接口来调用。
通过实现类的对象,可以调用接口中的默认方法。
如果实现类重写了接口中的默认方法, 调用时,仍然调用的时重写以后的方法
如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。-->类优先原则
如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法。那么在实现类中没有重写此方法的情况下,报错。-->接口冲突 这就需要我们在实现类中重写此方法 - 接口中不能定义构造器!意味着不可以实例化
- Java开发中,接口通过让类去实现(implements)的方式来使用。
如果实现类覆盖了所有抽象方法,则该实现类可以进行实例化
如何实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类 - Java类可以实现多个接口--->弥补了Java单继承性的局限性
- 接口与接口之间可以继承,而且可以多继承
- 接口的具体使用,体现多态性
- 接口,实际上可以看做是一种规范
内部类(inner class)
- Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
- 内部类的分类: 成员内部类(静态、非静态) vs 局部内部类(方法内、代码块内、构造器内)
- 成员内部类:
- 一方面作为外部类的成员
调用外部类的结构
可以被static修饰
可以被四种不同权限修饰 - 一方面,作为一个类:
类内可以定义属性、方法、构造器等
可以被final修饰,表示此类不能被继承。言外之意,不适用final,就就可以被继承
可以被abstract修饰
- 一方面作为外部类的成员
异常处理
- 异常:在java语言中,将程序执行中发生的不正常情况称为“异常”。
- Java程序在执行过程城中所发生的异常事件可分为两类:
- Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理
- Exception:其它因变成错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理
- 空指针访问
- 视图读取不存在的文件
- 网络连接中断
- 数组角标越界
- 常见的异常
java.lang.throwable
|-----java.lang.Error:一般不编写针对性的代码进行处理
|-----java.lang.Exception:可以进行异常的处理
|-----编译时异常(checker)
|-----IOException
|-----FileNotFoundException
|-----ClassNotFoundException
|-----运行时异常(unchecked)
|-----NullPointerException String str = null; System.out.println(str.charAt);
|-----ArrayIndexOutOfBoundsException---数组下标越界异常
|-----ClassCastException---类型转换异常
|-----NumberFormatException---数字转换异常 String=>int 不能为字母字符串
|-----InputMismatchException---输入不匹配异常
|-----ArithmeticException---算数不匹配异常 /0
-
异常的处理:抓抛模型
- 过程一:“抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。并将此对象抛出。一旦抛出对象以后,其后的代码就不再执行。
- 关于异常对象的产生:1.系统自动生成的异常的对象 2.手动的生成一个异常对象,并抛出(throw)
- 手动抛出异常 throw new RuntimeException("message")
- 过程二:“抓”:可以理解为异常的处理方式:1.try-catch-finally 2.throws
-
try-catch-finally的使用
try{
//可能出现异常的代码
}catch(异常类型1 变量名1){
//处理异常的方式1}
}catch(异常类型2 变量名2){
//处理异常的方式2
}catch(异常类型3 变量名3){
//处理异常的方式3
}
- 一旦try中的异常对象匹配到一个catch时,就进入catch中进行异常处理。一旦处理完成,就跳出当前的try-catch结构(在没有写finally的情况)。继续执行其后的代码。catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。 catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则报错。常用的异常对象处理的方式:1.String getMessage() 打印报错信息2.printStackTrace()打印栈中的报错信息
- finally的使用
- finally是可选的
- finally中声明的是一定会执行的代码。即使catch中又出现异常了,try中有return语句,catch中有return语句等情况。
- 像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。
- throws + 异常类型
"throws + 异常类型"写在方法的声明处。知名此方法执行时,可能会抛出的异常类型。一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码不会再执行。throws没有真正将异常处理掉 - 方法重写规则:子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
- 开发中如何选择使用try-catch-finally 还是使用throw?
- 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类中写的方法中有异常,必须使用try-catch-finally方式处理。
- 执行的方法a中,先后又调用了另外的几个方法,这几个方法时递进关系执行的。我们建议这几个方法使用throw的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。
- 用户自定义异常