黑马程序员-Java基础-面向对象—多态、Object类、内部类、异常

第一讲  多态

1、  定义

可以理解为事物存在的多种体现形态。

在java中,当函数的功能内容不确定时,可以将此方法定义为抽象方法,让其子类去实现。当子类对象不同时,调用同一个函数名,会执行不同的函数体,得到不同的结果,从而体现了多态性。

2、  多态的体现形式

  • 父类的引用指向了自己的子类对象:Fu f = new Zi();
  • 父类的引用也可以接受自己的子类对象;

3、  多态的前提条件

  • 必须是类与类之间有关系,要么继承,要么实现(接口);
  • 函数之间存在覆盖(重写);

4、  多态的好处

大大的提高了程序的扩展性。——当子类对象增加时,尽可能的少该代码。

5、  多态缺陷

  提高了扩展性,但只能使用父类的引用访问父类中的成员。父类的引用不能访问子类中的成员。

  如下,父类的引用an1访问了子类特有方法kanjia();

  

6、  子父类类型转换

  Fu f = new Zi();————类型自动提升,向上转型,将子类型转成父类型。

  Zi z = (Cat) f ; ————强制将父类的引用转成子类类型,向下转型。

  注意:不能将父类型对象转成子类型。

7、  多态的应用

建立两个类:基础班学生 和 高级班学生,都有学习、睡觉功能。要求将这两类事物进行抽取。

8、  多态的出现,代码中的特点——多态使用的注意事项

  1)  多态中非静态成员函数的特点

    编译时期:参阅引用类型变量所属的类中是否有调用的方法,若有,编译通过,否则编译失败。因为:编译时,对象还没被创建,父      类和子类还没有建立关系。

    运行时期:参阅对象所属的类中是否有调用的方法,若有,则执行对象所属类中的功能,否则,执行父类中的功能。

    总结:成员函数在多态调用时,编译看左边(引用类型),运行看右边(对象所属的类)。

  2)  多态中成员变量的特点

    无论编译还是运行,都参考左边(引用型变量所属的类。如果引用型变量所属的类中没有此成员变量,则编译失败。运行时,也会调用引用型变量所属类中的变量。

    在多态中访问子类变量方法:当需要访问子类中的成员变量时,可以用强制类型转换,将父类型的引用强制转换成子类型:zi x = (zi)y,其中y代表指向子类型的父类型的应用变量

  3)  多态中,静态成员函数的特点

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

    原因:非静态方法和静态在内存中存储的位置不同,非静态方法区中有两个引用(this和super),而静态方法区中只有类名引用.

第二讲  Object

1、  概念

  Object是所有对象的直接或间接父类。该类中定义的肯定是多有对象都具备的功能。

2、  Object类应用

  Object类中已经提供了对对象是否相同的比较方法equals(),如果自定义类中也有比较相同的功能,没有必要重新定义,只要沿袭父类中的功能,建立自己特有的比较内容即可——这就是覆盖。

第三讲  内部类

1、  定义

2、  访问规则

  1)  内部类可以直接访问外部类中的成员,包括私有的,因为此时,内部类处于成员位置上,可以任务是外部类中的一个成员,内部类中持有了一个外部类的引用,格式:Outer.this.x——这里的this代表的是内部类对象。这就是内部类能够直接访问外部类成员的原因。

  2)  外部类要访问内部类,就必须建立内部对象:

    Inner inner = new Inner();

  3)  其他外部类访问内部类的方式

    当内部类定义为非私有,可以在外部其他类中直接建立内部类对象进行访问,格式如下:

      Outer.Inner  inner = new Outer().new Inner();

    当内部类在成员位置上时,可以被成员修饰符锁修饰

如,private修饰:将内部类在外部类进行封装,只能外部类访问;

    Static 修饰:内部类就具备了static的特性。此时,内部类只能访问外部类中的static成员,出现了访问局限。

    外部其他类访问static修饰的内部类非静态成员方法如下:

    ————new Outer.Inner().function();——Inner类是Outer类的静态成员,可以直接用类名调用。

外部其他类直接访问static修饰的内部类的静态成员方法如下:

————Outer.Inner.function();——静态成员可以直接被类名调用。

    注意:当内部类中定义了静态成员,该内部类必须是静态的;当外部类中的静态方法访问内部类时,内部类也必须是静态的。

    ——一个大原则:静态只能访问静态成员。

  内部类在局部位置上时:

    不能被static修饰;

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

如下:a 只有被final修饰后,才能被内部类访问。

如下,内部类被定义在了局部位置上。系统默认给内部类一个外部类的引用Outer.this

  总结:不管内部类定义在成员位置还是局部位置上,外部类需要内部类对象才能访问内部类中成员,内部类得到了外部类对象(系统默认提供外部类引用Outer.this)才能访问外部类成员。

3、  匿名内部类

定义:匿名内部类其实就是内部类的简写格式。

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

第四讲  异常

1、  定义

异常:程序运行时出现的不正常情况。

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

异常划分:严重问题 和 非严重问题。

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

非严重问题:java通过Exception进行描述,可以使用针对性的处理方式进行处理。

其中,Error和Exception同为Throwable的子类。

2、  异常处理

  异常处理目的:把异常处理掉,让try外面的后续语句继续执行。若不处理,程序就会被停下来,不处理后续语句。

原因:如果虚拟机调用的程序没有的处理此项异常的功能,该异常会被抛给虚拟机,而虚拟机处理异常的默认机制是:直接把此程序停掉。

异常处理代码格式如下:

处理异常有两种方式:

  第一种是:向上(向调用者)抛出异常;

  第二种是:自己内部捕获异常并处理。

3、  多异常处理

  1)  函数中只要有异常发生,函数就停下了;

  2)  被调用函数声明了几个异常,调用者就对应有几个catch块,如果多个catch块中的异常出现继承关系,父类异常catch块必须放在最下面;

  3)  若程序出现了被调用函数所声明以外的异常,最好将此异常抛给虚拟机,将程序停掉;

  4)  建议进行catch处理时,catch中一定要定义具体的处理方式,而不是简单的打印异常。异常信息可以输出到硬盘中相应的文档中,方便后续异常查找及处理;

4、  自定义异常

  可以自定义java机制中没有定义的异常。

  注意:Java不会自动识别自定义异常,所以,需要手动建立自定义异常对象并抛出(java本身定义的异常可以被默认抛出)

  1)  自定义异常信息

    因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息通过super语句传递给父类,然后就可以直接通过  getMessage方法获取自定义的异常信息了

  2)  自定义异常特点

    必须继承Exception。因为:异常体系有一个特点:异常类和异常对象都被抛出,它们都具备可抛性,这是Throwable体系中独有的特点。只有这个体系中的类和对象才可以被throws和throw操作。

5、  Throws和throw的区别

  1)  Throws使用在函数上;Throw使用在函数内;

  2)  Throws后面跟着异常类,可以多个,用逗号隔开;Throw后面跟着异常对象;

  注意:Throw下面不应跟其他语句,因为异常抛出后,下面语句不会再执行。Throw和return作为函数的结束标识。但是系统退出(System.exit(0))时不会执行。

6、  RuntimeException

定义:函数内抛出异常,则函数上必须声明抛出异常,否则编译不通过,但RuntimeException不需要函数声明抛出。如果函数上声明了该异常,调用者可以不用进行异常处理,编译也能通过。

RuntimeException不需要在函数上声明的原因是:此异常不需要调用者处理。此类异常发生时,希望程序停止,因为在程序运行时出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

7、  异常覆盖时的特点

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

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

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

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

知识点总结

1、  继承类和实现接口

父类中定义了某类事物的通用属性,而接口中往往定义的是某类事物的扩展功能。

2、  Throw 和 throws的用法

  1)  Throw定义在函数内,用于抛出异常对象;

  2)  Throws定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开;

3、  异常分两种:编译时异常 和 运行时异常

  1)  编译时被检测的异常:函数内被抛出,则函数上必须要声明,且在调用者中必须处理或向外抛出;

  2)  编译时不被检测的异常(即,运行时异常,RuntimeException)

函数上不需要声明,不需要调用者进行处理。

4、  异常处理中finally块中语句特点

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

  2)  finally只有一种情况不会执行:当执行到System.exit(0);时,finally中的语句不会执行。

时间: 2024-10-19 00:59:44

黑马程序员-Java基础-面向对象—多态、Object类、内部类、异常的相关文章

黑马程序员----java基础----面向对象思想和类的概述

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 面向对象(掌握) (1)面向对象 面向对象是基于面向过程的编程思想. 面向对象和面向过程的区别:面向过程强调的是每一个功能的具体步骤.面向对象强调的是对象,然后由对象去调用功能. (2)面向对象的思想特点 A:是一种更符合我们思考习惯的思想 B:把复杂的事情简单化 C:让我们从执行者变成了指挥者 举例: 买电脑 面向过程:了解电脑---了解自己的需求---对比电脑参数---去中关村买电脑--买

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员——Java基础---面向对象(下)

一.概述 面向对象除了封装.继承和多态三大特征之外,还有其他的特性,例如abstract抽象.interface接口等,抽象类主要作为多个类的模板,而接口则定义了多类应该遵守的规范,final关键字让java实现不可变类,让系统更加安全. 二.正文 1.构造器和初始化块 1.1 构造器 构造器是一种特殊方法,这个特殊方法用于创建实例时执行初始化,是创建对象的重要途径,如果程序员没有为JAVA类提供任何构造器,则系统会为这个类提供一个无参数的构造器,这个构造器的执行体为空,不做任何事情.无论如何,

黑马程序员-Java基础之多态

面向对象之多态   多 态(面向对象特征之一):函数本身就具备多态性,某一种事物有不同的具体的体现. 体现:父类引用或者接口的引用指向了自己的子类对象.//Animal a = new Cat(); 多态的好处:提高了程序的扩展性. 多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法.(前期不能使用后期产生的功能,即访问的局限性) 多态的前提: 1:必须要有关系,比如继承.或者实现.     2:通常会有覆盖操作.   多态的出现思想

黑马程序员——Java基础---面向对象

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 2015-05-06 一.理解面向对象 面向对象的特点: 1. 是一种符合人们思考习惯的思想 2. 可以将复杂的事情简单化 3.将程序员从执行者转换成了指挥者 完成需求时: a)先要去找具有所需的功能的对象来用. b) 如果该对象不存在,那么创建一个具有所需功能的对象. c) 这样简化开发并提高复用. 在Java的开发过程,其实就是不断的找对象,建立对象,维护对象.设计的过程,

黑马程序员--java基础之多态,抽象类,接口,匿名内部类

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 4.4 子类的实例化过程 子类中所有的构造函数默认都会访问父类中空参数的构造函数. 因为每一个构造函数的第一行都有一条默认的语句super();. 子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的. 为什么子类实例化的时候要访问父类中的构造函数呢? 那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的. P.S.

黑马程序员——java基础--面向对象3

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.概述 1.设计模式 解决的问题:保证一个类在内存中的对象唯一性. 比如:多程序读取一个配置文件的时候,建议配置文件封装成对象,会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的. 2.如何保证对象唯一性呢? 思想: 1.不让其他程序创建该对象 2.在本类中创建一个本类对象 3.对外提供方法,让其他程序获取这个对象 步骤: 1.将构造函数私有

黑马程序员——java学习5(107-126)——内部类,异常,包

1.内部类 1.1何时: 事物的内部还有事物,就用内部类(人体和心脏举例) 方法: (1)内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:外部类名.this (2)外部类要访问内部类,必须建立内部类对象 格式: (1)当内部类定义在外部类的成员位置上,且非私有,可以在外部其他类中,可以直接创建内部类对象 Outer.Inner out=new Outer().new Inner(); (2)当内部类在成员位置上时,就可以

黑马程序员——Java基础——面向对象——继承、抽象类、接口、多态、包、内部类、异常等

第一讲 继承 1.继承: 当多个类拥有相同的功能时,那么这些类不需要每个都写这些相同的功能,只需要把相同功能抽到 一个单独的类中,继承这个类就能获得这些相同的功能: (1)继承的体系结构:就是对要描述的事物进行不断的向上抽取,就出现了体系结构. 要了解这个体系结构中最共性的内容,就看最顶层的类. 要使用这个体系的功能,就用最底层的类创建对象 (2)好处: A.提高代码复用性: B.继承的出现,让类与类之间产生关系,为多态的前提 (3)特点: A.只能单继承(准确的说是java对多继承进行优化,避