Java面向对象知识总结
概述
Java是一门面向对象的语言。对象是Java程序中的基本实体。除了对象之外Java程序同样处理基本数据。
对象是由类定义的,类可以被认为是该对象的数据类型。
类、对象、封装以及继承是面向对象软件世界的主要概念。
使用对象
抽象
一个对象就是一个抽象,这意味着从该对象的使用者的角度而言,它具体的工作细节是无关紧要的。抽象隐藏细节,一个好的抽象会在恰当的时间隐藏恰当的细节,因此我们能够处理复杂的事物。
创建对象
一个Java变量既可以保存一个基本值,又可以保存一个对象引用。与用来保存基本类型的变量一样,用作对象引用的变量必须得到声明。
new 操作符返回一个指向新创建的对象的引用。
在对象实例化之后可以使用点(.) 操作符直接附加在该对象的引用之后,后面跟着所调用的方法。
类库与包
类库是一套用于支持程序开发的类。一个类库同城与某一编译器一同被提供。但是类库同样可以从第三方的厂商单独获得。类库中包含着方法,这些方法因其提供了某一特殊功能而通常对程序员颇具价值。实际上,程序员通常会依赖于某一类中的某一方法并且将其当作语言的一部分使用。但是从技术上而言,它们并不存在于该语言的定义中。例如String并不是Java语言标准类库的一部分,组成库的类是由SunMic公司的职员创建的。
类库是由若干类的簇群组成,有时称它们为JavaAPI。API表示应用程序员接口。与API名字相比,包组织更为根本,语言基础性更强。虽然包和API名字之间有一种一般的对应关系,但是组成某个特定API的一组类可能横跨若干包。
import声明
java.lang包中的类在编写程序时是自动调用的。但是如果引用其他包中的类,我们要么完整说明该引用,要么使用import(导入)声明。
状态和行为
所有对象都具有一个状态和一套行为。对象的变量值定义了其状态,对象所响应的方法定义了其行为。每一个对象都具有其自身所特有的状态。一个对象的状态及该对象的行为共同起着作用。任何对象都可以用其状态和行为对其进行描述。
类
对象是由类定义的。类是创建对象所依据的模型、模式或者蓝图。类就是对象的蓝图,但是类不是对象。变量的作用域决定了变量在那些地方可以得到引用,它取决于变量是在何处得到声明的。
在类级声明的属性同样称为实例数据,因为该数据的存储空间为所建类的每一个实例保留着。对于任何在类一级声明的变量,Java都会自动将其初始化。例如所有数值类型的int和double都初始化为0.但是为了程序的稳定性,较好的做法是对变量进行明确的初始化。
封装
对象应该封装起来,程序的其余部分应该仅仅通过一个良好定义的接口与对象相互作用。
【成语变量和局部变量是有区别】
属性和方法的可见性修饰符。
局部数据:一个变量或者常量的作用域是能够对该变量做出有效引用的程序部分。一个变量可以在某个方法的内部被声明,这使得其成为与实例数据相反的局部数据。
构造函数
构造函数不能有任何返回类型,void也是不可以的。构造函数类似于对象初始化时调用的方法。
构造函数与常规函数有两个地方不同:
【1】构造函数与类有相同的名字
【2】构造函数不能返回一个值,且不具有在方法头中指定的返回类型。
方法重载
Java和其他的面向对象的语言一样,具有不同参数列表的多个方法是可以使用相同的名字,这种技术叫做方法重载。重载方法的版本通过签名加以区分。参数的类型、数量或者顺序必须不同。
重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
重载的规则:
1、必须具有不同的参数列表;
2、可以有不同的返回类型,只要参数列表不同就可以了;
3、可以有不同的访问修饰符;
4、可以抛出不同的异常;
方法重写
- 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
- 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
- 子类函数的访问修饰权限不能少于父类的;
重写的规则
1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。
方法重载和方法重写的比较总结
- 多态性是面向对象编程的一种特性,和方法无关,简单说,就是同样的一个方法能够根据输入数据的不同,做出不同的处理,即方法的重载——有不同的参数列表(静态多态性)。
- 当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法,即在子类中重写该方法——相同参数,不同实现(动态多态性)。
- 重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.
引用
对象应用变量和对象是两个不同的东西。引用变量的声明和创建它所引用的对象,其步骤是不同的。一个对象引用变量存储的是某一对象的地址。
空引用
保留字null表示引用没有指向一个有效的对象。
this引用
Java的另一个特殊引用称为this引用。this 是Java 的保留字。它允许某一对象指向其自身。在类的内部this引用可以用来指向当前正在运行的对象。this引用总是指向挡墙正在运行的对象。
别名
应为对象的引用变量存储的是一个地址,所以程序员在管理对象的时候必须特别小心。
基本类型的赋值:在基本类型的赋值中(num2=num1)num2中存储的是num1存储值的一个备份。
对象类型的赋值:两个对象类型引用的赋值动作之后是将O1的地址复制到O2中,最初两者可能指向不同的对象,赋值之后两者包含都是同样的地址,因此指向的是相同的对象。
多个引用可以指向相同的对象,这些应用都是彼此的别名。
“==”操作符比较的是对象引用的等同性,如果相互为别名那么返回true。
垃圾回收
当某个对象的所有引用都丢失了(可能是因为重新赋值),则该对象就不能在参与到该程序中来了。该程序不能够调用其方法或者使用其变量,此时该对象为垃圾。
Java会进行垃圾自动回收,程序员不需要考虑成为垃圾的存储空间具体如何回收的问题。
如果程序员想在某一活动完成的同时销毁该对象,则此程序员可以在该对象的类中定义一个称为finalize的方法。Java在该对象标记为垃圾回收之后且在他实际销毁之前运行它。finalize可以用来处理Java回收期不会处理的活动比如关闭文件。
对象作为参数传递
在将一个对象传递给一个方法之后,实参和形参就成为了彼此的别名。Java通过值传递的方式将所有参数传递给某一方法。本质上讲,参数传递就像是一个赋值语句,即将在存储在实参中共的值的一个备份赋值给形参。
当对某一方法内部的一个形参进行更改时,我们必须考虑这一问题。因为形参是传递进来的值的一个单独备份,因此对其做出的任何更改将不会对实参产生印象。在控制权返回至调用方法之后,实参的值和方法被调用之前一样。
static修饰符
static修饰符是能够将一变量和方法与其类而不是该类的对象关联起来。
静态变量
静态变量也称为类变量,每一个对象存在一个静态变量的副本。静态变量由类的所有实例共享。
静态方法
静态方法也成为类方法,可以通过其类名来调用。调用静态方法的时候不需要对该类的某一对象进行实例化。因为静态方法不能够在某个对象的上下文中进行操作,所以它不能引用仅存在与某个类的某个实例的实例变量。如果某个静态方法企图好似还用某个非静态变量,则编译器会报错、
包装类
一个包装类就是代表一个特定的基本类型,这样就可以当作对象来处理基本类型。
基本数据类型 | 包装类 |
---|---|
byte | Byte |
boolean | Boolean |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
接口
一个几口就是一个包含常量和抽象方法的集合,它不能被实例化。
Comparable接口
Java标准类库既包含接口也包含类。Comparable接口就是定义在java.lang中的,它仅仅包含一个方法,也就是compareTo方法,
Ob1.compareTo(Ob2);
如果Ob1小于Ob2返回负;
如果Ob1等于Ob2返回0;
如果Ob1大于Ob2返回正;
Iterator接口
Iterator接口是作为Java标准类库的一部分而定义的另一接口。它由表示某个对象集合的类使用。
Iterator接口中的两个主要方法是hasNext(返回一个布尔结果)和next(返回一个对象)。
继承
类确立了对象的特征和行为,但是并不为变量保留内存空间(除非这些变量被声明为static)。类是计划,对象就是该计划的具体化。
派生类
继承就是通过某个现有类派生出一个新类的过程。用来派生新类的初始类称为父类、超类或者基类;派生类则被称为子类或者次类。extends表示新类从某个现有类中派生而来。
继承在所有的父类和子类之间创建了一种is-a关系。
protected修饰符
protected提供了允许继承的最佳可能封装。
super引用
super调用父类构造方法。super应用同样可以用来引用父类的成员变量和方法。
重写方法
使用final修饰符定义的方法,子类是不能重载的。
类的层次结构
相同父类的两个子类称为兄弟类。
Object类
在Java语言中所有的类都是直接或者间接的由Object类派生来的。
抽象类
抽象类不能被实例化。它表示的是一个概念,其他类可以在这个概念之上创建自己的定义。它通常还有一个或者多个没有定义的抽象方法。
一个抽象类派生出的某个类必须重载其父类的所有抽象方法,否则该派生类也将被视为抽象类。
将某个抽象方法修饰为final和static将会出现矛盾。因此不要出现这方面的错误。
接口的层次结构
接口之间的继承和类之间的继承是一样的。不过接口的所有成员都是public的。
接口继承,子接口可以继承父接口的所有抽象方法和常量。
多态性
多态性是指具有许多形态。多态引用就是在不同时间点,可以指向不同对象类型的应用变量。动态绑定的实现就是多态引用在某个时刻引用变量所引用的对象来决定。
- 类层次结构的多态引用
- 方法继承的多态引用
- 基于接口的多态引用
异常
异常是定义了某个非正常或者错误情形的对象。异常由程序或者运行时环境抛出,如果需要的话我们可以将其捕获并对其进行恰当的处理。
错误与异常类似,不过错误通常表示的是某种不可恢复的情形,且不必去捕获它。
异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
Java异常类层次结构图:
注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。
运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。