黑马程序员—接口,异常,包

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

1.接口:
接口:初期理解,可以认为是一个特殊的抽象类
当抽象类中的方法全部都是抽象的,那么该类可以通过接口的形式表示。
class 用于定义类
interface用于定义接口

接口定义时,格式特点:
1.接口中常见定义:常量,抽象方法。
2.接口中的成员都有固定修饰符。
常量:public static final
方法:public abstract
记住:接口中的成员都是public的。

接口:不可以创建对象,因为有抽象方法。
需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化,
否则子类是一个抽象类。
implements(实现,关键字.) extends(继承,关键字.)

接口可以被类多实现,也是对不支持多继承的转换形式,java支持多实现。
有个特殊情况,只有在接口与接口之间存在多继承,其他都是单继承。

类与类之间是继承关系。
接口与类之间是实现关系。
接口与接口之间是继承关系。

代码1:

interface Inter
{
    public static final int NUM = 3;
    public abstract void show();

}

interface InterA
{
    public abstract void method();
}

class Demo
{
    public void function(){}
}

class Test extends Demo implements Inter,InterA     //继承的同时,实现多接口。
{
    public void show(){}
    public void method(){}      //对接口的多实现。
}

class InterfaceDemo
{   
    public static void main(String[] args)
    {
        Test t = new Test();
        System.out.println(t.NUM);
        System.out.println(Test.NUM);
        System.out.println(Inter.NUM);
    }
}

代码2:

interface A
{
    public abstract void methodA();
}

interface B extends A
{
//B接口继承A接口
}

interface C extends B
{
    public abstract void methodC();         
    //C接口继承B接口
}

//D接口实现C接口
{
    public abstract void methodA(){}
    public abstract void methodB(){}
    public abstract void methodC(){}        
    //D接口要想实现C接口必须覆盖里面的三个函数。

}

/*
接口的特点:
1.接口是对外暴露的规则。
2.接口是程序的功能扩展。
3.接口可以用来多实现。
4.类与接口之间是实现关系,而且类可以继承
一个类的同时实现多个接口。
5.接口与接口之间可以有继承关系。
基本功能定义在类中,扩展功能定义在接口中

2.异常:
引导:
对于问题的划分:
1.严重的问题。
2.非严重的问题。
对于严重的问题,java通过Error类进行描述。
对于Error,一般不编写针对性代码对其进行处理。

对于非严重的问题,java通过Exception类进行描述。
对于Exception,可以使用针对性的处理方式进行处理。

无论是Error或者Exception都具有一些共性内容。
例如:不正常情况的信息,引发原因等。

Throwable
|–Error
|–Exception
|–RuntimeException

2.1 异常的概念:
就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中一个具体的事物
也可以通过java的类的形式进行描述,并封装成对象。
其实异常就是对不正常情况进行描述后的对象体现。

2.2: 异常的处理:
java提供了特有的语句进行处理。

try
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理异常的代码;(处理方式)
}
finally
{
一定会执行的语句;
}

2.3 对捕获到的异常对象进行常见方法操作。
getMessage();获取异常信息。
toString(); 异常名称,异常信息。
printStackTrace(); 异常名称,异常信息,异常出现的位置。

2.4 在函数上声明异常,便于提高安全性,让调用者进行处理,不处理编译失败。

2.5 对多异常的处理。
1)声明异常时,建议声明更为具体的异常:这样处理的可以更具体。
2)对方声明几个异常,就对应有几个catch块,不要定义多余的catch块。
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
3)建议在进行catch处理时,catch中一定要定义具体处理方式,
不要简单定义一句e.printStackTrace();
也不要简单的就书写一条输出语句。

代码1:

class Demo
{
    int div(int a ,int b) //throws Exception:在功能上通过throws的关键字声明了该功能有可能会出现问题。
    {
        return a/b;
    }
}

class  ExceptionDemo
{
    public static void main(String[] args) 
    {
        Demo d = new Demo();
        try
        {
            int  x =d.div(5,0);
            System.out.println("x="+x);
        }
        catch (Exception e)//Exception e = new ArithmeticException();
        {
            System.out.println("除零");
            System.out.println(e.getMessage()); 
            System.out.println(e.toString());
            //异常名称,异常信息。

    //异常名称,异常信息,异常出现的位置。
    //其实jvm默认的异常处理机制,就是在调用printStackTrace方法。
    //打印异常的堆栈内的跟踪信息。
        }
        System.out.println("it's over.");
    }
}

代码2:


class Demo
{
    int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException//处理多异常。
    {
        int[] arr=new int[a];
        System.out.println(arr[4]);

        return a/b;
    }
}

class ExceptionDemo
{
    public static void main(String[] args)
    {
        Demo d = new Demo();

        try
        {
            int x =d.div(5,1);
            System.out.println("x="+x);
        }

        catch (ArrayIndexOutOfBoundsException e)//具体针对性声明
        {
            e.printStackTrace();
            System.out.println("角标越界了!!");
        }


        catch (ArithmeticException e)//具体针对性声明
        {
            e.printStackTrace();
            System.out.println("被零除了!!");

        }
            System.out.println("Over!!");
    }

}

因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。
所以对于这些特有的问题可以按照java的对问题封装的思想,将特有的问题进行自定义的异常封装。

自定义封装:

要求:在本程序中,对于除数是负数的情况,也视为是错误的,无法进行运算的。
那么就需要对这个问题进行自定义的描述。

当在函数内部出现了throw抛出异常对象,那么就必须要给对象的处理动作。
要么在内部try catch处理。
要么在函数上声明让调用者处理。

一般情况,函数内出现异常,函数上需要声明。

发现打印的结果中只有异常的名称,却没有异常的信息。
因为自定义的异常并未定义异常信息。

如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了。
所以子类只要在构造时,将异常信息通过super语句传递给父类。
那么就可以直接通过getMessage方法获取自定义的异常信息。

演变过程:

class Throwable
{
    private String message;
    Throwable(String message)
    {
        this message = message;
    }
    public String getMessage()
    {
        return message;
    }
}

class Exception extends Throwable
{
    Exception(String message)
    {
        super(message);
    }
}

自定义异常:
必须是自定义类继承Exception。

继承Exception原因:
异常体系有一个特点:异常类和异常对象都被抛出,他们都具备可抛性。
这个可抛性是Throwable 这个体系中的独有特点。
只有这个体系中的类和对象才可以被throws和throw操作。

class FuShuException extends Exception
{
     private int value;
     FuShuException()
    {
        super();//隐视的。
    }
     FuShuException(String msg,int value)
    {
        super(msg);
        this.value = value;
    }
    public int getValue()
    {
        return value;
    }

}

class Demo
{
    int div(int a, int b)throws FuShuException
    {
        if(b<0)
            throw new FuShuException("出现了除数是负数的情况___",b);
        return a/b;
    }
}

class ExceptionDemo
{
    public static void main(String[] args)
    {
        Demo d = new Demo();
        try
        {
            int x = d.div(5,-8);
            System.out.println("x="+x);
        }
        catch (FuShuException f)
        {
            System.out.println(f.toString());
            System.out.println("错误的负数是:"+f.getValue());
        }
            System.out.println("it's over .");
    }
}

throw 和 throws的区别:
1.throws使用在函数上。(大括号和小括号之间)
throw使用在函数内。(小括号内)

2.throws 后面跟的是异常类,可以跟多个,用逗号隔开。
throw 后面跟的是异常对象。

java.lang.Object>java.lang.Throwable>java.lang.Exception>java.lang.RuntimeException>java.lang.ArithmeticException

Exception中有一个特殊的子类异常 RuntimeException运行时异常。

如果在函数内抛出该异常,函数上可以不用声明,编译一样通过。
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。

之所以不用在函数上声明,是因为不需要让调用者处理。
当该异常发声,希望程序停止。因为在运行时,出现了无法继续运算的情况。
希望停止程序后,对代码进行修正。

自定义异常时,如果该异常的发生,无法再继续进行运算。
就让自定义异常继承RuntimeException。

对于异常分两种:
1.编译时被检测的异常。
2.编译时不被检测的异常(运行时异常。RuntimeException以及其子类。)

异常的好处:
1、将问题进行封装。
2、将正常流程代码和问题处理代码相分离,方便阅读。

异常的处理原则:
1、处理方式有两种:try或者throws。
2、调用到抛出异常的功能时,抛出几个,就处理几个。
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();
    }

finally代码块:定义一定执行的代码,通常用于关闭资源。

class FuShuException extends Exception
{
    FuShuException(String msg)
    {
        super(msg);
    }
}
class Demo
{
    int div(int a,int b) throws FuShuException
    {
        if(b<0)
        throw new FuShuException("除数是负数不可以的。");
        return a/b;
    }
}
class ExceptionDemo
{
    public static void main(String[] args)
    {
        Demo d = new Demo();
        try
        {
            int x=d.div(5,-1);
            System.out.println("x="+x);
        }
        catch (FuShuException f)
        {
            System.out.println(f.toString());

        }
        finally
        {
            System.out.println("必须执行");
        }
            System.out.println("OVER");
    }
}



class NoException extends Exception
{

}

public void method() throws NoException
{
    连接数据库;

    数据操作;//throw new SQLException();

    关闭数据库;//该动作,无论操作是否成功,一定要关闭资源。

    try
    {
        连接数据库;

        数据操作;//throw new SQLException();
    }
    catch (SQLException e)
    {
        会对数据库进行异常处理;
        throw new NoException();
    }
    finally
    {
        关闭数据库;
    }
}

处理异常的几种格式:
格式1:
try
{

}
catch ()
{
}

格式2:
try
{

}
catch ()
{
}
finally
{
}
格式3:
try
{

}
finally
{
}

记住一点:catch是用于处理异常,如果没有catch就代表异常没有被处理过,如果该异常是检测异常,那么必须声明。
异常在子父类覆盖中的体现:
1.子类在覆盖父类时,如果父类方法抛出了异常,那么子类的覆盖方法,
只能抛出父类的异常或者该异常的子类,或者不抛。

2.如果父类方法抛出多个异常,那么子类在覆盖该方法时,
只能抛出父类异常的子集。

3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
如果子类方法发声异常,就必须要进行try处理,绝对不能抛。

需求1:有一个圆形和长方形,都可以获取面积。
对于面积如果出现非法的数值,视为获取面积出现问题。
问题可以通过异常来表示。

class NovalueException extends RuntimeException
{
    NovalueException(String message)    
    //自定义了一个运行异常。
    {
        super(message);
    }
}

interface Shape
{
    void getArea();     
    //定义了一个求面积的功能。
}

class Rec implements Shape  
//定义了一个长方形类实现图形接口。
{
    private double length,width;
    Rec(double length,double width)
    {
        if(length<=0 || width<=0)
            throw new NovalueException("出现了非法的值");
        this.length = length;
        this.width = width;
    }
    public void getArea()
    {
        System.out.println("Area="+length * width);
    }
}

class Cir implements Shape  
//定义了一个圆形类实现图形接口。
{
    private double radius;
    private static final double  PI = 3.14;
    Cir(double radius)
    {
        if(radius<=0)
            throw new NovalueException("出现了非法的值");
        this.radius = radius;
    }
    public void getArea()
    {
        System.out.println("Area="+radius * radius * PI);
    }
}

class ExceptionDemo
{
    public static void main(String[] args)
    {
        Rec r = new Rec(3.5,2.0);
        r.getArea();

        Cir c = new Cir(8.0);
        c.getArea();

        System.out.println("over!");
    }
}

需求2:有一个圆形和长方形,都可以获取面积。
对于面积如果出现非法的数值,视为获取面积出现问题。
问题可以通过异常来表示。

class NovalueException extends RuntimeException
{
    NovalueException(String message)
    {
        super(message);
    }
}

interface Shape
{
    void getArea();
}

class Rec implements Shape
{
    private double length,width;
    Rec(double length,double width)
    {
        if(length<=0 || width<=0)
            throw new NovalueException("出现非法的负值");

        this.length = length;
        this.width = width;
    }

    public  void getArea()
    {
        System.out.println("Area="+length * width);
    }

}

class Cir implements Shape
{
    private double radius;
    private static final double PI = 3.14;
    Cir(double radius)
    {
        if (radius<=0)
            throw new NovalueException("出现了非法的负值");

        this.radius = radius;
    }

    public void getArea()
    {
        System.out.println("Area="+radius * radius * PI);
    }
}

class ExceptionDemo
{
    public static void main(String[] args)
    {
        Rec r = new Rec(2.0,3.0);
        r.getArea();

        Cir c = new Cir(4.0);
        c.getArea();

        System.out.println("over");
    }
}

3.包:
包:package,需要放在程序的第一行,包名全部小写。
创建pack包文件在当前目录下的命令:javac -d . 类名.java
或者javac -d e:\java2015\day04(指定目录) 类名.java(放到指定文件夹)
运行的时候命令:java 包名.类名

1.包与包之间进行访问,被访问的类以及类中的成员,需要public修饰。
2.不同包中的子类还可以直接访问父类中被protected权限修饰的成员。

包与包之间可以使用的权限只有两种:public protected。
public protected default(默认) private
同一个类中 OK ok ok ok
同一个包中 OK ok ok
子类 ok ok
不同包中 ok
类名前加了public,类名必须和java文件名一致,一个.java文件里不能存在两个或两个以上的共有类或者接口。

package pack.haha.hehe.heihei.huhu;
多层包目录文件:pack文件夹——haha文件夹——hehe文件夹——heihei文件夹
——huhu文件夹——类名.class文件。里面的包可以称为子包。
pack.haha.hehe.heihei.huhu.Demo d = new pack.haha.hehe.heihei.huhu.Demo();
import:为了简化类名的书写,使用一个关键字import。
import导入的是包中的类。

书写代码的时候只要在代码行首行写:
import pack.haha.hehe.heihei.huhu.Demo;
实际开发中不这么写,建议不用通配符*,需要用到包中哪个类,就导入哪个类。

下面创建对象只要写:
Demo d = new Demo();

如果说下面好多类
import pack.haha.hehe.heihei.huhu.Demo;
import pack.haha.hehe.heihei.huhu.Demo1;
import pack.haha.hehe.heihei.huhu.Demo2;

可以简写成:
import pack.haha.hehe.heihei.huhu.*;
指导入了本包目录下的所有类,不包含子包(haha)中的类。
import pack.*;
import pack.haha.*;

建议定义包名不要重复,可以使用url(统一资源定位符)来完成定义,url是唯一的。

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值