强制类型转换、多态、内部类、错误处理

强制类型转换

Animal a = new Mouse("多态");
Mouse m = (Mouse) a;//强制类型转换(使用场景:当需要用到Mouse类的特有的方法的时候)

类型转换最常见的问题类型:java.lang.classcastexception.强制类型转换失败

接口关系下的多态

实现关系下的多态:

接口 变量 = new 接口实现类的对象;

//接口Dao
interface Dao{
public void add();
public void delete();
}
//接口的实现类
class UserDao implements Dao{
    public void add(){
        System.out.println("添加员工成功!!")
    }
    public void delete(){
        System.out.println("删除员工成功!!")
    }
}

class Demo3{
    public static void main(String[] args){
        //接口实现关系的多太
        Dao d = new UserDao();//接口的引用类型变量指向了接口实现类的对象。
        d.add;//接口的多态引用类型变量只能调用实现类的方法,因为接口的方法全部都是非静态的,非静态的方法永远只能调用实现子类的
    }
}

成员内部类

内部类:一个类定义在另外一个类的内部,那么该类就称作为内部类;

内部类的class文件名:外部类$内部类;// 好处是:便于区分该class文件是属于哪个外部类的。

内部类的类别:

1、成员内部类:

类里面的类

成员内部类的访问方式:

​ 方式一:在外部类提供一个方法创建内部类的对象进行访问;

​ 方式二:在其他类直接创建内部类的对象;格式: 外部类.内部类 变量名 = new 外部类().new 内部类()

注意:如果是一个静态内部类,那么在其他类创建的格式: 外部类.内部类 变量名 = new 外部类.内部类()

内部类的应用场景:我们在描述A事物的时候,发现描述的A事物内部还存在另外一个比较复杂的事物B的时候,而且这个比较复杂的事物B还需要访问A事物的属性等数据,name这时候我们就可以使用内部类描述B事物。

内部类的好处:内部类可以直接访问外部类的所有成员。

内部类要注意的细节:1、如果外部类与内部类存在同名的成员变量时,在内部默认情况下是访问内部类的成员变量(可以通过“外部类.this.成员变量名”指定访问外部类成员变量名);2、私有的成员内部类只能在外部类提供一个方法创建内部类的对象进行访问,不能在其他类创建对象访问;3、成员内部类一旦出现了静态的成员,那么该类也必须使用static修饰;

2、局部内部类:

局部内部类:在一个雷的方法内部定义另外一个类,那么另外一个类就称作为局部内部类。

局部内部类要注意的细节:1、如果局部内部类访问了一个局部变量,那么该局部变量必须使用final修饰;

匿名内部类

匿名类:没有类名的类。

好处:简化书写。

使用前提:必须存在继承或者是实现关系才能使用。

匿名内部类:匿名内部类只是没有类名,其他的一概成员都是具备的。

// Animal是父类
// 匿名内部类与Animal是继承的关系。目前是创建Animal子类的对象。
new Animal(){
    // 匿名内部类的成员
    public void run () {
        System.out.println("狗仔跑...")
    }
    // 特有的方法
    public void bite(){
        System.out.println("狗在咬人!") 
    }
}.run()
// 使用多态的方法创建
Animal a = new Animal(){ //多态
    // 匿名内部类的成员
    public Animal run(){
        System.out.println("狗仔跑..."); 
        return this;
    } 
     public Animal sleep(){
        System.out.println("狗在睡觉!"); 
    }
    // 特有的方法不能再用此方法调用
}
a.run();
a.sleep();

匿名内部类一般是用于实参。

Throwable以及错误

用于描述程序不正常的情况的类我们称作为异常类,很多异常类堆积起来,就形成了Java中的异常体系。

Throwable:所有异常或者错误类的超类;包括error和exception两大子类。

Error:错误 错误一般是用于jvm或者是硬件引发的问题,所以我们一般不会通过代码去处理错误的。

Exception:异常 是需要通过代码去处理的。

jvm一旦发现了不正常的情况的时候,namejvm就会马上创建一个对应的异常对象,并且会调用这个异常对象的printstacktrace方法。

异常的处理:

方式一:捕获处理

​ 捕获处理的格式:

​ try{

​ 可能发生异常的代码

​ }catch(捕获的异常类型 变量名){

​ 处理异常的代码

​ }

捕获处理要注意的细节:

1、如果try块中代码出了异常经过了处理之后,那么try-catch块外面的代码可以正常执行。

2、如果try块中处理异常的代码,那么在try块中出现异常代码后面的代码是不会执行了。

3、一个try块后面是可以跟有多个catch块的,也就是一个try块可以捕获多种异常类型的。

4、一个try块可以捕获多种异常的类型,但是捕获的异常类型必须从小到大进行捕获,否则编译报错。

方式二:抛出处理

抛出处理要注意的细节:

1、如果一个方法的内部抛出了一个异常对象,那么必须要在方法上声明抛出;

2、如果调用了一个声明抛出异常的方法,那么调用者必须要处理异常(try catch或抛出至main也就是jvm虚拟机);

3、如果一个方法内部跑出了一个异常对象,namethrow语句后面的代码都不会再执行了(一个方法遇到了throw关键字,该方法也会马上停止执行了);

4、在一种情况下,只能抛出一种类型异常对象。

throw与throws两个关键字:

1.throw关键字是用于方法内部的,throws是用于方法声明上的;

2.throws关键字是用于方法内部抛出一个异常对象的,throws关键字适用于在方法生命上声明抛出异常类型的;

3.throw关键字后面只能有一个异常对象,throws后面一次可以声明抛出多种类型的异常。

数据分成三层:

web(UI)层、service层(业务逻辑层)、dao层(数据持久层)

疑问:何时使用抛出处理?何时使用捕获处理?原则是如何?

如果你需要通知到了调用者,你代码出了问题,那么这时候就使用抛出处理;如果代码是直接与用户打交道遇到了异常千万不要再抛,再抛的话就给了用户了,这时候就应该使用捕获处理了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值