您的位置:首页 > 职场人生

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

2015-08-19 14:46 218 查看
——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 stati
f097
c 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培训、期待与您交流! ——-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  接口-异常-包