天天看点

java 面向对象(OOP)基本概念java 面向对象(OOP)基本概念

目录

java 面向对象(OOP)基本概念

对象

Java 封装

构造函数

Java 继承

Java 多态

java 面向对象(OOP)基本概念

      面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

      面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

      通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世 界的抽象与数字建模。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。         同时,面 向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。   面向对象的三大基本特征是:封装、继承、多态  

  • 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据 。
  • 继承是为了重用父类代码,同时为实现多态性作准备 。
  • 多态性是发送消息给某个对象,让该对象自行决定响应何种行为。通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

面向过程和面向对象:

面向过程是一种自上而下的程序设计方法,主要思路专注于算法的实现

  • 过程式的特征是以函数为中心,用函数作为划分程序的基本单位;数据在过程式设计中处于从属的位置
  • 过程式设计的优点是易于理解和掌握,这种逐步细化问题的设计方法与大多数人的思维方式比较接近
  • 软件代码的重用性很差,即使重用,也是简单的复制和拷贝,代码数量急剧增加。而不能直接继承和应用

面向对象是一种自下而上的程序设计方法,以数据为中心,类是表现数据的单位,是划分程序的基本单位

  • 面向对象设计是自下而上的特性,允许开发者从问题的局部开始,在开发过程中逐步加深对系统的理解。需求变化会作用到系统开发本身,形成一种螺旋式的开发方式
  • 面向对象设计中,类封装了数据,而类的成员函数作为其对外的接口,抽象地描述类,用类将数据和操作这些数据的函数放在一起,这就是面向对象设计方法的本质

面向过程:   优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源 ; 比如单片机、嵌入式开发、 Linux/Unix 等一般采用面向过程开发,性能是最重要的因素。 缺点:没有面向对象易维护、易复用、易扩展 。 面向对象: 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 。 缺点:性能比面向过程低 。  

对象

一切事物皆对象   在计算机世界中:是一个可标识的存储区域   对象都具有某些特征,并展现某些行为  

对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。

  类的实例化可生成对象,一个对象的生命周期包括三个阶段:生成、使用、消除。

  当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。当系统内存用尽或调用System.gc( )要求垃圾回收时,垃圾回收线程与系统同步运行。

       对象是要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表 示抽象的规则、计划或事件 在现实世界中:是客观世界中的一个实体。          对象的两个要素

  • 属性

   于描述对象静态特性(结构特性)的一个数据项 , 描述一个人可用姓名、性别、身份证号等属性  

  • 方法(也称服务)

   用于描述对象动态特性(行为特性)的一个操作系列,每个人都具有工作、学习等行为特性 对象将数据和施加于数据上的操作打包成一个不可分割的最基本的模块,使得仅有该类的有限个方法才可以 操纵、改变这些数据 。   对象的状态和行为   对象具有状态,一个对象用数据值来描述它的状态 对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为 对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中

      类是 Java 程序的核心,它定义了对象的形状和本质,可以用类来创建对象。当使用一个类创建了一个对象时,通常说给出了这个类的一个实例         用 Java 语言对现实生活中的事物进行描述,通过类的形式来体现类是具有共同属性和行为的对象的抽象,类是具有相同属性和行为的一组对象的集合         类是用于组合各个对象所共有操作和属性的一种机制         对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象         类可以定义为数据和方法的集合,类也称为模板,因为它们提供了对象的基本框架         一旦定义类后,就可以用这种新类来创建该类型的对象         类就是对象的模板( template )而对象就是类的一个实例( instance )         类实际上就是一种数据类型         类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性       类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述  

      在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分。

    Java中的类实现包括两个部分:类声明和类体。一般命名方法为:首字母大写,大写字母分词,例如DaiYuan。

成员变量定义在类中,整个类中都能访问,和具体的定义位置无关。   局部变量定义在方法、语句、局部代码块中,只在所属的区域中有效,而且必须是先定义后使用,必须是先 赋初值后使用 。   成员变量存在于堆内存的对象中,堆内存中的对象大小可以任意,并允许在运行时进行调整。所以访问查找 的效率比较低 。   局部变量存在与栈内存的方法中,可以快速定位,但是大小是限定的 。   成员变量随着对象的创建而存在,随着对象的表示而消失。局部变量随着所属区域的执行而存在,随着所属 区域的结束而释放 。   成员变量都有默认初始化值;局部变量没有默认初始化值。  

  • 简单类型中的数值类型默认为0,char类型默认'\0',boolean类型默认false
  • 引用类型默认null
package extend;//包

public class People {// 类
	public int age = 20;// 属性
	public double money; // 有默认初始化值
	public String skin = "Yellow";
	public String love;

	public int zhangda(int a) { // 方法
		System.out.print("调用长大方法:");
		age = a + 1;
		return age;
	}

	public static void main(String[] args) { // 静态main方法
		int aa = 666; // 局部变量aa
		int bb;
		People dy = new People(); // 创建对象dy
		System.out.println(dy.age);
		System.out.println(dy.skin);
		System.out.println(dy.love); // 默认初始化null
		System.out.println(dy.money); // 会输出默认初始化值0.0
		System.out.println(aa);
//	System.out.println(bb);//报错没有初始化赋值  The local variable bb may not have been initialized
		System.out.println("进行增长一岁的操作后的age: " + dy.zhangda(dy.age));//
	}

}
           

Java 封装

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

   可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。

      在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。         既可以实现对客体属性的保护作用,又可以提高软件系统的可维护性 只要用户接口不改变,任何封装体内部的改变都不会对软件系统的其他部分造成影响。         封装隐藏实现细节,并对外提供了公共的访问方式, 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。         要访问该类的代码和数据,必须通过严格的接口控制。         封装最主要的功能在于能修改自己的实现代码,而不用修改那些调用代码的程序片段。         适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。         方法或者类都是一个封装体。 Java的基本封装单元就是类class,组成类的代码或数据称为类的成员。         良好的封装能够减少耦合 ,类内部的结构可以自由修改 ,可以对成员进行更精确的控制 隐藏信息,实现细节。         类定义规则:要求类内高内聚,类间弱耦合, 封装确实可以使容易地修改类的内部实现,而无需修改使用了该类的客户代码。  

范围限定词:

public 公共的 ,表示到处可见 。

protected 受保护的 ,表示同包或者子类(不同包的子类也可见)中可见。   private 私有的  当前类内可见。   默认(就是没有限定词、 package 限制不能写成 default) 默认表示同包可见。   封装隔离变量,一般建议对于属性采用 :private私有属性。  

构造函数

       构造函数是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与 new 运算符一起使用在创建对象的语句中。 关键字 new 通常称为创建运算符,用于分配对象内存。一旦 new 完成分配和初始化内存,它就将调用构造函数来执行对象初始化。

  • 函数名与类名相同,包括大小写 。
  • 不用定义返回值类型,没有具体的返回值,也不能写void。
  • 一个类可以有多个不同的构造器,但是参数一定不能相同。
  • 构造器不能直接调用,总是和new运算符一起被调用。
  • 在构造函数前面加上返回值就只是一般函数了,不是构造器。
  • 一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。

构造函数的作用:给对象进行初始化。   当定义 Java 类时没有定义构造器,则 Java 自动为类自动提供无参构造器 , 将成员变量的值初始化为缺省值 ,一旦创建了自己的构造函数,缺省的构造函数将不复存在。   尽量不在类的构造器中创建、初始化大量的对象或执行某种复杂、耗时的运算逻辑。  

构造函数和一般函数的区别:

构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。 一般函数:对象创建后,需要函数功能时才调用。 构造函数:对象创建时,会调用并且只调用一次。 一般函数:对象创建后,可以被调用多次。  

package extend;

public class GouZao {
	public GouZao() {// 构造方法

	}

	public GouZao(int a) {// 方法重载

	}

	public GouZao(String a) {

	}

	public GouZao(int a, String b) {

	}

	public static void main(String[] args) {
		GouZao a = new GouZao();
		GouZao aa = new GouZao(2);
		GouZao aaa = new GouZao("");
		GouZao aaaa = new GouZao(2, "");
	}
}
           

Java 继承

       继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法, 使得子类具有父类相同的行为。语法 extends。          子类拥有父类非 private 的属性、方法。私有属性不能被继承。          继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。          子类除了拥有父类的属性和方法(拥有父类的所有成员,但是注意构造器和析构器不是成员),也可以创建自己的 特性。          Java 中不支持多重继承, Java 中要求任何的子类只能有一个直系的双亲类 。 Java 支持多层继承 ( 继承体系 ) : C 继承 B , B 继承 A ,就会出现继承体系。          如果定义类但是没有 extends ,则意味着默认父类为 java.lang.Object 。这也就是说 Java 中的任意类都是 Object 的子类。          可以在子类中进行覆盖定义父类中的成员方法和成员属性。   继承的优缺点

  • 将所有子类的共同属性放入父类,实现代码共享,避免重复,提高开发效率
  • 可以使得修改扩展,继承而来的实现比较简单
  • 父类变,子类就必须变
  • 继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的
  • 继承是一种强耦合关系

       把通用操作和方法放在父类中,将特殊的方法定义在子类中。

Java 多态

         对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。例如:"几何图形"的"绘图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"绘图"方法功能不同。

  Java的多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。

  • 编译时多态:在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。
  • 运行时多态:由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。

Java 重写(Override)与重载(Overload)

重载(Overloading)

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

  重写(Overriding)

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