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

黑马程序员——Java基础---面向对象(多态、异常、包)

2014-11-23 18:47 344 查看
------- android培训java培训、java学习型技术博客、期待与您交流!
----------
一、多态(Polymorphism)

概念:一种事物的多种表现形态。如:一个人,这个人可以是学生,也可以是运动员。
体现:父类引用或者接口的引用指向了自己的子类对象。父类的引用也可以接受自己的子类对象。//Animal
a = new Cat();
多态的好处:提高了程序的扩展性。
多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)
多态的前提:
必须要有关系,比如继承、或者实现。
通常会有覆盖操作。

多态的出现思想上也做着变化:
以前是创建对象并指挥对象做事情。
有了多态以后,我们可以找到对象的共性类型,直接操作共性类型做事情即可,这样可以指挥一批对象做事情,即通过操作父类或接口实现。
class 毕姥爷{
void 讲课(){
System.out.println("企业管理");
}
void 钓鱼(){
System.out.println("钓鱼");
}
}
class 毕老师 extends 毕姥爷{
void 讲课(){
System.out.println("JAVA");
}
void 看电影(){
System.out.println("看电影");
}
}
class {
public static void main(String[] args) {
毕姥爷 x = new 毕老师(); //毕老师对象被提升为了毕姥爷类型。
//		x.讲课();
//		x.看电影();  //错误.
毕老师 y = (毕老师)x; //将毕姥爷类型强制转换成毕老师类型。
y.看电影();//在多态中,自始自终都是子类对象在做着类型的变化。
}
}


如果想用子类对象的特有方法,如何判断对象是哪个具体的子类类型呢?
可以可以通过一个关键字 instanceof ;//判断对象是否实现了指定的接口或继承了指定的类
格式:<对象 instanceof 类型> ,判断一个对象是否所属于指定的类型。
Student instanceof Person = true;//student继承了person类

多态在子父类中的成员上的体现的特点:
成员变量:在多态中,子父类成员变量同名。
在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误)
运行时期:也是参考引用型变量所属的类中是否有调用的成员。
简单一句话:无论编译和运行,成员变量参考的都是引用变量所属的类中的成员变量。
再说的更容易记忆一些:成员变量 --- 编译运行都看 = 左边。

成员函数。
编译时期:参考引用型变量所属的类中是否有调用的方法。
运行事情:参考的是对象所属的类中是否有调用的方法。
为什么是这样的呢?因为在子父类中,对于一模一样的成员函数,有一个特性:覆盖。
简单一句:成员函数,编译看引用型变量所属的类,运行看对象所属的类。
更简单:成员函数 --- 编译看 = 左边,运行看 = 右边。

静态函数。 
编译时期:参考的是引用型变量所属的类中是否有调用的成员。
运行时期:也是参考引用型变量所属的类中是否有调用的成员。
为什么是这样的呢?因为静态方法,其实不所属于对象,而是所属于该方法所在的类。
调用静态的方法引用是哪个类的引用调用的就是哪个类中的静态方法。
简单说:静态函数 --- 编译运行都看 = 左边。

 示例:
class Fu
{
int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
static void method4()
{
System.out.println("fu method_4");
}
}

class Zi extends Fu
{
int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
static void method4()
{
System.out.println("zi method_4");
}
}
class  DuoTaiDemo3
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);
Zi z = new Zi();
System.out.println(z.num);
f.method1();
f.method2();
f.method4();
z.method4();
//f.method3();编译失败。父类中没有method3方法。
/*
结果:
5
8
zi method_1
fu method_2
fu method_4
zi method_4
*/
/*
Zi z = new Zi();
z.method1();
z.method2();
z.method3();
结果:
zi method_1
fu method_2
zi method_3
*/
}
}


二、异常

异常:不正常,是对问题的描述。将问题进行对象的封装。

异常体系:
Throwable
Error:错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。
Exception:异常,可以有针对性的处理方式。
RuntimeException 

异常体系的特点:
异常体系中的所有类以及建立的对象都具备可抛性。
也就是说可以被throw和throws关键字所操作。只有异常体系具备这个特点。

throw和throws的用法:
throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。

当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,否则编译失败。
注意,RuntimeException除外。也就说,函数内如果抛出的RuntimeExcpetion异常,函数上可以不用声明。

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

异常有两种:
编译时被检测异常:该异常在编译时,如果没有处理(没有抛也没有try),编译失败。该异常被标识,代表这可以被处理。
运行时异常(编译时不检测):在编译时,不需要处理,编译器不检查。该异常的发生,建议不处理,让程序停止。需要对代码进行修正。

异常处理语句:

try

{

需要被检测的代码;

}

catch ()

{

处理异常的代码;

}

finally

{

一定会执行的代码;

}

catch(Exception e)////e用于接收try检测到的异常对象。

{

        ///获取的是异常的信息。

        System.out.prtinln("message:"+ e.getMessage());

        //获取的是异常的名字+异常的信息。

        System.out.prtinln("toString:"+ e.toString());

        //打印异常在堆栈中信息;异常名称+异常信息+异常的位置。

        e.printStackTrace();



有三个结合格式:
try {}  catch ()  {}            
try {}  finally{}              
try {}  catch ()  {}   finally{}  

注意:
finally中定义的通常是 关闭资源代码。因为资源必须释放。
finally只有一种情况不会执行。当执行到System.exit(0);fianlly不会执行。

使用异常时什么时候throws 什么时候 try
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。

自定义异常:
定义类继承Exception或者RuntimeException
为了让该自定义类具备可抛性。
让该类具备操作异常的共性方法。
当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
异常异常信息传递给父类的构造函数。

class MyException extends Exception

{

MyException(String message)

{

super(message);

}

}

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

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

异常的处理原则:
处理方式有两种:try 或者 throws。
调用到抛出异常的功能时,抛出几个,就处理几个。一个try对应多个catch。
多个catch,父类的catch放到最下面。
catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。也不要不写。当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

try

{

throw new AException();

}

catch (AException e)

{

throw e;

}

如果该异常处理不了,但并不属于该功能出现的异常,可以将异常转换后,在抛出和该功能相关的异常。

或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,当调用者知道。并处理。也可以将捕获异常处理后,转换新的异常。

try

{

throw new AException();

}

catch (AException e)

{

// 对AException处理。

throw new BException();

}

异常的注意事项:
在子父类覆盖时:
子类抛出的异常必须是父类的异常的子类或者子集。
如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。
如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。

三、包(package)
在Java中,包(package)相当于文件夹,包中通常存放的是类文件。在我们编写程序时,难免会出现相同类名的情况,为了以示区分,将相同类名的不同类文件存放在不同的包中。调用时,加上包名就可以了。包也是封装的一种形式。包中可以有很多类文件,但是只提供一个类文件供外界使用。
1.使用规则

包必须写在程序的第一行。因为要先有包,才知道类文件的存放地方。
类的全称:包名.类名。如:a.Demo 。
编译定义了包的程序文件时,在编译时要指定包的存储目录。如:如:javac –d c:\packa类名.java

2.包的作用

为避免多个类重名的情况,如果出现两个相同名字的类,可通过包将两者区分,从而避免冲突。
对类文件进行分类管理,可以将相关的一些类放在同一个包中。
给类提供多层命名空间,如a包中的Demo.class文件,如果要创建Demo对象,就要在使用时加上a.如:a.Demo demo=new a.Demo();
可以将java的类文件和源文件相分离。

3.包之间的访问

要访问其他包中的类,需要定义类的全称:包名.类名。
包如果不在当前路径,需要使用classpath设定环境变量,为JVM指明路径。
被访问的包中的类权限必须是public的。
类中的成员权限:public或者protected。protected是为其他包中的子类提供的一种权限。类公有后,被访问的成员也要公有才可以被访问。不同包中的子类可以直接访问父类中被protected权限修饰的成员。同一个包中,protected只作用为覆盖。

四种权限



注:一个.java文件里面,不能出现两个以上的公有类或者接口。因为被public修饰的类名必须与java文件名相同。

4.包的导入—>import

可以简化类名。在调用其他包中的类时,需要写类的全称,也就是连同包名一起书写。当类存在多层包中时,如:haha.hehe.pack.Demo,使用import导入后,使用其类时,就可以不加包名了。导入格式如:import haha.hehe.pack.Demo;
一个程序文件中只有一个package,可以有多个import。import导入的是包中的类,不导入包中的包。
注意事项:
在导入包时,如果包中有很多类,可以使用通配符 *来替代包中的所有类。但是,建议不要使用通配符 * ,因为将不需要使用的类导入后,会占用内存空间。所有在编写程序时,要使用包中的哪些类,就导入哪些类。
定义包名不要重复,可以使用url来完成定义,url是唯一的。如:package cn.itheima.Demo。
导入的不同包中有相同类时,必须写类的全名以区分,否则将会报错。

5.jar包 
jar包是Java的压缩包 。好处:
方便项目的携带。
方便于使用,只要在classpath设置jar路径即可。
数据库驱动,SSH框架等都是以jar包体现的。

通过jar.exe工具对jar的操作。
创建jar包:jar  -cvf  mypack.jar  packa packb
查看jar包:jar  -tvf  mypack.jar   [>定向文件]
解压缩:jar  -xvf  mypack.jar
自定义jar包的清单文件:jar –cvfm  mypack.jar  mf.txt  packa packb

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