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

黑马程序员----总结1(继承、异常)

2015-07-06 14:23 441 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

继承:

特点:

1,提高了代码的复用性。

2,让类与类之间产生关系,是多态性的前提。

Java中的继承。

1,java只支持单继承,不支持多继承。为啥呢?答案:因为继承了多个父类如果有相同方法时,

子类对象不确定运行哪一个。

2,Java还支持多层继承。A–>B—>C 原来可以形成继承体系。

想要使用体系功能,”查阅父类功能,建立子类对象调用功能。”

注解:父类的由来其实是由事物中的共性内容不断向上抽取而来的。

所以父类中定义的是该体系中的最基本,最共性功能。

继承出现后,代码上也有一些特点:

1,变量。

当子父类中定义了相同的名称的成员变量,

子类要使用父类中的同名变量时,需要使用关键字super来区分。

一般不会出现这种情况,因为父类中有了,子类不需要定义。

而且父类定义时,一般变量都私有化。

2,函数。

子类可以直接访问父类中非私有的成员函数。

特殊情况:当子类中定义了与父类一模一样的方法时,会发生覆盖操作。大多指的是非静态方法。

最终会运行子类的方法,父类相当于被覆盖了。

函数的另一个特性:覆盖(重写,复写)。

什么时候用啊?

当父类的功能要被修改时,不建议修改源码。因为是灾难。

只要通过一个类继承原有类,定义一个新的升级后的功能即可。

但是功能是相同的,只是实现方法改变。这是子类可以沿袭父类中的功能定义,

并重写功能内容。这就是覆盖。

覆盖很爽,但是有注意事项:

1,子类覆盖父类时,必须权限要大于等于父类权限。

2,静态不能覆盖非静态。

3,构造函数。

构造函数可以本类进行对象初始化,也可以给子类对象进行初始化。

子类对象初始化过程:

子类中的所有构造方法都会访问父类中空参数的构造函数,

因为每一个构造函数的第一行,都有一句隐式的super语句。

为什么要有这条语句?

因为子类会获取到父类中的数据,必须要先明确父类对数据的初始化过程。

当父类中没有空参数构造函数时,子类构造函数必须通过super句来明确要访问的父类中指定的构造函数。

当时子类构造函数也可以通过this语句访问本类中的构造函数。

但是子类中肯定,至少有一个构造函数会访问父类。

抽象类:其实就是在分析事物时,事物中的功能有些是不明确的内容的。这些不明确内容就是抽象的。

可以通过抽象函数来描述。

抽象函数一定要定义在抽象类中,因为,抽象函数所在类,也必须被抽象标识。

写法特点:

1,抽象函数只对函数进行声明,没有函数主体。

2,抽象类和抽象函数都需要用abstract修饰。

3,抽象类不可以进行实例化。

4,想要使用抽象功能,必须通过子类覆盖了父类中所有的抽象方法后,才可以对子类实例化。

如果只覆盖了部分抽象方法,那么子类还是一个抽象类。

也可以理解为:抽象类是一个父类,是不断向上抽取而来的,

在抽取过程中,只抽取了方法声明,但没有抽取方法实现。

抽象类和一半类差不多。

区别:

抽象类可以定义抽象方法。

抽象类不可以建立对象。

其实抽象类一样用于描述事物,既可以定义抽象方法,也可以定义非抽象方法。

接口

初期理解:接口看上去是一个特殊的抽象类。里面存的都是抽象方法。

特点:

格式:

1,通过interface来定义。

2,接口中常见成员:常量,抽象方法。

而且这些成员都有固定的修饰符。

常量:public static final

方法:public abstract

3,接口中的成员都是共有的。

4,一个类可以对接口进行多实现,也弥补了多继承带来的安全隐患,所以java对多继承进行了改良。

用多实现方法来体现多继承的特性。

5,一个类可以继承一个类的同时,实现多个接口。

6,接口与接口之间是继承关系,而且可以多继承。

应用特点:

1,接口是对外暴露的规则。

2,接口是功能的扩展。

3,接口的出现降低了耦合性。

别忘了说的时候,需要举例。如usb。pci,主板。插座。

抽象类和接口异同:

相同:

1,都可以在内部定义抽象方法。

2,通常都在顶层。

3,都不可以实例化,都需要子类来实现。

不同点:

1,抽象类中可以定义抽象方法和非抽象方法,

而接口中只能定义抽象方法。

2,接口的出现可以多实现。

抽象类只能单继承。

也就是说:接口的出现避免了单继承的局限性。

3,继承和实现的关系不一致。继承:is a,实现:like a

异常:

是什么?是对问题的描述。将问题进行对象的封装。

异常体系:

Throwable

|–Error

|–Exception

|–RuntimeException

异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。

也就是说可以被throw和throws关键字所操作。

只有异常体系具备这个特点。

throw和throws的用法:

throw定义在函数内,用于抛出异常对象。

throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。

当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,都在编译失败。

注意,RuntimeException除外。也就说,函数内如果抛出的RuntimeExcpetion异常,函数上可以不用声明。

如果函数声明了异常,调用者需要进行处理。处理方法可以throws可以try。

异常有两种:

编译时被检测异常

该异常在编译时,如果没有处理(没有抛也没有try),编译失败。

该异常被标识,代表这可以被处理。

运行时异常(编译时不检测)

在编译时,不需要处理,编译器不检查。

该异常的发生,建议不处理,让程序停止。需要对代码进行修正。

异常处理语句:

try

{

需要被检测的代码;

}

catch ()

{

处理异常的代码;

}

finally

{

一定会执行的代码;

}

有三个结合格式:

1、 try

{ }

catch ()

{ }

2、 try

{ }

finally

{ }

3、 try

{ }

catch ()

{ }

finally

{ }

注意:

1,finally中定义的通常是 关闭资源代码。因为资源必须释放。

2,finally只有一种情况不会执行。当执行到System.exit(0);fianlly不会执行。

自定义异常:

定义类继承Exception或者RuntimeException

1,为了让该自定义类具备可抛性。

2,让该类具备操作异常的共性方法。

当要定义自定义异常的信息时,可以使用父类已经定义好的功能。

异常异常信息传递给父类的构造函数。

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


自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装。

异常的好处:

1,将问题进行封装。

2,将正常流程代码和问题处理代码相分离,方便于阅读。

异常的处理原则:

1,处理方式有两种:try 或者 throws。

2,调用到抛出异常的功能时,抛出几个,就处理几个。

一个try对应多个catch。

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();
}


异常的注意事项:

在子父类覆盖时:

1,子类抛出的异常必须是父类的异常的子类或者子集。

2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: