黑马程序员-面向对象程序设计-类与对象
?
?
?
------- android培训、java培训、期待与您交流! ----------
?
?
面向对象是相对面向过程而言 面向对象和面向过程都是一种思想?
面向过程
强调的是功能行为
面向对象
将功能封装进对象,强调具备了功能的对象。
面向对象是基于面向过程的
?
Java具有面向对象的三大特征:?
继承:通过类的继承,便于将统一的功能集中在父类中,实现代码的重用和可维护性?
封装:通过java的类来实现数据和操作方法的封装,对外界可以将每一个Java类都视为一个黑箱,只需要调用该黑箱提供的方法即可完成你想要的操作。
多态:通过重载、重写与覆盖,实现不同类的不同形态特征。?
?
?
?
概念:
⑴对象。
对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
?
⑵对象的状态和行为。
对象具有状态,一个对象用数据值来描述它的状态。
对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中
?
⑶类。
具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
?
⑷类的结构。
在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。
①一般--具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。
②整体--部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。
?
⑸消息和方法。
对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。
类中操作的实现过程叫做方法,一个方法有方法名、返回值、参数、方法体。
?
?
抽象。
抽象是指强调实体的本质、内在的属性。在系统开发中,抽象指的是在决定如何实现对象之前的对象的意义和行为。使用抽象可以尽可能避免过早考虑一些细节。
类实现了对象的数据(即状态)和行为的抽象。
?
封装性(信息隐藏)
?
封装性是保证软件部件具有优良的模块性的基础。
面向对象的类是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。
对象是封装的最基本单位。封装防止了程序相互依赖性而带来的变动影响。面向对象的封装比传统语言的封装更为清晰、更为有力。
?
共享性
面向对象技术在不同级别上促进了共享
同一类中的共享。同一类中的对象有着相同数据结构。这些对象之间是结构、行为特征的共享关系。
在同一应用中共享。在同一应用的类层次结构中,存在继承关系的各相似子类中,存在数据结构和行为的继承,使各相似子类共享共同的结构和行为。使用继承来实现代码的共享,这也是面向对象的主要优点之一。
在不同应用中共享。面向对象不仅允许在同一应用中共享信息,而且为未来目标的可重用设计准备了条件。通过类库这种机制和结构来实现不同应用中的信息共享。
?
?
?
?
?
类
所谓的类,就是 类型,数据类型
?
class 类名?
{
? ?//成员变量 属性
? ?数类型名 变量名1;
? ?数类型名 变量名2;
? ?数类型名 变量名3;
//成员方法 ?行为
方法的返回值类型 ?方法名1(必要的参数)
? {
}
? 方法的返回值类型 ?方法名2(必要的参数)
? {
? }
? .......
}
?
生活中描述事物无非就是描述事物的属性和行为。
如:人有身高,体重等属性,有说话,打球等行为。
Java中用类class来描述事物也是如此
属性:对应类中的成员变量。
行为:对应类中的成员函数。
定义类其实在定义类中的成员(成员变量和成员函数)。
?
?
?
?
?
?
对象
?
类类型的变量就是对象
? 类名 变量名=new 类名();该变量名即为对象
? 因为该对象是属于某个类,所以,变量名点点可以调出该类的所有内容
? 每个对象拥有自己的成员变量和成员方法
?
?
设计类需要注意
1 ?Java是面向对象编程语言,所有的内容必须都放在一个类里面
?2 每个文件可以有多个类,但只能有一个类是public,并且文件名必须和
? ?public类的类名一样。jvm会为每个类生成一个字节码文件*.class
? ?最好一个文件一个类。
3 通常会把main函数放在一个单独的类里面,作为整个项目的启动类
4 成员变量如果不赋值有默认值,对数值类型默认值是0,boolean类型默认值为
? ?false,对于所有的类类型默认值为null
? 对于局部变量没有默认值,需赋值后才可以使用
?
?
?
方法的重载和构造方法
一 方法的重载method overload
在一个类中定义多个方法名相同,参数不同的方法。这些方法之间
就构成了重载 不能根据方法的返回值区分不同的方法
二 构造方法
? ? ?在一个类中定义 方法名和类名相同,并且该方法没有返回值,也不能放void。这样的方法就叫构造方法
1 构建一个类的对象时候(new ),一定会调用构造方法
2 一个类一定有构造方法,如果不明确设置则系统会为我们提供给一个无参的构造方法,如果明确定义构造方法,则系统就不会为我们提供构造方法。
3 构造方法也支持方法的重载,即一个类中可以有多个构造方法。
4 ?构造方法中一般放一些初始化的操作
5 构造方法之间可以互相调用
? this(必要的参数);
? 注意 该语句必须是构造方法的第一条语句
?
特点:
方法名与类名相同
不用定义返回值类型
不可以写return语句
作用:
给对象进行初始化。
注意:
默认构造方法的特点。
多个构造方法是以重载的形式存在的。
?
?
this使用、访问修饰符、数据类型
一 this使用
? this:表示当前这个类的一个引用【对象】。
? 1 当局部变量【在方法里面定义的变量包括形参】和成员变量【在方法外定义的变量】同名的时候,在方法中局部变量会覆盖掉
? ? 成员变量,如果想使用成员变量必须用 ? ?[this.变量名] 这种方式
? 2 构造方法之间可以互相调用 方法是在构造方法的第一条语句中加 ? ? ?this(必要的参数)
?
二 访问修饰符
? 控制类里面的成员变量或成员方法能在那里被访问
? ? 在java中一共有四种访问修饰符
? ? 默认 ?private ?protected ?public
? 1 private 私用的
? ?可以用在成员变量或成员方法前表示该变量或方法只能被当前的类所访问
? 2 public 公有的
? ? 可以用在成员变量或成员方法前表示该变量或方法能被所有的类所访问
3 在设计一个类的时候,通常成员变量都是private,成员方法都是public
? ?如果在类的外面想使用成员变量则必须提供对应的公有的方法
public 成员变量的数据类型 getXxx()
? ? {
? ? ? ?return xxx;
? ? }
? ? public void setXxx(成员变量的数据类型 ?xxx)
? ? {
? ? ? ?this.Xxx=xxx;
? ? }
? ? 这样的做的理由有三个
? ? 3.1 可以设置成员变量是只读,只写等访问权限
? ??
? ? 3.2 可以控制为成员变量付一些合法期望的值
? ??
? ? 3.3 这样的成员变量有一些特殊的功能javabean【后面会讲】
?
?
?
数据类型
java中的数据类型分两种 一种基本数据类型【8种】 一种是引用数据类型【类】
? ?类:分两种,一种是系统给我们提供的类,第二种根据需求自己定义的类。但是无论使用那一种类 语法和含义都是一样的。
?
?都是new出来,都要产生对象。系统给我们提供的类大约有四千左右,并且随着jdk版本的跟新,系统中的类越来越多,以满足我们的开发需求。为了方便使用这些类,系统中的所有类都分门别类的放在不同的包【和操作系统中的文件夹类似】中。比如
? 所有有关图像界面的类都放在java.awt.* javax.swing.*所有常见的工具类都放在java.util.*,比如所有文件操作用到的类都放在
?java.io.*;
?
?
?
栈与堆、产生一个对象、java中方法调用、java的垃圾自动回收
一 ?栈(stack)与堆(heap)
? ?都是指的内存,但是这两块内存存储数据的性能是不一样。
? ?1 栈空间(stack)
? ?存储在栈空间的数据,处理速度比堆空间处理速度快,仅次于寄存器的处理速度。但是存储在栈空间的数据大小和生存期必须是
? ?已知的,缺乏灵活性
? ?2 堆空间(heap)
? ? ? 存储在堆空间的数据,处理速度比栈空间处理速度慢,。但是存储在堆空间的数据大小和生存期不需要已知,所以灵活性要高
栈和堆空间都是jvm自动管理,不能通过程序干预。所有基本数据类型数据【8种】都是直接被存储在栈空间中。所有的引用数据类型
? ? 数据都存储在两个地方,产生的对象(new出来的)被存储在堆空间中,把代表该对象的一个地址存储在栈空间中。
? ??
二产生一个对象的具体操作
? ? ?int x=1;
? ? ?Person ps=new Person();
? 1 调用构造方法
? 2 在堆空间中构建该对象[new Person()]
? 3 把代表该对象的地址放在栈空间中【即变量名ps】
? ? ?ps:引用 地址 句柄
?
java中方法调用
1 传数值调用
? ?如果方法的形参是基本数据类型【8种】,属于传数值调用。在被调方法中不会改变主调方法的实参值
2 传地址调用
? 如果方法的形参是引用数据类型【类 new】,属于传地址调用。在被调方法中会改变主调方法的实参值
四 java的垃圾自动回收
垃圾:指的的对象,没有任何句柄指向的对象就叫垃圾
? ? jvm会在必要的时候清除这些无用的垃圾对象,一个对象被jvm清除时候会自动调用一个方法,该方法叫
? 析构方法 该方法叫 finalize()
也可以明确让jvm清除系统中的垃圾对象System.gc();
?
?
?
?
?
匿名对象、static静态的
一匿名对象
没有句柄引用的对象叫匿名对象
? ?比如
? ? new Person();
? ? new Person().print();
二 static ?静态的
用在成员变量或成语方法前,表示该变量或方法属于这个类特有的,而不具体属于某个对象,即
? ? 无论是否产生对象,无论产生多少对象,在内存中都只有一个static的变量或方法
? ? 注意
? ? ?1 访问静态的内容?
? ? ? ? ? ? ? ? ?对象名.静态内容;
? ? ? ? ? ? ? ? ?类名.静态内容;//建议这样访问
? ? ?2 static内容不属于面向对象的范畴,因为它不需要产生对象就能使用。
? ? ?3 如果一个方法不需要访问成员变量或其它的成员方法,为了方便调用 可以把方法设置成静态的
? ? ? ? ? ? ? ? ?如果一个成员变量的值是固定的【常量】,或者成员变量在任意一个对象值都一样,则可以把该变量设置成 static
? ? ?4 在static方法中不能直接使用成员变量或成员方法,只能直接使用static的变量或方法。反之不然
?在成员方法中可以直接使用static变量或方法 ??
?
?
static关键字:
用于修饰成员(成员变量和成员函数)
被修饰后的成员具备以下特点:
随着类的加载而加载
优先于对象存在
被所有对象所共享
可以直接被类名调用
使用注意
静态方法只能访问静态成员
静态方法中不可以写this,super关键字
主函数是静态的
?
?
?
?
?
?
?
?
继承
一 产生一个类对象的 执行流程
1 把类文件*.class 加载到内存中
2 定义出所有的类【static】变量
3 定义出所有的成员变量
4 调用构造方法
5 把对象在堆空间的首地址,付给栈空间的变量
Person ps=new Person();
二 继承
在原有类的基础上设计一个新类的过程就叫继承,引入继承后,类和类之间就具有一些层次关系,
这种层次关系能增加程序的灵活性。
class 类A extends 类B
? ?{
? ? ??
? ?}
? ? ? ??
? ? 类A:子类,基类
? ? 类B:父类,超类
? ? 注意
? ? 1 java里面只支持单继承,即一个类只能有一个父类,但是一个类可以有多个子类。
? ? 2 java中,为所有的类设计祖先了Object,即所有的类都是Object类的直接或间接子类。
? ? 3 private内容,构造方法,不被继承
? ? 4 在子类的构造方法中,一定会调用父类的构造方法,如果不明确调用,则系统会自动调用父类无参的构造方法,如果父类没有无参数的构造方法,程序会发生错误。也可以利用 super(必要的参数);明确调用父类的某一个构造方法,这时系统将不会再调用父类无参数构造方法。
? ? 5 super用法
? ? ? this:表示当前类的一个引用
? ? ? super:表示父类的一个引用
? ? ? super有两种情况必须使用super
? ? ? 5.1 super(必要的参数),在子类的构造方法中调用父类的构造方法 注意 必须是第一条语句
? ? ? 5.2 ?当子类和父类定义了同名的成员变量或成员方法,在子类中如果想访问父类的内容必须用
? ? ? ? super.变量或super.方法
? ? 6 方法的复写 override[方法的重载 overload]
? ? ? ?在子类中定义和父类方法名相同 参数相同 返回值也相同的方法 就构成了方法的复写 ? ??
7 判断是否能使用继承的标准时 ,看两个类之间在逻辑上是否满足is-a 是一个 ? ?
?
?
?
?