目录
38.多态
定义:某一类事物的多种存在形态。
体现:父类或者接口的引用指向或者接收自己的子类对象。
作用:多态的存在提高了程序的扩展性和后期可维护性
前提:
•需要存在继承或者实现关系
•要有覆盖操作
多态的特点
成员函数:•编译时:要查看引用变量所属的类中是否有所调用的成员。
•在运行时:要查看对象所属的类中是否有所调用的成员。
成员变量:只看引用变量所属的类。
弊端:提高了扩展性,但是只能使用父类的引用访问父类的成员
成员函数在多态调用时:编译看左边运行看右边
在多态中,成员变量的特点:无论编译和运行都参考左边(引用型变量所属的类)
在多态中,静态成员函数的特点:无论编译和运行都参考左边,因为静态不参考对象里面特有的方法
接口型引用指向自己的子类对象
39.instanceof
A instanceof B 表示A对象是B类型吗
49.Object类
类层次的根类,所有对象都实现了这个类的方法
该类中定义的肯定是所有类具备的功能
41.equlas() 方法的复写
public boolean equlas(Object obj){ //在Demo类中写的情况
if(!(obj) instanceof Demo){
return false;
}
Demo d = (Demo)obj;
//比较语句
}
42.toString()
返回该对象的字符串表示
43.内部类
将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。
访问特点:
•内部类可以直接访问外部类中的成员,包括私有成员。
之所以可以直接访问外部类的成员,是因为内部类中持有了一个外部类的引用
格式为:外部类.this.成员
•而外部类要访问内部类中的成员必须要建立内部类的对象。
内部类定义在成员位置上
•可以被private static成员修饰符修饰。
•被static修饰的内部类只能访问外部类中的静态成员。
内部类定义在局部位置上
•也可以直接访问外部类中的成员。
•同时可以访问所在局部中的局部变量,但必须是被final修饰的。
访问格式:
① 当内部类定义在外部类的成员位置上,而且非私有可以在外部其他类中可以直接建立内部类对象
格式:
外部类名.内部类名 变量名 = 外部类对象.内部类对象;
Outer.Inner in = new Outer().new Inner();
② 当内部类在成员位置上时,就可以被成员修饰符所修饰
比如 private:将内部类在外部类中进行封装
static:内部类就具备了静态的特性(静态内部类),那么就只能访问了外部类的静态
成员了,这时就有了访问的局限性。
访问静态内部类的非静态成员?
new Outer.Inner.function();
访问静态内部类的静态成员?
Outer.Inner.function();
当内部类定义了静态成员那么该内部类必须是静态的
什么时候用内部类?
当描述事物时,事物的内部还有事物,该事物用内部类来描述。
因为内部事物在使用外部事物的内容。
注意:
内部类定义在局部时:① 不可以被成员修饰符所修饰
② 可以直接范文外部类中的成员,因为还持有外部类中的引用
但不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量
44.匿名内部类:就是内部类的简化写法
前提:
•内部类可以继承或实现一个外部类或者接口。
格式为:
•new 外部类名或者接口名(){覆盖类或者接口中的代码, (也可以自定义内容。)}
简单理解:
•就是建立一个建立一个带内容的外部类或者接口的匿名子类对象。
public void function(){
new AbsDemo(){ //AbsDemo为一个抽象类
void show(){
System.out.print("实现了抽象方法");
}
void abc(){
System.out.print("这是我自己的方法");
}
}.abc();
}
45.异常(Exception)
程序在运行时出现的不正常情况
其实就是java对不正常情况进行描述后的对象体现
Throwable
|-- Error
|-- Exception
Exception和Error的子类名都是以父类名作为后缀。
Throwable中的方法
getMessage()
获取异常信息,返回字符串。
toString()
获取异常类名和异常信息,返回字符串。
printStackTrace()
获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
printStackTrace(PrintStream s)
通常用该方法将异常内容保存在日志文件中,以便查阅。
异常处理
try{
需要检测的代码;
}catch(异常类变量)
{
异常处理代码;
}finally{
一定会执行的代码;
}
46.throws与throw的区别
throws用于标识函数暴露出的异常。
throw用于抛出异常对象。
•thorws用在函数上,后面跟异常类名,可以跟多个,用逗号隔开。
•throw用在函数内,后面跟异常对象。
47.自定义异常
自定义类继承Exception或者其子类,因为异常类和异常对象都会抛出,它们都具备可抛性这个可抛性是Throwable这个体系都有的特点。
通过构造函数定义异常信息。
例:
Class DemoException extends Exception{
DemoException(String message){
super(message);
}
}
class Demo{
int div(int a,int b) throws DemoException{
if(b<0)
throw new DemoException("出现了除数是负数的异常"); //手动通过throw关键字抛出一个自定义异常对象
return a/b;
}
}
通过throw将自定义异常抛出。
48.运行时异常RunTimeException
Exception中有一个特殊的异常RunTimeException运行时异常
如果在函数内抛出该异常,函数上可以不用声明,编译一样通过
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过
之所以不用在函数上声明,是因为不需要调用者处理
当异常发生,希望程序终止,因为在运行时出现了无法继续运算的情况,希望终止程序后
对代码进行修正
class Demo{
int div(int a,int b) //throws ArithmeticException
{
if(b==0)
throw new ArithmeticException("被零除了");
return a/b;
}
}
class ExceptionDemo{
public static void main(String[] args){
Demo d = new Demo();
int x = d.div(4,0);
System.out.println("x="+x);
}
}
对于异常分为两种:
① 编译时被检测的异常
② 编译时不被检测的异常(运行时异常RunTimeException 以及其子类)
49.自定义异常
class LanPingException extends Exception{
LanPingException(String message){
super(message);
}
}
class MaoYanException extends Exception{
MaoYanException(String message){
super(message);
}
}
class NoPlanException extends Exception{
NoPlanException(String message){
super(message);
}
}
class Computer{
private int state = 2;
public void run() throws LanPingException,MaoYanException
{
if(state == 2)
throw new LanPingException("蓝屏了");
if(state == 3)
throw new MaoYanException("冒烟了");
}
public void reset(){
state = 1;
System.out.println("电脑重启了");
}
}
class Teacher{
private String name;
private Computer cmpt;
Teacher(String name){
this.name = name;
cmpt = new Computer();
}
public void prelect() throws NoPlanException{
try {
cmpt.run();
System.out.println("讲课了");
} catch (LanPingException e) {
cmpt.reset();
} catch(MaoYanException e){
test();
throw new NoPlanException("上课无法进行"+e.getMessage());
}
}
public void test(){
System.out.println("出现故障,自己练习");
}
}
public class ExceptionTest {
public static void main(String[] args) {
Teacher t = new Teacher("hou");
try {
t.prelect();
} catch (NoPlanException e) {
System.out.println(e.toString());
System.out.println("换老师");
}
}
}
50.Finally代码块
51.异常在子父类覆盖中的表现
① 子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法只能抛出父类的异常
或者该异常的子类
② 如果父类的方法抛出多个异常,那么子类在覆盖该方法时只能抛出该异常的子集
③ 如果父类或者接口的方法中没有异常抛出那么子类在覆盖方法时也不可以抛出异常
如果子类方法发生了异常,就必须进行try处理绝对不能抛出。
52.异常总结
异常体系
Throwable
|--Error
|--Exception
|--RuntimeException
异常体系的特点
异常体系中的所有类以及建立的对象都具备可抛性。也就是说可以被throw和throws关键字所操作。只有异常体系具备这个特点。
throw和throws的用法
throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。
当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,否则编译失败。
注意,RuntimeException除外。也就说,函数内如果抛出的RuntimeExcpetion异常,函数上可以不用声明。
如果函数声明了异常,调用者需要进行处理。处理方法可以throws可以try。
异常有两种:
编译时被检测异常
该异常在编译时,如果没有处理(没有抛也没有try),编译失败。
该异常被标识,代表这可以被处理。
运行时异常(编译时不检测)
在编译时,不需要处理,编译器不检查。
该异常的发生,建议不处理,让程序停止。需要对代码进行修正。
有三个结合格式:
1. try{
}catch (){
}
2. try{
}finally{
}
3. try{
}
catch (){
}finally{
}
注意:
1,finally中定义的通常是 关闭资源代码。因为资源必须释放。
2,finally只有一种情况不会执行。当执行到System.exit(0);fianlly不会执行。
自定义异常:
定义类继承Exception或者RuntimeException
1,为了让该自定义类具备可抛性。
2,让该类具备操作异常的共性方法。
当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
异常异常信息传递给父类的构造函数。
class MyException extends Exception{
MyException(String message){
super(message);
}
}
自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装。
异常的好处:
1,将问题进行封装。
2,将正常流程代码和问题处理代码相分离,方便于阅读。
异常的处理原则:
1,处理方式有两种:try 或者 throws。
2,调用到抛出异常的功能时,抛出几个,就处理几个。
一个try对应多个catch。
3,多个catch,父类的catch放到最下面。
4,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。
也不要不写。
当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
try{
throw new AException();
}
catch (AException e){
throw e;
}
如果该异常处理不了,但并不属于该功能出现的异常。
可以将异常转换后,在抛出和该功能相关的异常。
或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,
当调用者知道。并处理。也可以将捕获异常处理后,转换新的异常。
try{
throw new AException();
}
catch (AException e){
// 对AException处理。
throw new BException();
}
比如,汇款失败的例子。
异常的注意事项:
在子父类覆盖时:
1,子类抛出的异常必须是父类的异常的子类或者子集。
2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。