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

黑马程序员->面向对象 (2 -多态,异常

2012-09-26 21:34 239 查看
--------------------android培训java培训、期待与您交流! ---------------------

3.4............................................................多态(//多态-多态-多态-多态-多态)

定义:某一类事物的多种存在形态。

例子:动物中猫,狗。 猫这个对象对应的类型是猫类型;猫 x = new 猫();

同时猫也是动物中的一种,也可以把猫称为动物。 动物 y = new 猫();

//动物是猫和狗具体事物中抽取出来的父类型。

//父类型引用指向了子类对象。

1. 多态的体现。父类的引用指向了自己的子类对象,父类的引用也可以接受自己的子类对象。

2. 多态的前提。 必须是类与类之间有关系,要么继承,要么实现。通常还有一个前提。存在覆盖。

3. 多态的好处。 多态的出现大大的提高程序的扩展性。

4. 多态的弊端。 提高了扩展性,但是只能使用父类的引用访问父类中的成员。

// 以前 Cat a = new Cat(); 现在 Animal a = new Cat();------这是多态。

用Animal a = new Cat(); 时 父类Animal和子类Cat都有的方法能用。

而子类自有的特性方法要涉及----------------类型提升。类型转换。

//需要强制将父类的引用,转成子类类型向下转型。

cat c = (cat)a;

c.catchMouse();

//千万不要出现这样的操作,就是将父类对象转成子类对象。 我们能转换的是父类应用指向了自己的子类对象时,

//该应用可以被提升,也可以被强制转换。 多态至始至终都是子类对象在做着变化。

为避免子类类型错误,可以加入判断语句: if(a instanceof b),判断a是否为b类型的东西。

//在多态中成员变量函数的特点;

在编译时期: 参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败。

在运行时期: 参阅对象所属的类中是否有调用的方法。

//简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点:

无论编译和运行,都参考左边(引用型变量所属的类)

在多态中,静态成员函数的特点:

无论编译和运行,都参考左边。

3.4.5........ object类

object:是所有对象的直接后者间接父类,传说中的上帝。该类中定义的肯定是所有对象都具备的动能。

equals:equals方法是比较两个对象(地址)是否相等。返回值为 boolean 型:false 或true

System.out.println(obj1.equals(obj2))

//用object的equals的比较方法时,比较各对象特有方法变量时,要强转回子类对象。

if(!(obj instanceof Demo)) return false; Demo d = (Demo)obj; return this.num == d.num;

tostring:将对象所属的类和对象的哈希值输出出来。

System.out.println(对象.tostring); //结果是::对象所在的类@对象的十六进制哈希值。

因为所有的对象都是独立存在于内存中,有独立的内存地址值,所以tostring方法封装在 object 类中。

//相当于 getClass().getName()+'@'+Integer.toHexString(hashCode));

System.out.println(对象.getClass().getName()+'@'+Integer.toHexString(对象.hashCode)));

3.4.6............内部类//内部类

将一个类定义在另一个类的里面,对里面那个类就成为内部类(内置类,嵌套类)。

访问特点;内部类可以直接访问外部类中的成员,包括私有成员。

而外部类要访问内部类中的成员必须要建立内部类的对象。

//内部类访问外部类成员,不需要建立外部的对象就可直接访问。外部类访问内部,必须要建立内部的对象。

//之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:外部.this.变量。

如果要直接访问内部类成员,要这样写: 外部.内部 名字 = new 外部().new 内部();

//外部类和内部类中有相同名字变量时,调用变量前要加>> 外部.this.变量 <<标明是外部的this。

2. 当内部类在成员位置上,就可以被成员修饰符所修饰。

比如:private :将内部类在外部类中进行封装。

static :内部类就具备 static 的特性。

//当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。

在外部其他类中,如何直接访问 static 内部类的非静态成员呢?

new Outer.Inner().function();

在外部其他类中,如何直接访问 static 内部类的静态成员呢?

Outer.Inner.function();

//注意: 当内部类中定义了静态成员,该内部类必须是static 的。

// 当外部类中的静态方法访问内部类时,内部类也必须是static的。

内部类的由来:

当描述事物时,事物的内部还有事物,该事物用内部类来描述。

因为内部事物在使用外部事物的内容。//用于程序设计上。

内部类定义在局部时;

1.不可以被成员修饰符修饰。

2.可以直接访问外部类中的成员,因为还持有外部类中的引用。

但是不可以访问它所在的局部中的变量。只能访问被 final 修饰的局部变量。

class Outer{

void method(){

final int y = 4;

class Inner{

void function(){

System.out.println(y);

}

}

new Inner().function();//这里不能写在局部内部类的上面,因为在上面时执行这句会

} //提示找不到类,因为下面的类还木有执行到语句。

}

匿名内部类:

1.匿名内部类其实就是内部类的简写形式。

2.定义匿名内部类的前提://内部类必须是继承一个类或者实现接口。

3.匿名内部类的格式: new 父类或者接口(){定义子类的内容}

new AbsDemo()

{

void show(){

System.out.println();

}

}.show();

4.其实匿名内部类就是一个匿名子类对象,而且这个类都点胖。可以理解为带内容的对象。

5.匿名内部类中定义的方法最好不要超过3个。

3.5...................................................................异常//异常-异常-异常-异常

异常的体系: Throwable : Error : 通常出现重大问题如:运行的类不存在或者内存溢出等。

: 不编写针对代码对齐处理。

Exception : 在运行时运行出现的一些情况,可以通过 try catch finally

Exception 和 Error 的子类名都是以父类名作为后缀。

//异常由来: 问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。

//其实就是java度不正常情况进行描述后的对象体现。

对于问题的划分:两种:一种是严重的问题,一种是非严重的问题。

//对于严重的,java通过Error类进行描述。对于Error一般不编写针对性的代码对其进行处理。

//对于非严重的,java通过Exception类进行描述。对于Exception可以使用针对性的代码对其进行处理。

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

3.5.2.....异常的处理 //java提供了特有的语句进行处理

try try

{ {

需要被检测的代码 int x = d.div(4,0);

} }

catch (异常类 变量) catch (Exception e)//Exception e = new ArithmeticException();

{ {

处理异常的代码:(处理方式) System.out.println("除零了");

} System.out.println(e.getMessage());// by zero

finally System.out.println(e.toSrting());// 异常名称,异常信息

{ } //其实jvm默认的异常处理机制,就是在调用printstackTrace方法,

一定会执行的语句; //打印异常的堆栈的跟踪信息。

}

3.对捕获到的异常进行常见方法操作 throws throws throws throws throws throws throws throws

String getMessage

异常声明 throws ,在功能上通过 throws 的关键字声明了该功能有可能会出现问题。

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

4.对多异常的处理

//1.声明异常时,建议声明更为具体的异常,这样处理的可以更具体。

//2.对方声明几个异常,就对应几个catch块。 如多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

建议在进行catch处理时,catch中一定要定义具体处理方式,不要简单定义一句,e.printStackTrace(),

也不要简单的就书写一条输出语句。

5.自定义异常 throw throw throw throw throw throw throw throw

//因为项目中会出现特有问题,而这些问题并未被java所描述并封装对象。所以对于这些特有的问题可以按照

//java的对问题封装的思想,将特有的问题,进行自定义异常封装。

当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。

要么在内部 try catch 处理。

要么在函数上声明让调用者处理。

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

if (条件)

throw new /*自定义异常名称*/ //手动通过throw关键字抛出一个自定义异常对象。

自定义异常结果只有异常名称,没有异常信息。自定义异常信息方法:

//因为父类已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给父类通过

//super语句。那么就可以直接通过getMessage 方法获取自定义的异常信息。

自定义异常类必须继承 Exception . 继承 Exception 原因:

//异常体系有一个特点:因为异常类和异常对象都被抛出。

//他们都具有可抛性,这个可抛性是 Throwable 这个体系中独有特点。

只有这个体系中的类和对象才可以被 throws 和 throw 操作。

throws 和 throw 区别:

throws 使用在函数上, throw 使用在函数内。

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

6. RuntimeException

这个异常类下的子类,在函数内 throw 了,不用在函数上声明。编译一样通过,如 ArithmeticException

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

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

//子所以不用在函数上声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了

//无法继续运算的情况,希望程序停止后,对代码进行修正。

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

对于异常分两种:

1.编译时被检测的异常。

2.编译时不被检测的异常(运行时异常, RuntimeException 以及其子类)

7. finally

finally 中存放的是一定会执行的代码。//通常用于关闭资源。

8. try 的三种格式

try try try

{ { {

} } }

catch () catch() finally

{ { {

} } }

finally //catch是用于处理异常,如果没有catch就代表异常没有被处理

{ //过,如果该异常是检测时异常。那么必须声明。

}

9. 异常在子父类中的体现:

1.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。

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

3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。

如果子类方法发生了异常,就必须要进行 try 处理绝对不能抛。

10.包 package (文件夹)

//对类文件进行分类管理。 给类提供多层命名空间。 写在程序文件的第一行。

//类名的全称是 包名。类名。 包也是一种封装形式。

建包的命令 javac -d . 类名.java ———— -d 是文件目录 . 是当前目录 //意思是在当前目录下建立class文件

//中的第一行 package 文件名,然后把本类存入进去。

包与包之间进行访问,被访问的包中的类以及类中的成员,需要 public 修饰,

不同包总的子类还可以直接访问父类中被 protected 权限修饰的成员。

包与包之间可以使用的权限只有两种: public 和 protected 。

public protected default private

同一个类中 "ok" "ok" "ok" "ok"

同一个包中 "ok" "ok" "ok"

子类 "ok" "ok"

不同包中 "ok"

11.import

导入:为了简化类名的书写,使用了一个关键字, import ,导入的是包中的类。

//通配符 * ,如 import cn.com.www.* :只会导入 www 中的所有类文件,不会导入 www 中的包及包下又有的类文件。

导类,不导包。

如果不导入包,要这样建立对象Demo d = new cn.com.www.Demo();// 很麻烦

在类名前第一行写上 import cn.com.www.*; 后,可以直接建立对象:Demo d = new Demo();

12.jar包

java的压缩包。//方便项目携带。方便与使用,只要在classpath 设置jar路径即可。

//数据库驱动,SSH 框架等都是以 jar 包体现的。

dos 下输入 jar 即可出现 jar 相关使用方法。jar -cf haha.jar pcka pckb pckc

//-c 创建新的归档文件 -f 指定归档文件名——| | | | |

这个是要打的jar包名字—————————————————————— | | |

这些要打在一起的包名(文件夹名)————————————————

//把classpath设置成 jar 包所在的地方,set classpath=jar包的绝对路径,就可以直接运行其中的 class 文件。

java的类库 jre文件夹下的 rt.jar

-------------------android培训java培训、期待与您交流! --------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: