Java必知基础(四)

抽象类和接口

在程序中随着继承层次中一个个新子类的定义,类变得越来越具体而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计的非常抽象,以至于它没有具体的实例,这样的类叫做抽象类(abstract class)

有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但Java不支持多重继承。于是便有了接口就可以得到多重继承的效果。
从本质上讲接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

  • 相同点:
  1. 都不可被实例化,只能实例化其子类。
  2. 抽象方法都没有方法体。
  • 不同点:
  1. 抽象类有构造器而接口没有;
  2. 抽象类中可以没有抽象方法,但接口中只能有抽象方法;
  3. 抽象类中的可以有常量和变量而接口中只能有常量。

ps:Java中的类只能单继承(类)但可以多实现(接口),接口可以多继承接口。

异常处理

在Java语言中,将程序执行中发生的不正常的情况称之为 “异常”。可分为以下两类:

  • error: Java虚拟机无法解决的严重问题。如虚拟机错误(VirtualMachineError)和线程死锁(ThreadDeath),一旦error出现,程序就挂掉了;
  • exexception : 其它因编程错误或偶然的外在因素导致的一般性问题,它又分为两大类,运行时异常(RuntimeException)和编译是异常(如:ClassCastException)。

在Java中所有表示异常的最终父类是Throwable,Error,Exception都是继承自它。

Java提供的是异常处理的抓抛模型, 如果在程序执行过程中出现异常,就会生成一个异常类对象,改异常对象将被提交给Java运行时系统这个过程称为抛出(throw)异常。Java提供了两种处理异常的方式:

  • 处理方式一
     try{
		// 会出现异常的代码
      }catch (Exception e1){  异常类型

      }catch (Exception e2){
          
      } finally {
          //无论异常是否发生都会执行
      }
      //可以有多个catch语句  try中抛出的异常对象从上往下去匹配catch 中的异常类型,一旦满足就执行catch中的代码,执行完就跳出其后的多条catch语句。
   
  • 处理方式二
//在方法的声明处,显示的抛出该异常对象的类型
public void init()throws ArrayIndexOutOfBoundsException{
		//会发生异常的代码
    }
// 显示的抛出后会由该方法的调用者来处理异常。可以抛出多个异常类型
  • 处理方式三
//在可能发生异常的代码处手动抛出异常对象,由调用者来处理异常
   public void main()  {
        throw new ArrayIndexOutOfBoundsException("数组越界");

    }

可以通过如下表格来理解异常处理:

捕获异常抛出异常声明异常
try(执行可能产生异常的代码)throw(在异常的生成阶段手动抛出异常对象)throws(声明方法可能要抛出的各种异常类型由调用者处理)
catch(捕获异常)
finally(无论是否发生异常代码总会被执行)

throw 与throws 区别

  • throw是在方法内使用,后面跟异常实例,用于抛出一个异常;如果后面接的异常是RuntimeException及其子类,那么方法声明时就不需要使用throws抛异常;如果后面接的是Exception及其子类,则方法声明上必须有throws;
  • throws是在方法声明后面,后面跟一个或者多个异常类型,用逗号分隔;如果后面接的是RuntimeException及其子类,那么方法调用者不用处理该异常;如果是Exception及其子类,那么调用者要么try/catch,要么继续使用throws抛出。

final、finally、finalize

其实这三个关键字之间没有什么联系,仅仅只是长的像而已。

  1. final 是一个修饰符
  • 修饰类:该类不能被继承,所以一个类不能同时被final和abstract修饰;
  • 修饰属性:该属性一旦赋值就不能被更改,即此时该属性为常量;
  • 修饰方法:该方法可以被调用,不能被子类重写。
  1. finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常,即使finally之前有return,finally块中代码都会执行。
  2. finalize是一个方法名, 是在对象被垃圾回收器删除它之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。

内部类

在Java中,内部类分为静态内部类,匿名内部类,成员内部类,局部内部类。

  • 静态内部类:定义在一个类里面且用static修饰的类,静态内部类是不需要依赖于外部类,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象;
public class Base {


    static class Base2{
        
    }
}

  • 匿名内部类:就是一个没有显式的名字的内部类,所以没办法引用它们,必须在创建时,作为new语句的一部分来声明它们;匿名内部类会隐式的继承一个类或者实现一个接口,它是一种没有构造器的类,大部分匿名内部类用于接口回调;
public class Base {
    
    
    public void init(){
       Base3 base3 = new Base3() {
           @Override
           void log() {
               System.out.print("你好");
           }
       };
    }
    
    abstract class Base3{
        abstract void log();
    }
}
  • 成员内部类:定义在类里面且没有用static修饰的类,是最普通的一个类,可以看做是外部类的成员;可以无条件访问外部类的成员变量和成员方法,即使用private修饰,其实成员内部类内部是持有额外部类的引用;外部类不能直接访问内部类的属性和方法,需要先创建内部类的对象然后使用这个对象的引用来访问;
public class Base {


    class Base4{
        
    }
 }
  • 局部内部类:定义在方法内部,代码块内部的类,就相当于方法里面的一个局部变量,所以类前面不能有任何修饰符,也不能在方法外部对其实例化使用。
public class Base {
    

    public void init(){
        
        class  Base5{
            
        }
    }
 }

ps:欢迎关注博主个人微信公众号!
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值