Java入门:面向对象

面向对象

面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。

对象

对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。
类的实例化可生成对象,一个对象的生命周期包括三个阶段:生成、使用、消除。
当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。当系统内存用尽或调用System.gc( )要求垃圾回收时,垃圾回收线程与系统同步运行。

类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分。
Java中的类实现包括两个部分:类声明和类体。

封装

封装性就是尽可能的隐藏对象内部细节,对外形成一道边界,只保留有限的接口和方法与外界进行交互。封装的原则是使对象以外的部分不能随意的访问和操作对象的内部属性,从而避免了外界对对象内部属性的破坏。
可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。

多态

对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。

重载

  • 方法重载是让类以统一的方式处理不同数据类型的手段。
  • 一个类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。
  • 返回值类型可以相同也可以不相同,无法以返回型别作为重载函数的区分标准。

重写

  • 子类对父类的方法进行重新编写。如果在子类中的方法与其父类有相同的的方法名、返回类型和参数表,我们说该方法被重写。
  • 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
  • 子类函数的访问修饰权限不能低于父类的。

继承

子类的对象拥有父类的全部属性与方法,称作子类对父类的继承。

  • Java中父类可以拥有多个子类,但是子类只能继承一个父类,称为单继承。
  • 继承实现了代码的复用。
  • Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。
  • 子类不能继承父类中访问权限为private的成员变量和方法。
  • 子类可以重写父类的方法,即命名与父类同名的成员变量。

构造函数

在继承的情况下,创建一个对象的时候,首先调用子类的构造函数,如果在子类构造函数没有调用父类的构造函数,那么子类的构造函数第一行默认调用父类的无参构造函数。
情况实例:


实例

析构函数(垃圾回收)

程序运行时定义和创建了很多的变量、对象,当这些变量和对象使用完以后,需要释放它们所占用的内存空间。
内存中有两个区域,栈区和堆区:

  • 栈区:储存基本类型的变量和类的引用。栈区的内存,随着方法运行结束,自动被回收。
  • 堆区:储存创建出来的对象。堆区的内存,会被JVM使用垃圾自动回收机制根据回收算法在适当的时机回收。
    垃圾自动回收机制是Java语言一项重大的特性。如果一个堆区中的对象,没有引用指向它,在程序中没有办法再使用它,那么它就会被垃圾回收机制认为是垃圾。
    finalize()方法实在Object类中定义的, finalize()方法在垃圾收集器准备好释放对象占用的储存空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,然后才会真正回收对象的内存。所以如果使用fianlize(),就可以在垃圾收集期间进行一些重要的清楚或清扫工作(如关闭流等操作)。
    Object类中finalize()方法格式如下:
    protected void finalize() throws Throwable{ }

抽象类

抽象类(abstract class):仅声明方法而不实现当中的逻辑,这样的方法成为抽象方法,如果一个类中包括了抽象方法,则该类称为抽象类。抽象类不能用来生成对象,它只能被子类继承,并于继承后完成未完成的抽象方法定义。
用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract关键字修饰的一个方法时,该方法称为抽象方法。
来个例子:
抽象类:动物


Animal.java

实现类:狮子


Lion.java

接口

接口不是类,而是对类一组需求的描述,这些类要遵从从接口描述的统一格式进行定义,接口就是要说明一组类能做什么,而不关心如何做。
接口让规范和实现分离,让系统的各组件之间通过接口耦合,是一种松耦合的设计。
接口声明方式:

public interface 接口名称
{
    零到多个常量定义
    零到多个抽象方法定义
}

接口中的常量

在接口中定义的变量,自动为常量,可以通过接口名直接访问,并且变量的值不可以修改。
来个例子:
接口MyInter


MyInter.java

InterfaceTest


InterfaceTest.java

接口中的方法

在接口中定义的方法,是希望实现类口的类可以去实现接口的方法。接口中所有的方法都是抽象的,像抽象类中的方法一样,实现接口的类,必须实现接口中定义的方法。
实现接口类格式如下:
public class 类名 implements 接口名1, 接口名2, ...
示例:
定义表示宠物的接口

Pet

实现接口的类


Dog

接口中的方法默认都是抽象的,即用public和abstract关键字修饰的。

一个类可以继承一个父类,但是可以实现多个接口。

接口的继承

一个接口可以继承另一个接口,那么子接口就继承了父接口中的所有方法。Java语言中类只能有一个父类,但是接口可以有多个父接口,接口是支持多继承的。

抽象类和接口的比较

Java中只能单一继承,也就是一次只能继承一个类,Java使用interface来达到某些多重继承的目的,可以一次实现多个接口。

抽象类和接口都具有如下特征:

  • 都不能实例化,只能被继承或实现;
  • 都可以包含抽象方法,实现抽象类和接口的类都必须实现这些抽象方法;

接口和抽象类不同点:

  • 接口里只能包含抽象方法,不包含已经实现的方法;抽象类则完全可以包含普通的方法。
  • 接口里不能定义静态方法;抽象类可以定义静态方法。
  • 接口里只能定义静态常量属性,不能定义普通属性;抽象类则既可以定义普通属性,也可以定义静态常量属性。
  • 接口不包含构造函数;抽象类可以包含构造函数,抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。
  • 接口不包含初始化块,但抽象类则完全可以包含初始化块。
  • 一个类最多只能有一个直接父类,但包括抽象类;但一个类可以直接实现多个接口。

你可能感兴趣的:(Java入门:面向对象)