Java笔记之面向对象面向对象是什么?为什么要面向对象?①符合客观规律首先,找对象;然后,调用对象的方法生活问题——————程序(问题空间)(解空间)②面向对象的优势重用1、类的重用2、继承/组合复用性、弱耦合性、可扩展性(可插入性)扩展后,对原有系统影响尽量小,组件化变成Java是面向对象的程序设计语言,Java语言提供了定义类、成员变量、方法等最基本的功能。类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引到到类的对象。类用于描述客观世界里某一类对象的共同特征,而对象则是类的具体存在,java程序使用类的构造器来创建该类的对象。面向过程是一种以过程为中心的编程思想。面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象(ObjectOriented,简称OO)是一种以事物为中心的编程思想。面向对象是把一个问题的处理过程按照构成问题的事物分解成对象,建立对象的目的不是为了完成整个过程中的一个步骤,而是为了描述某个事物在整个解决问题的过程中的行为。面向对象的程序设计过程中有两个重要的概念:类和对象(对象也被称为实例,instance),其中类是某一批对象的抽象,可以把类理解成某种概念;对象才是一个具体存在的实体,从这个意义上,例如日常说的人,其实都是人的实例,而不是人类。类和对象是面向对象的核心。为什么要面向对象?面向对象是为了解决系统的可维护性,可扩展性,可重用性,我们再进一步思考,面向对象为什么能解决系统的可维护性,可扩展性,可重用性?面向对象产生的历史原因有下面两点:1、计算机是帮助人们解决问题的,然而计算机终究是个机器,他只会按照人所写的代码,一步一步的执行下去,最终得到了结果,因此无论程序多么的复杂,计算机总是能轻松应付,结构化编程,就是按照计算机的思维写出的代码,但是人看到这么复杂的逻辑,就无法维护和扩展了。2、结构化设计是以功能为目标来设计构造应用系统,这种做法导致我们设计程序时,不得不将客体所构成的现实世界映射到由功能模块组成的解空间中,这种转换过程,背离了人们观察和解决问题的基本思路。可见结构化设计在设计系统的时候,无法解决重用、维护、扩展的问题,而且会导致逻辑过于复杂,代码晦涩难懂。于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路,习惯,步骤来设计相应的应用程序?这样的程序,人们在读它的时候,会更容易理解,也不需要再把现实世界和程序世界之间来回做转换。与此同时,人们发现,在现实世界中存在的客体是问题域中的主角,所谓客体是指客观存在的对象实体和主观抽象的概念,这种客体具有属性和行为,而客体是稳定的,行为不稳定的,同时客体之间具有各种联系,因此面向客体编程,比面向行为编程,系统会更稳定,在面对频繁的需求更改时,改变的往往是行为,而客体一般不需要改变,所以我们就把行为封装起来,这样改变时候只需要改变行为即可,主架构则保持了稳定。于是面向对象就产生了。然而人们追求的系统可维护性,可扩展性,可重用性又是怎么在面向对象中体现出来的呢?首先看看面向对象的三大特征:封装:找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用,只有明确的IS-A关系才能使用,同时继承在在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发者滥用继承,结果造成后期的代码解决不了需求的变化了。因此优先使用组合,而不是继承,是面向对象开发中一个重要的经验。多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。因此面向对象能实现人们追求的系统可维护性,可扩展性,可重用性。面向对象是一种编程思想,起初,“面向对象”是专指在程序设计中采用封装、继承、多态等设计方法,但面向对象的思想已经涉及到软件开发的各个方面,比如现在细分为了面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP)面对对象使用在什么地方?在编程中我们使用对象来模拟现实中的对象,用属性模拟特征,方法模拟能力。每次使用都会创建对象,定义属性,方法。这样比较麻烦,为了代码重用性,我们定义类,类是创建对象的模板,里面定义了对象应该具备的属性和方法。使我们不用每次创建对象时都重复的定义,直接使用即可。综上,类是对象的抽象模板,定义了对象将具备的属性能力,在创建对象及使用对象时达到代码重用的功能。类是什么?类是面向对象的重要内容,可以把类当做一种自定义类型,可以使用类来定义变量,这种类型的变量统称为引用变量。也就是说,类是引用类型。类名的取名:要是一个合法的标识符,满足Java的语法要求;类名必须是有一个或者多个有意义的单词连缀而成的,每个单词首字母大写,其他字母全部小写,单词与单词直接不要任何分隔符。类的使用:修饰符class类名{零到多个构造器定义...零到多个成员变量...零到多个方法...}构造器用于构造该类的实例(对象),Java通过new关键字来调用构造器,从而返回该类的实例(对象)。成员变量用于定义该类或该类的实例所包含的状态数据。方法用于定义该类或该类的对象的行为特征或者功能实现。构造器是什么?构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类统称无法创建实例。如果程序员没有为一个类编写构造器,这个类通常无法创建对象(实例),则系统会为该类提供一个默认的构造器。**注意:构造器、构造方法以及构造函数都是指构造方法。构造器的使用格式:[修饰符]构造器名(形参列表){由零条到多条可执行性语句组成的构造器执行体}修饰符可以省略,也可以是public、protected、private之一构造器名必须和类名相同。形参列表和定义方法形参列表的格式完全相同。**注意:构造器不能定义返回值类型,也不能使用void声明构造器没有返回值,如果使用则构造器不再是构造器而是被系统当做普通方法。*构造方法与普通方法的区别1、语法上不同构造方法没有返回值类型普通方法一定有返回值类型(void)方法名和类名一样---构造方法2.作用不同构造方法是初始化对象时调用的普通方法需要时调用3.构造方法不能被finalstaticabstractsyschronized修饰成员变量是什么?成员变量是类具有的一些基本属性。成员变量又称为成员属性,全局变量,它是描述对象状态的数据,是类中很重要的组成成分。成员变量的格式:[修饰符]类型成员变量名[=默认值];修饰符可以省略,也可以是public、protected、private、static、final等,public、protected、private只能出现其一,可与static、final组合修饰。类型可以是基本数据类型和引用数据类型成员变量名符合java命名规范。默认值可以指定默认值。局部变量与成员变量(全局变量)区别:1作用范围:局部变量定义它的当前这个方法里;全局变量在整个类里2局部变量和局部变量不能同名,全局变量和全局变量不能同名,但是全局变量和局部变量可以同名3局部变量和全局变量同名的话,局部变量有优先级;4全局变量有默认初始值,局部变量没有,所以局部变量声明的时候一般要给初始值;5用this区分同名的局部变量和全局变量(同名的话全局变量用this.变量名表示)6局部变量在方法调用完后释放内存,成员变量在类和对象不使用的时候释放内存7成员变量堆存中局部变量常量池中成员方法是什么?成员方法描述对象所具有的功能或操作,反映对象的行为,是具有某种相对独立功能的程序模块。一个类或对象可以有多个成员方法,对象通过执行它的成员方法对传来的消息作出响应,完成特定的功能。成员方法一旦定义,便可在不同的程序段中多次调用,故可增强程序结构的清晰度,提高编程效率。成员方法的分类,从成员方法的来源看,可将成员方法分为:类库成员方法。这是由Java类库提供的,用户只要按照Java提供的调用格式去使用这些成员方法即可。用户自定义的成员方法。这是为了解决用户的特定问题,由用户自己编写的成员方法。程序设计的主要工作就是编写用户自定义类、自定义成员方法。从成员方法的形式看,可将成员方法分为:无参数成员方法和带参数成员方法。成员方法的语法格式:[修饰符]返回值的类型成员方法名(形式参数表)throw[异常表]{由零条到多条可执行性语句组成的方法体}成员方法的声明包括成员方法头和成员方法体两部分。成员方法头确定成员方法的名字、形式参数的名字和类型、返回值的类型、访问限制和异常处理等;成员方法体由包括在花括号内的说明部分和执行语句部分组成,它描述该方法功能的实现。修饰符:可以是公共访问控制符public、私有访问控制符private、保护访问控制符protected等访问权限修饰符,也可以是静态成员方法修饰符static、最终成员方法修饰符final、本地成员方法修饰符native、抽象成员方法修饰符abstract等非访问权限修饰符。访问权限修饰符指出满足什么条件时该成员方法可以被访问。非访问权限修饰符指明数据成员的使用方式。返回值类型:运行任何数据类型,包括基本数据类型和引用数据类型。如果声明了方法返回值类型,则方法体必须有一个有效的return语句,该语句返回一个变量或一个表达式,这个变量或者表达式的类型必须与此处声明的类型匹配。如果一个方法没有返回值,必须使用void来声明没有返回值。形参列表:形参列表用于定义该方法可以接受的参数,参数列表由零组到多组“参数类型形参名”组成,多组参数之间以英文逗号隔开,形参类型和形参名之间以英文空格隔开。一旦在定义方法时指定了形参列表,则调用该方法时必须传入对应的参数值——谁调用方法,谁负责为形参赋值。**注意:方法体里多条可执行语句之间有严格的执行顺序,排在方法体前面的语句总是先执行,排在方法体后的语句总是后执行。方法的重载前提:在同一类中条件:同名不同参(方法名相同,参数列表不同)参数列表不同情况:数据类型不同,数据数量不同,类型和数量都不同**注意:与参数名无关(重载时不能只更改参数列表的数据名,而其它都一样)静态static成员变量和成员方法、代码块静态变量与实例变量的区别:1语法上的区别静态变量---static修饰实例变量没有2内存静态变量--只有一个拷贝,所有对象共享,在类加载的时候jvm就为静态数据分配内存实例变量--可以多个拷贝,每个对象的实例变量互不影响静态方法里只能访问静态的变量、常量或方法,不能访问非静态的数据和方法普通方法里能访问静态的数据或方法3使用区别静态变量--通过类名调用实例变量--通过对象名调用静态代码块不能写在任何方法里静态代码块只确定优先级,多个静态代码块按照出现的顺序执行;代码块的优先级:(静态代码块执行顺序永远在最前面)静态代码块》构造代码块》构造方法》(普通方法、普通代码块)静态代码块、构造方法、构造代码块、普通方法、普通代码块、静态方法的运行顺序;静态方法:能被继承,不能被重写(静态的方法在类加载的时候就加载了,在整个运行过程中是保持不变的,所以不能被重写)即使在子类里有个同名同参的静态方法,也不算被重写不能被重写的方法:构造方法static、private、final修饰的方法对象是什么?对象是类中的存在的实体。对象的创建:例:首先创建了Person类,定义了name和age成员