概述:
面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
理解面向对象:
面向对象是相对于面向过程而言。比如:用手机发送短信,相对于面向过程而言强调的是功能 :打开手机-->编写短信-->发送短信。而Java面向对象的思想就是强调具有功能的对象:手机打开,手机编写短信,手机发送短信。感觉这些过程是你自己亲自在做,而用面向对象的思却是你指挥着手机去做。面向对象和面向过程都是一种思想,面向对象是基于面向过程的。
- 面向对象是相对面向过程而言。
- 面向对象和面向过程都是一种思想。
- 面向过程:强调的是功能行为。
- 面向对象:将功能封装进对象,强调了具备功能的对象。面向对象时基于面向过程的。
- 过程其实就是函数,对象是将函数等一些内容进行了封装。
面向对象的特点:
- 是一种符合人们思考习惯的思想。
- 可以将复杂的事情简单化。
- 将程序员从执行者转换成了指挥者。
在Java中开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
设计的过程:其实就是在管理和维护对象之间的关系。
封装(Encapsulation):
概念:是指隐藏对象的属性和实现细节,仅对外提供访问方式。
原则:将不需要对外提供的内容都隐藏起来。把属性都隐藏,提供公共方法对其访问。
好处:将变化隔离,便于使用。提高重用性,提高安全性。
封装的表现形式之一 --> private:私有,权限修饰符,用于修饰类中的成员(成员函数,成员变量)。私有只在本类中有效。
- 私有只是封装的一种表现形式。之所以对外提供访问方式,就是因为可以在访问方式中加入逻辑判断等语句。对访问的数据进行操作,提高代码的健壮性。
- 一个成员变量 通常会对应两个访问方式一个是设置值,一个是获取值。
构造函数:
- 定义格式:
class 类名称{访问权限 类名称(类型1 参数1,类型2 参数2,…){程序语句;}}
特点:
- 1 函数名与类名相同。
- 2 不用定义返回值类型。
- 3 不可以写return语句。
作用:
给对象初始化。
- 注意:
- 默认构造函数的特点。
- 当一个类中没有定义构造函数时,那么系统会给该类加入一个空参数的构造函数。
- 当在类中自定义了构造函数之后,默认的构造函数就没有了
- 多个构造函数式以重载的形式存在的。
- 构造函数是给不同的对象进行分别初始化。
- 默认构造函数的特点。
- 构造函数 对象一建立就会调用与之对应的构造函数。
- 一个类中默认会有一个空参数的构造函数,这个默认的构造函数的权限和所属类一致。
- 如果类被public修饰,那么默认的构造函数也带public修饰符。
- 如果类没有被public修饰,那么默认的构造函数,也没有public修饰。
- 默认构造构造函数的权限是随着的类的变化而变化的。
- 构造函数与一般函数不同之处:
- 构造函数和一般函数在写法上有不同。
- 在运行上也有不同:构造函数是在对象一建立就运行。给对象初始化。而一般方法是对象调用才执行,是给对象添加对象具备的功能。
- 一个对象建立,构造函数只运行一次。而一般方法可以被对象调用多次。
- 什么时候定义构造函数
- 当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。
- 构造函数可以被私有化,但是被私有化的构造函数式不能创建对象的。
this关键字:
- this:代表本类的对象,代表它所在函数所属对象的引用。简单说:哪个对象在调用this所在的函数,this就代表哪个对象。
- 当定义类中功能时,该函数内部要用到调用函数的对象时,这时用this表示这个对象。但凡本类功能内部使用到了本类对象,都用this表示。
- 应用:
- 用于区分同名变量
- 用于构造函数之间进行互相调用。
- 注:this语句只能定义在构造函数的第一行。初始化动作要先执行,如果初始化中还有初始化的话,就先执行更细节的初始化。
示例:
class Person { //定义私有属性 private String name; private int age; Person (int age)//构造函数 { this.age = age; } Person(String name) { //name = name; //局部变量的名称和成员变量的名称相同,此时两个name都是局部的name。 this.name = name;//this 表面上是区分成员变量和局部变量。 } Person(String name,int age) { this(name);//this语句,调用构造函数Person(String name) //this.name = name; this.age = age; } public void speak() { System.out.println("name =" + this.name + ",,age =" + this.age); this.show(); } public void show() { System.out.println(this.name); } /* 需求:给人定义一个用于比较年龄是否相同的功能。 */ public boolean compare(Person p) { return this.age == p.age; } } class PersonDemo { public static void main(String[] args) { Person p = new Person("lisi "); Person p1 = new Person("zhangsan"); //在一个类中成员之间完成互相调用都是对象来完成的。 p.speak(); p1.speak(); Person p2 = new Person(15); Person p3 = new Person(20); boolean b = p2.compare(p3);//this和p2指向了同一个地址值,也就是同一个对象 System.out.println(b); } }
结果如下
static(静态)
- 用法:
- 是一个修饰符,用于修饰成员(成员变量,成员函数)。
- 当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,
- 还可以直接被类名调用。类名.静态成员。
- static特点:
- 随着类的加载而加载 。
- 当类加载到内存中时,static所修饰的成员就已经在内存中(方法区,共享区,数据区)开辟好了空间。
- 也就是说静态会随着类的消失而消失,生命周期最长。
- 优先于对象存在。静态是先存在的,对象后存在。
- 被所有对象所共享。
- 可以直接被类名所调用。 类名.静态成员。
- 随着类的加载而加载 。
- 实例变量和类变量的区别:
- 存放位置:
- 实例变量:随着对象的建立而存在于堆内存中。
- 类变量:随着类的加载而存在于方法去中。
- 生命周期:
- 实例变量:生命周期随着对象的消失而消失。
- 类变量:生命周期最长,随着类的消失而消失。
- 存放位置:
- 静态的使用注意事项:
- 静态方法只能访问静态成员(成员变量,成员函数).。非静态方法可以访问静态,也可以访问非静态。
- 静态方法中不可以定义this,super关键字。因为静态优先于对象存在,所以静态方法中不可以出现this,super关键字。
- 主函数是静态的。
- 静态有利有弊
- 利处:对对象共性数据进行单独空间存储,节省内存空间。没有必要每个对象中都存储一份,可以直接用类名调用。
- 弊端:生命周期过长,访问出现局限性,静态成员只能访问静态。
- 什么时候使用静态?
- 什么时候定义静态变量(类变量)
- 当对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据要定义成非静态存在于堆内存中。
- 什么时候定义静态函数
- 当功能内部没有访问到非静态数据(对象的特有数据),那么这时该函数(功能)可以定义成静态。
- 什么时候定义静态变量(类变量)
- 静态代码块
-
就是一个有静态关键字标示的一个代码块区域。定义在类中。
- 格式:
static{静态代码块中执行语句。
}- 特点:
- 随着类的加载而执行,只执行一次,如果和主函数在同一类中,优先于主函数执行。
- 作用:
- 用于给类进行初始化的。
- 实例:
class StaticCode{ static { System.out.prontln("a"); } } class StaticCodeDemo { static { System.out.prontln("b"); } public static void main(String[] args) { new StaticCode(); new StaticCode();//因为类已经加载,静态代码块已经执行过,所以没有打印结果。 System.out.prontln("over"); } static { System.out.prontln("c"); } } //打印结果 b c a over
-