黑马程序员——Java基础---多态,内部内和包的概述

------<a href=" http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

1.多态:某一类事物的多种存在形态。

2.多态的体现

a>父类的引用指向了自己的子类对象。Fu f = new Zi();

b>父类的引用也可以接收自己的子类对象。

3.多态的前提

a>必须是类与类之间有关系,要么是继承,要么是实现。

b>存在覆盖。

4.多态的利弊

a>利:多态提高了程序的扩展性。

b>弊:提高了扩展性,但是只能使用父类的引用访问父类的成员。

abstract classAnimal

{

abstract void eat();//父类定义了一个eat()抽象方法

}

class Dogextends Animal

{

void eat()//覆盖父类的eat()方法

{

System.out.println("啃骨头");

}

void lookHome()

{

System.out.println("看家");

}

}

class Catextends Animal

{

void eat()

{

System.out.println("吃鱼");//覆盖父类的eat()方法

}

void catchMouse()

{

System.out.println("抓老鼠");

}

}

class DuoTaiDemo

{

public static void main(String[] args)

{

Animal a = new Cat();//类型提升,向上转型。

method(new Cat());

method(new Dog());

}

public static void method(Animal a)

{

a.eat();

}

}

5.多态的应用

1>类型转换:只能在多态中进行转换。多态自始至终都是子类对象在做变化。

a>类型提升(向上转型)

Animal a = new Cat();

b>向下转型:转换完后可以调用子类对象自己特有的方法。

Animal a = new Cat();

Cat c = (Cat) a;//向下转换,转换完用c装着

6.多态中成员的特点

1>在多态中成员函数的特点:

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

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

成员函数,编译看左边,运行看右边。

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

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

3>在多态中静态成员函数的特点;

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

 

多态的出现更好的实现程序的扩展性。

 

 

 

内部类

1.定义:将一个类的定义在另一个类的里面,对里面的那个类就称为内部类。

2.访问特点:

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

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

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

3.访问格式

1>当内部类定义在外部类的成员位置上,而非私有,可以在外部其他类中。可以直接建立内部类对象。

格式:外部类名.内部类名变量名 = 外部类对象.内部类对象;

例: Outer.Inner in = new Outer().newInner();

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

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

static:内部类就具备static的特性,只能直接访问外部类中的static成员,出现访问局限。

3>在外部其他类中,怎么直接访问static内部类的非静态成员?

new 外部类名.内部类名().非静态成员; 例:newOuter.Inner().method()

4>在外部其他类中,怎么直接访问static内部类的static成员?

外部类名.内部类名.静态成员; 例:Outer.Inner.method()

注意:当内部类定义了static成员,则该内部类必须是static

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

5>内部类定义在局部时(如函数内)

a>不可以被成员修饰符修饰

b>可以直接访问外部类中的成员,因为还持有外部类中的引用。但是不可以访问它所在的局部中的任意变量,只能访问被final修饰的局部变量。

 

内部类可以直接继承外部其他类

二:匿名内部类

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

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

3.匿名内部类的格式:

new  父类或者接口(){定义子类的内容}

4.其实匿名内部类就是一个匿名子类对象。

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

三:异常机制

1.异常:就是程序在运行时出现不正常情况。

程序执行时,发生异常程序就结束,因此不可能同时发生几个异常。

2.异常的处理

try

{

需要被检测的代码;

}catch(异常类变量)

{

处理异常的代码;(处理方式)

}

/*finally代码块,定义一定执行的代码,通常用于关闭资源。即使前面有return

  但是有一种情况是不执行的:System.exit(0)在之前执行,则关闭虚拟机不会执      finally

*/

finally

{

一定会执行的语句;

}

3.对多异常的处理

a>声明异常时,建议声明更具体的异常。这样处理的可以更具体。

b>多个catch块,catch是至上而下执行的。对声明几个异常,就对应有几个catch块。如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

4.自定义异常

class FuShuException extends Exceptiom //自定义异常继承Exception

{

FuShuException(String  msg)

{

/*<3>因为在自定义异常的父类异常已经把信息都操作完了,

  所以子类只要在构造时,将异常信息通过super()语句传递给父类。

  那么就可以直接通过getmessage()方法获取自定义的异常信息。

*/

super(msg);

}

}

class Demo

{

/*<2>在函数内部手动throw抛出异常对象时,那么就要给对应的处理动作。

  1.在函数内部try catch处理

  2.在函数上声明让调用者处理,即throws继续向外抛异常

*/

int div(int a, int b)throwsFuShuException

{

if(b < 0)//分母为负数时异常处理

{

/*<1>在自定义异常时,需要用throw关键字手动抛出异常。

  而且thorw后面跟的是自定义异常对象。

*/

throw new FuShuException(“出现除数是负数情况”);

}

return a/b;

}

}

class ExceptionDemo

{

public static void mian(String [] args)

{

Demo d = new Demo();

try

{

int x = d.div(4,-1);

}catch(FuShuException e)

{

System,out.println(e.toString());

}

}

}

自定义异常:

1>必须是自定义类继承Exception。或者RuntimeException

继承Exception的原因:异常体现有一个特点,是异常类和异常对象都被抛出。

它们都具备可抛性,这个可抛性是Throwable这个体系       中独有的特点。只有这个体系中的类和对象才可以被       throwsthrow操作。

5.throwsthrow的区别:

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

2>throws后面跟的是异常类,可以跟多个,用逗号隔开,表示抛出多个异常。

  throw后面跟的是异常对象。

当出现异常时throw抛出,此时程序结束,throw后语句不执行。因此throw在特殊情况下也是结束标识符。

6.RuntimeException运行时异常Exception中的一个特殊子类异常

1>如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。

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

当发生该异常时,程序停止。

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

7.两种异常:

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

该异常在编译时,如果没有处理,编译失败。

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

在编译时,编译器不检查,异常发生,程序停止。

8.异常的三种格式:

1>try{

  }catch(){

  }

2>try{

  }catch(){

  }finally{

  }

3>try{

  }finally{

  }

catch是用于处理异常的,如果没有catch就代表异常没有被处理过。

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

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

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

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

一句话:子类抛出的异常必须“小于”父类的。

四:包

1.包的概述:

1>对类文件进行分类管理

2>给类提供了多层命名空间

3>写在程序文件的第一行

4>类名的全称是:包名.类名

5>包也是一种封装形式

2.包与包之间的访问

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

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

3>包与包之间可以使用的权限有两种:protectedpublic

 

public         

protected

default

private

同一个类中

可以

可以

可以

可以

同一个包中

可以

可以

可以

 

子类

可以

可以

 

 

不同包中

可以

 

 

 

3.import

1>导入包中的类。

2>import pack.*:导入pack包中所有类。

建议不要写通配符“*”,需要用到包中哪个类,就导入哪个类。例:import pack.A

建议定义包名不要重复,可以使用反写url来完成定义,url是唯一的。

4.jar

Java的压缩包。

使用jar包时,只要将jar包设置到classpath就可以使用。

jar -cf a.jar packa packb:将packapackb建立一个名为a.jarjar包。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值