Java笔记之面向对象_第1页
Java笔记之面向对象_第2页
Java笔记之面向对象_第3页
Java笔记之面向对象_第4页
Java笔记之面向对象_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java笔记之面向对象面向对象是什么?l面向对象是一种编程方法l面向对象是一种思维方式l面向对象不是一种编程语言为什么要面向对象?符合客观规律首先,找对象;然后,调用对象的方法生活问题< >程序(问题空间) (解空间)面向对象的优势重用1、 类的重用2、 继承/组合复用性、弱耦合性、可扩展性(可插入性)扩展后,对原有系统影响尽量小,组件化变成Java是面向对象的程序设计语言,Java语言提供了定义类、成员变量、方法等最基本的功能。类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引到到类的对象。类用于描述客观世界里某一类对象的共同特征

2、,而对象则是类的具体存在,java程序使用类的构造器来创建该类的对象。面向过程是一种以过程为中心的编程思想。面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象(Object Oriented,简称OO)是一种以事物为中心的编程思想。面向对象是把一个问题的处理过程按照构成问题的事物分解成对象,建立对象的目的不是为了完成整个过程中的一个步骤,而是为了描述某个事物在整个解决问题的过程中的行为。面向对象的程序设计过程中有两个重要的概念:类和对象(对象也被称为实例,instance),其中类是某一批对象的抽象,可以把类理解成某种概念;对

3、象才是一个具体存在的实体,从这个意义上,例如日常说的人,其实都是人的实例,而不是人类。类和对象是面向对象的核心。为什么要面向对象? 面向对象是为了解决系统的可维护性,可扩展性,可重用性,我们再进一步思考,面向对象为什么能解决系统的可维护性,可扩展性,可重用性? 面向对象产生的历史原因有下面两点: 1、 计算机是帮助人们解决问题的,然而计算机终究是个机器,他只会按照人所写的代码,一步一步的执行下去,最终得到了结果,因此无论程序多么的复杂,计算机总是能轻松应付,结构化编程,就是按照计算机的思维写出的代码,但是人看到这么复杂的逻辑,就无法维护和扩展了。2、&#

4、160;结构化设计是以功能为目标来设计构造应用系统,这种做法导致我们设计程序时,不得不将客体所构成的现实世界映射到由功能模块组成的解空间中,这种转换过程,背离了人们观察和解决问题的基本思路。     可见结构化设计在设计系统的时候,无法解决重用、维护、扩展的问题,而且会导致逻辑过于复杂,代码晦涩难懂。于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路,习惯,步骤来设计相应的应用程序?这样的程序,人们在读它的时候,会更容易理解,也不需要再把现实世界和程序世界之间来回做转换。    

5、0;与此同时,人们发现,在现实世界中存在的客体是问题域中的主角,所谓客体是指客观存在的对象实体和主观抽象的概念,这种客体具有属性和行为,而客体是稳定的,行为不稳定的,同时客体之间具有各种联系,因此面向客体编程,比面向行为编程,系统会更稳定,在面对频繁的需求更改时,改变的往往是行为,而客体一般不需要改变,所以我们就把行为封装起来,这样改变时候只需要改变行为即可,主架构则保持了稳定。 于是面向对象就产生了。 然而人们追求的系统可维护性,可扩展性,可重用性又是怎么在面向对象中体现出来的呢? 首先看看面向对象的三大特征: 封装:找到变化并且把它封装起来,你就可以

6、在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。 继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用,只有明确的IS-A关系才能使用,同时继承在在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发者滥用继承,结果造成后期的代码解决不了需求的变化了。因此优先使用组合,而不是继承,是面向对象开发中一个重

7、要的经验。 多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。     因此面向对象能实现人们追求的系统可维护性,可扩展性,可重用性。面向对象是一种编程思想,起初,“面向对象”是专指在程序设计中采用封装、继承、多态等设计方法,但面向对象的思想已经涉及到

8、软件开发的各个方面,比如现在细分为了面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP) 面对对象使用在什么地方?在编程中我们使用对象来模拟现实中的对象,用属性模拟特征,方法模拟能力。每次使用都会创建对象,定义属性,方法。这样比较麻烦,为了代码重用性,我们定义类,类是创建对象的模板,里面定义了对象应该具备的属性和方法。使我们不用每次创建对象时都重复的定义,直接使用即可。 综上,类是对象的抽象模板,定义了对象将具备的属性能力,在创建对象及使用对象时达到代码重用的功能。 类是什么?类是面向对象的重要内容,可以把类当做一种自定义类型,可以使用类来定义变量,这种类

9、型的变量统称为引用变量。也就是说,类是引用类型。类名的取名:要是一个合法的标识符,满足Java的语法要求;类名必须是有一个或者多个有意义的单词连缀而成的,每个单词首字母大写,其他字母全部小写,单词与单词直接不要任何分隔符。类的使用:修饰符 class 类名零到多个构造器定义. 零到多个成员变量. 零到多个方法.构造器用于构造该类的实例(对象),Java通过new关键字来调用构造器,从而返回该类的实例(对象)。成员变量用于定义该类或该类的实例所包含的状态数据。方法用于定义该类或该类的对象的行为特征或者功能实现。构造器是什么?构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类统称无法创

10、建实例。如果程序员没有为一个类编写构造器,这个类通常无法创建对象(实例),则系统会为该类提供一个默认的构造器。*注意:构造器、构造方法以及构造函数都是指构造方法。构造器的使用格式:修饰符 构造器名(形参列表)由零条到多条可执行性语句组成的构造器执行体修饰符可以省略,也可以是public、protected、private之一构造器名必须和类名相同。形参列表和定义方法形参列表的格式完全相同。*注意:构造器不能定义返回值类型,也不能使用void声明构造器没有返回值,如果使用则构造器不再是构造器而是被系统当做普通方法。* 构造方法与普通方法的区别 1、语法上不同 构造方法没有返回值类型 普通方法一定

11、有返回值类型(void) 方法名和类名一样-构造方法 2.作用不同 构造方法是初始化对象时调用的 普通方法需要时调用 3.构造方法不能被final static abstract syschronized修饰 成员变量是什么?成员变量是类具有的一些基本属性。成员变量又称为成员属性,全局变量,它是描述对象状态的数据,是类中很重要的组成成分。成员变量的格式:修饰符 类型 成员变量名 =默认值;修饰符可以省略,也可以是public、protected、private、static、final等,public、protected、private只能出现其一,可与static、final组合修饰。类型可

12、以是基本数据类型和引用数据类型成员变量名符合java命名规范。默认值可以指定默认值。局部变量与成员变量(全局变量)区别:1作用范围:局部变量定义它的当前这个方法里;全局变量在整个类里2局部变量和局部变量不能同名,全局变量和全局变量不能同名, 但是全局变量和局部变量可以同名3局部变量和全局变量同名的话,局部变量有优先级;4全局变量有默认初始值,局部变量没有,所以局部变量声明的时候一般要给初始值;5用this区分同名的局部变量和全局变量(同名的话全局变量用this.变量名表示)6 局部变量在方法调用完后释放内存,成员变量在类和对象不使用的时候释放内存7 成员变量 堆存中 局部变量 常量池中成员方法

13、是什么?成员方法描述对象所具有的功能或操作,反映对象的行为,是具有某种相对独立功能的程序模块。一个类或对象可以有多个成员方法,对象通过执行它的成员方法对传来的消息作出响应,完成特定的功能。成员方法一旦定义,便可在不同的程序段中多次调用,故可增强程序结构的清晰度,提高编程效率。成员方法的分类,从成员方法的来源看,可将成员方法分为:类库成员方法。这是由 Java 类库提供的,用户只要按照 Java 提供的调用格式去使用这些成员方法即可。用户自定义的成员方法。这是为了解决用户的特定问题,由用户自己编写的成员方法。程序设计的主要工作就是编写用户自定义类、自定义成员方法。从成员方法的形式看,可将成员方法

14、分为:无参数成员方法和带参数成员方法。成员方法的语法格式:修饰符 返回值的类型 成员方法名(形式参数表) throw 异常表 由零条到多条可执行性语句组成的方法体成员方法的声明包括成员方法头和成员方法体两部分。成员方法头确定成员方法的名字、形式参数的名字和类型、返回值的类型、访问限制和异常处理等;成员方法体由包括在花括号内的说明部分和执行语句部分组成,它描述该方法功能的实现。修饰符:可以是公共访问控制符 public、私有访问控制符 private、保护访问控制符 protected 等访问权限修饰符,也可以是静态成员方法修饰符 static、最终成员方法修饰符 final、本地成员方法修饰符

15、 native、抽象成员方法修饰符 abstract等非访问权限修饰符。访问权限修饰符指出满足什么条件时该成员方法可以被访问。非访问权限修饰符指明数据成员的使用方式。返回值类型:运行任何数据类型,包括基本数据类型和引用数据类型。如果声明了方法返回值类型,则方法体必须有一个有效的return语句,该语句返回一个变量或一个表达式,这个变量或者表达式的类型必须与此处声明的类型匹配。如果一个方法没有返回值,必须使用void来声明没有返回值。形参列表:形参列表用于定义该方法可以接受的参数,参数列表由零组到多组“参数类型 形参名”组成,多组参数之间以英文逗号隔开,形参类型和形参名之间以英文空格隔开。一旦在

16、定义方法时指定了形参列表,则调用该方法时必须传入对应的参数值谁调用方法,谁负责为形参赋值。*注意:方法体里多条可执行语句之间有严格的执行顺序,排在方法体前面的语句总是先执行,排在方法体后的语句总是后执行。方法的重载前提:在同一类中条件:同名不同参(方法名相同,参数列表不同)参数列表不同情况:数据类型不同,数据数量不同,类型和数量都不同*注意:与参数名无关(重载时不能只更改参数列表的数据名,而其它都一样)静态 static 成员变量和成员方法、代码块静态变量与实例变量的区别:1 语法上的区别静态变量-static 修饰实例变量没有2内存静态变量-只有一个拷贝,所有对象共享,在类加载的时候jvm就

17、为静态数据分配内存实例变量-可以多个拷贝,每个对象的实例变量互不影响静态方法里只能访问静态的变量、常量或方法,不能访问非静态的数据和方法普通方法里能访问静态的数据或方法3 使用区别静态变量-通过类名调用实例变量-通过对象名调用静态代码块不能写在任何方法里静态代码块只确定优先级,多个静态代码块按照出现的顺序执行;代码块的优先级:(静态代码块执行顺序永远在最前面)静态代码块构造代码块构造方法(普通方法、普通代码块)静态代码块、构造方法、构造代码块、普通方法、普通代码块、静态方法的运行顺序;静态方法:能被继承,不能被重写(静态的方法在类加载的时候就加载了,在整个运行过程中是保持不变的,所以不能被重写

18、)即使在子类里有个同名同参的静态方法,也不算被重写不能被重写的方法:构造方法 static、 private、 final修饰的方法 对象是什么?对象是类中的存在的实体。对象的创建:例:首先创建了Person类,定义了name和age成员变量和say方法;然后使用Peron类定义一个Person类型的变量Person p;通过new关键字调用Person类的构造器,返回一个Person实例,将Person实例赋给p变量。P=new Person;可以简写成:Person p=new Person();类里定义的方法和成员变量都可以通过类或对象来调用。类或对象访问方法或成员变量的语法是:类.类变

19、量|方法,或者对象.实例变量|方法例:=”李斯”; p.say(“好久不见”);面向对象有四大特点:封装、继承、多态、抽象什么是封装?封装是只将对象状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。为什么要封装?很多时候对象属性的赋值是有一定限制的,如:Hero的level(等级)一定是大于零的,若有“满级”设定则不可以大于最大等级值。因此需要将属性值私有化隐藏,使其不能在类外部随意修改,再通过定义公共方法来访问私有属性。封装由访问控制符来实现。访问控制级别表 private default protected pub

20、lic同一个类中 同一个包中 子类中 全局范围内 对一个类或对象实现良好的封装,可实现以下目的:1、 隐藏类的实现细节。2、 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问。3、 可进行数据检查,从而有利于保证对象信息的完整性。4、 便于修改,提高代码的可维护性为了实现良好的封装,需要从两方面考虑:1、将对象的成员变量和实现细节隐藏起来,不允许外部直接访问。2、把方法暴露出来,让方法控制对这些成员变量进行安全的访问和操作。什么是继承?继承是面向对象的三大特性之一。它是使用已存在的类的定义作为基础建立新类的技术。新类的定义可以增加新的数据或新

21、的功能,也可以用父类的功能,但不能选择性地继承父类。Java的继承具有单继承的特点,每个子类只有一个直接父类,可以有无限多个间接父类。为什么要继承?因为继承较好地解决了代码重用问题,有效的减少了重复代码。如何继承?语法格式:修饰符 class SubClass extends SuperClass/类定义的部分继承的特点:1、子类继承的是父类非私有的成员属性和方法2、子类可以重写父类的属性和方法,调用的是子类重写后的属性和方法 重写父类的方法,访问权限权限修饰符大于等于父类得到方法的访问权限修饰符3、子类可以有自己的属性和方法 方法的重写:继承,同名同参(包括返回值类型也一样) 方法的重载:同

22、一个类,同名不同参4、继承关系中的构造方法 如果父子类没有自定义的构造方法:创建子类对象的时候先调用父类的构造方法(子类 构造方法可以任意弄)如果父类自定义了构造方法(无参):(子类构造方法可以任意弄)如果父类自定义了有参数的构造方法:子类的构造方法里一定要添加(调用)这个有参的构造方法,一定要添加相同的参数列表的构造方法 5、Object为特殊超类或基类,所以的类都直接或间接的继承Obj; 6、java只支持单继承 * 重点是: * 1、 父类自定义了有参的构造方法时,没有了无参的构造方法时,子类已写构造方法的情况下,子类的构造方法里一定要调用父类的有参的构造方法 * 2、父类自定义了有参的

23、构造方法时,子类继承父类,一定要添加相同的参数列表的构造方法重写:重写(Override)也称方法覆盖,要遵循“两同两小一大”规则,“两同”即方法名相同、形参列表相同;两小,子类方法返回值类型应比父类方法返回值类型更小或者相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;一大,子类方法的访问权限应比父类的访问权限更大或相等。super表示当前活动对象的直接父类对象。使用格式:super.成员变量名;super.成员方法名;super(参数); /父类的构造方法注意:静态方法中不能使用this 和super 。什么是多态?多态是指面向对象程序运行时,相同的信息可能会送给多个不

24、同的类型之对象,而系统可依据对象所属类型,引发对应类型的方法,而有不同的行为。为什么会出现多态?Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。当它们出现不一致时,就可能出现所谓的多态了。多态体现在继承过程中也就是说子类和父类的相互类型转换。 子类转换为父类称为向上转型,在创建对象时,对象既可以作为其本身的类进行引用也可以作为其父类型进行引用。也就是说 将一个子类对象直接赋值给一个父类的引用变量 ,这种我们称为向上转型。 父类转换成子类,与向上类型相对应的这个父类对象作为其子类类型的引用时,这时候我们就说父类转换

25、成子类了。父类转换成子类需要强制类型转换。子转父向上转换自动类型转换 父类型 对象名=new 子类型();方法: 执行子类重写父类的方法,子类继承父类的方法 无法调用子类特有的方法父转子向下转换强制类型转换 子类型 对象名=(子类型)new 父类型(); 方法: 执行子类继承或重写父类的方法 可以调用子类特有的方法两种表现形式:1、 自动类型转换-向上转型(子类转成父类) 编译时类型:父类型 运行时类型:子类型父类型 对象名=new 子类型 ();调用方法:调用子类重写父类的方法,子类继承父类的方法,无法调用子类特有的方法1、 强制类型转换-向下转型(父类转子类) 编译时类型:子类型 运行时类

26、型:父类型子类型 对象名=(子类型)new 父类型();出现异常:java.langClassCastException解决:对象名 instanceof 类型 判断该对象是不是这个类型的实例如果是的话,返回true->进行强制类型转换如果不是的话,返回falseFinal关键字:(最终目的是不发生改变)修饰成员变量:不能被修改,必须赋初值修饰方法:可以被子类继承,可以重载 ,但是不能被重写修饰类:不能被继承什么是抽象?使用了关键词abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含

27、有一个声明,没有方法主体。“抽象方法” 属于一种不完整的方法。抽象方法的语法格式:在普通方法上加个absract用abstract关键字来修饰一个方法时,该方法叫做抽象方法。抽象方法不能有实现的方法体,它必须被重写,定义了抽象方法的类必须是抽象类。抽象类的作用?1、在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;2、通过从这个抽象体派生,也可扩展此模块的行为

28、功能。为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。3、抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。抽象类和抽象方法的定义格式:abstract class CombatUnitpublic abstract void talk();-与普通方法一样有参数列表,没有方法体直接用语句结束标识。/抽象类中也可以定义非抽象方法抽象类:1、用abstract修饰2、不能实例化,通过非抽象的子类来实例化3、抽象类里面可以有普通的方法,不一定有抽象方法4、如果一个

29、类里有抽象方法,这个类一定是抽象方法5、抽象方法格式:访问修饰符 abstract 返回值类型 方法名(参数列表);抽象类和普通类的区别:1、 语法上的不同:有没有abstract修饰2、 普通类里一定没有抽象方法,抽象类里不一定有抽象方法 有抽象方法的一定是抽象类3、 抽象类不能直接被实例化,普通类可以4、 抽象类必须被继承,继承抽象类的子类必须添加抽象类里所有的抽象方,如果没有添加全部的抽象方法,那么这个子类也是抽象类。5、 普通类里有的,抽象类都可以用抽象方法和普通方法的区别:1、 抽象方法没有方法体,以及被abstract修饰2、 抽象方法必须被重写3、 都可以被重写重载可以修饰抽象方

30、法的修饰符可以有哪些,哪些不行?理由不行 :Private,Final,StaticDefault(不同包下继承他的子类无法重写这个方法)为什么不直接扔掉抽象方法?想象一下,当定义一个CombatUnit(战斗单位)的引用,但实际上引用到的是其子类实例,而其子类都有talk方法,但talk方法的实现不同。当我们想通过这个CombatUnit引用来调用talk方法,那么必须进行强制类型转换为其子类,才能调用talk方法,但这就降低了程序的灵活性。什么是接口?抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更彻底,则可以提炼出一种更加特殊的抽象类接口(interface),接口里不能包含普通

31、方法,接口里的所有方法都是抽象方法。只具有抽象方法的抽象类叫做接口。接口的特点:1.接口不能被继承(extends),只能被实现(implements);2.一个类可以实现多个接口;3.实现接口的类必须实现接口中的所有方法。否则为抽象类。4.在类中实现接口中定义的方法时,不能比接口中定义的方法有更低的访问权限。因此,被实现的接口方法必须用public修饰。接口的定义格式访问修饰符 interface 接口名 常量(并且必须初始化 ); 成员方法定义(只有原形而无函数定义体 );接口也可像定义类一样实现继承,但接口只能继承接口,不能继承任何类。接口是多继承的。访问修饰符 interface 接口

32、名 extends 父接口1,父接口2 常量(并且必须初始化 ); 成员方法定义(只有原形而无函数定义体 );接口的实现修饰符 class 类名 extends 父类名 implements 接口1, 接口2/实现接口的方法 接口是可以被“多实现”的,一个类可以实现多个接口; 接口的实现不影响类的继承,接口的实现使用implements关键字; 接口 之间 的继承使用extends,而不是implements。接口-接口 多继承接口-类 多实现类-类 单继承抽象类类名 对象名 =new 非抽象子类();抽象类的实例化接口名 引用变量名 =new 非抽象的实现类();接口的实例化抽象类和接口的区别:相同点:1、都不能直接实例化,抽象类必须被继承,通过非抽象子类来实例化,接口必须被实现,通过非抽象的实现类来实例化2、都是多态具体的表现形式不同点:1、抽象类是被继承,单继承 接口只能被实现,多实现2、抽象类:可以具有普通方法 接口:只能有抽象方法3、抽象类:成员变量可以有变量 接口:只能是常量public final static4、抽象类:抽象方法的访问权

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论