java

一、接口:

接口对期成员变量和方法有很多限制:

1.接口中的成员变量默认都是public、static、final类型的,因而必须被显式的初始化;

2.接口中的方法默认都是public,abstract类型的.

3.接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法.

4.一个接口不能实现另一个接口,但是它可以继承其它多个接口.

接口和抽象类的主要区别:

1.在抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,提高代码的可重用性;而接口中只能包含抽象方法.

二、异常

异常流程的运行过程

(1)finally语句不能被执行的唯一情况是先执行了用于终止程序的System.exit()方法。

(2)return语句用于退出本方法.在执行try或catch代码块中的return语句时,假如有finally代码块,会先执行finally代码块.

public class WithResult{
    public int methodA(int money) throws SpecialException{
        if(--money<=0) throw new SpecialException("Out of money");
        return money;
    }
    public int methodB(int money)
    {
        try
        {
            System.out.println("Begin");
            int  result=methodA(money);
            return result;
        }
        catch (SpecialException e) {
            // TODO: handle exception
            System.out.println(e.getMessage());
            return -100;
        }
        finally{
            System.out.println("Finally");
        }
    }
    public static void main(String[] args)
    {
        System.out.println(new WithResult().methodB(1));
    }
}

结果:

Begin

Out of money

Finally

"return -100"

(3)finally代码块虽然在return语句之前被执行,但finally代码块不能通过重新给变量赋值的方式来改变return语句的返回值.

public static int test()
{
    int a=0;
    try{
        return a;
    }
    finally
    {
        a=1;
    }
}
public static void main(String[] args)
{
    System.out.println(test());
}

尽管先执行a=1;但是return 的值是0
(4)建议不要在finally代码块中使用return语句,因为它会导致一下两种潜在的错误。第一种是会覆盖try或者catch代码块中的return语句,第二种是丢失异常(try或者catch块中有抛出异常,但是在finally中被无意间取消)。

在程序运行中,任何中断正常流程的因素都被认为是异常.按照面向对象的思想,java语言用java类来描述异常.所有的异常类的祖先类为java.lang.Throwable类。他有两个方法:getMessage()和printStackTrace()。Throwable类有两个子类:Error类,表示仅靠程序本身无法恢复的严重错误,比如内存空间不足,或者java虚拟机的方法调用栈溢出。Exception类,表示程序本身可以自己处理的异常。

应该尽量保持异常的原子性.异常的原子性是指当异常发生后,各个对象的状态能够恢复到异常发生前的初始状态,而不至于停留在某个不合理的中间状态.保持异常的原子性有以下办法:

(1)最常见的方法是先检查方法的参数是否有效,确保当异常发生时还没有改变对象的初始状态.

(2)编写一段恢复代码,由他来解释操作过程中发生的失败,并且使对象状态回滚到初始状态.

(3)在对象的临时拷贝上进行操作,当操作成功会,把临时拷贝中的内容覆盖到原来的对象中.

三、内部类

内部类:在一个类的内部定义的类称为内部类。

实例内部类:成员内部类的一种,没有static修饰符。

(1)在创建实例内部类的实例时,外部类的实例必须已经存在。例如,要创建Inner类,则先必须创建Ourter类。

    Outer.Inner tool=new Outer().Inner()

(2)实例内部类的实例自动持有外部类实例的应用,可以访问外部类的所有成员。

(3)外部类实例与内部类实例之间是一对多的关系,一个内部类实例只会引用一个外部类实例,而一个外部类实例可以引用多个内部类实例。

(4)在实例内部类中不能定义静态成员,而只能定义实例成员。

(5)如果实例内部类B与外部类A包含同样的成员v,那么在类B中使用this.v表示B的成员,A.this.v表示A的成员

静态内部类:成员内部类的一种,使用static修饰。

(1)静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不必先创建外部类。

(2)静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员,就必须先创建外部类的实例。通过外部类的实例去访问。

(3)在静态内部类中可以定义静态成员和实例成员。

(4)客户类可以通过完整的类名直接访问静态内部类的静态成员。

原文地址:https://www.cnblogs.com/limingluzhu/p/2830105.html