—高级软件人才实作培训专家成都传智播客教育cd.itcast.cnJava面向对象1讲师:WillEmail:iwiller@sina.cn—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn今日任务认识面向对象类和对象构造器static修饰符成员变量和局部变量封装面向对象,春暖花开.—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn面向对象春暖花开一种编程思想,一个很抽象的概念,它相对面向过程而言。过程与对象都是一种解决问题的思想。•面向过程:强调的是功能行为,一种过程,先干啥,再干啥;用函数把这些步骤一步一步实现,使用的时候依次调用函数就可以了。•面向过程最大的问题在于随着系统的膨胀,面向过程将无法应付,最终导致系统的崩溃,面向对象的提出正是试图解决这一软件危机。•面向对象:将功能封装到对象里,强调的是具备某功能的对象;计算机语言为了更好的去描述现实生活中的事物,也一样会按照生活中的思考方式来定义,这样人们使用起来才会更方便。面向对象的三个特征:Ø封装(Encapsulation);Ø继承(Inheritance);Ø多态(Polymorphism)。—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn类与对象之间的关系类是对生活中某一类事物的描述(一种抽象概念),对象是该类事物实实在在存在的个体。(对象==实例)哥就是传说中的手机,我的英文名叫CellPhone。哥只是个概念,你抓不到我!偶们才是亲口中说的手机哦!—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn类的定义字段:类或对象所包含的数据,对类状态的一种描述;方法:类或对象的特征或行为[修饰符]class类名{0~n个字段;0~n个方法}—高级软件人才实作培训专家定义类—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn类的定义定义类,其实就是在定义类中的成员。classCellPhone{Stringbrand=google;Stringcolor=red;doubleprice;publicvoidshowInfo(){System.out.println(brand+手机是+color+色的+价值+price);}}—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn对象的定义、创建以及使用格式:•类名对象名称=new类名();//其实是两步操作•类名对象名称;//声明对象•对象名称=new类名();//实例化对象例:•CellPhoneiphone=newCellPhone();通过“对象名.对象成员”的方式来操作对象中的内容。思考:对象在内存是如何存在的?我们的语言:对象等同于实例成员变量等同于字段—高级软件人才实作培训专家匿名对象当不定义变量来引用对象时,此时对象没有名字,称为匿名对象。如:newCellPhone();匿名对象只在堆内存中开辟空间,并不存在在栈内存对它的引用。因为没有被任何变量所引用,匿名对象在使用一次之后即成为垃圾,也就是说只能使用一次。通常当某一个对象只被使用一次的时候,就可以使用匿名对象。—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn对象的引用CellPhonephone=newCellPhone();•1.创建了一个CellPhone的实例(对象),•2.把这个CellPhone实例赋给phone变量。phone.brand=Android;引用变量指向对象,也就是说引用型变量存放的仅仅是一个引用地址;—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn内存分析phonebrand=Googleprice=0.0CellPhonephone=newCellPhone();CellPhone山寨机=phone;山寨机CellPhone对象—高级软件人才实作培训专家对象的生命周期从new开始到该对象不被什么变量引用的时候(如phone=null)之间的时期就是对象的生命周期,一旦一个对象不被任何变量所引用时,该对象就是垃圾,就等着Java的垃圾回收器(GC)来清理。注意:并不是垃圾一旦产生GC就会清理,这完全取决于JVM的调度,程序员无法控制。—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn引用数据类型数组分析学生是一个类,学生这个类有一个字段叫名字,有一个方法是交学费。每一个学生都是通过学生这个类new出来的一个对象。我现在创建一个数组,这个数组里面依次放的是没有交学费的学生的对象,我再分别调用数组里的这些学生的交学费方法。—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn引用数据类型数组分析unFeess1s2unFees[1]name=Will;unFees[0]name=Lucy;—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn构造器一旦创建对象就会调用与之对应的构造器(又称构造方法),构造器的作用:可用于创建对象和对对象初始化操作。如:CellPhonecp=newCellPhone();特点:•方法名与类名相同•不用定义返回值类型•不需要写return语句注意:•默认构造方法的特点。•多个构造方法是以重载的形式存在的。构造器==构造方法—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn构造器构造器初始化为对象分配内存;执行字段的显示初始化;执行构造器;由new运算符返回对象的引用;setter方法和构造方法都可以用来初始化字段的值,那么什么时候用构造方法什么时候用setter?1.当字段的值是和类的对象紧密相关不可分割的时候,用构造方法,就是说我要有这个实例,就必须有这个字段值,就用构造方法。2.需要初始化的字段值不太多的时候可以用构造方法,如果字段值太多,构造方法的参数列表太。。。了。3.其他时候都可以用setter方法。—高级软件人才实作培训专家成都传智播客教育cd.itcast.cnstatic关键字特点:•随着类的加载而加载•优先于对象存在•被所有对象所共享•可以直接被类名调用使用注意:•静态方法只能访问静态成员•但是非静态成员可以访问静态成员;•静态方法中不可以使用this,super关键字•主方法(main)是静态的•publicstaticvoidmain(String[]agrs){}—高级软件人才实作培训专家成都传智播客教育cd.itcast.cnstatic关键字的使用可修饰字段,方法。用static修饰的成员表示它属于这个类共有,而不是属于该类的单个实例。static修饰的字段==类字段static修饰的方法==类方法没使用static修饰的字段和方法,成员属于类的单个实例,不属于类。没有static修饰的字段==实例字段没有static修饰的方法==实例方法—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn访问字段和方法类和实例访问字段和方法的语法:•访问类成员:类.字段类.方法•访问实例成员:实例.字段实例.方法static修饰的字段和方法,既可以通过类调用,也可以使用实例调用;没static修饰的字段和方法,只能使用实例来调用—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn静态字段初始化和内存分析num=999第1个对象:name=Will第2个对象:name=Lucyp1p2人类有一个静态字段:人类数量(num)人类—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn成员变量&局部变量Java中根据定义变量的位置不同,把变量分成2种:成员变量:直接定义在类里的变量,又称为全局变量或字段。局部变量:变量除了成员变量就是局部变量。根据定义的位置不同有3种表现形式:方法形参,方法内变量,代码块变量。变量作用域:指的是变量的存在范围,只有在这个范围内,程序代码才能访问它。当一个变量被定义时,它的作用域就确定了:成员变量:在类中声明,作用域是整个类;局部变量:作用域是定义开始到定义所在的花括号结束;局部变量没有初始值,所以使用前要显示的初始化。成员变量的初始值和动态创建数组里的元素的初始值是一样的;在同一范围内不允许两个局部变量发生命名冲突局部变量必须显示初始化—高级软件人才实作培训专家变量隐藏在同一个作用域内不允许定义同名的多个变量。若当成员变量和局部变量同名,则局部变量会隐藏成员变量,可使用this避免二义性。—高级软件人才实作培训专家变量生命周期变量的作用域决定了变量的生命周期,说明作用域不同,生命周期就不一样。变量的生命周期指的是一个变量被创建并分配内存空间开始,到该变量被销毁并清除其所占内存空间的过程。类变量在内存中只有一个,JVM在加载类的过程中为其分配内存,静态变量位于方法区,被类的所有实例共享。类变量的生命周期取决于类的生命周期,加载类时静态变量就被创建并分配内存,当卸载类时静态变量被销毁并撤销所占内存。每当创建类的实例时,JVM就会为实例变量分配一次内存,实例变量被创建也并分配内存,实例变量位于堆内存中。实例变量的生命周期取决于实例的生命周期,当创建实例时,实例变量被创建并分配内存,当销毁实例的时候,实例变量被销毁会并撤销所占内存。当JVM调用一个方法时,会为该方法中的局部变量分配内存。当结束调用该方法时,会结束方法中的局部变量的生命周期。—高级软件人才实作培训专家局部变量的初始化和JVM中运行机制局部变量定义后,必须显示初始化后才能使用,因为系统不会为局部变量执行初始化操作。这就意味着,定义局部变量后,系统并未为这个变量分配内存空间。直到程序为这个变量赋值时,系统才会为局部变量分配内存,并将初始值保存到该内存中。局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中。基本数据局部变量:直接把这个变量的值保存到该变量所对应的内存中。引用数据局部变量:这个变量内存中存的是地址,通过该地址引用到该变量实际引用堆里的的对象。栈内存中的变量无需系统垃圾回收,其往往随方法或代码块的运行结束而结束。—高级软件人才实作培训专家成都传智播客教育cd.itcast.cn面向对象之封装封装的两个含义:•1.把对象的状态和行为看成一个统一的整体,将二者存放在一个独立的模块中(类);•2.信息隐藏,把不需要让外界知道的信息隐藏起来,尽可能隐藏对象功能实现细节,字段;封装机制在程序中的体现是:把描述对象的状态用字段表示,描述对象的行为用方法表示,把字段和方法定义在一个类中,并保证外界不能任意更改其内部的字段值,也不允许任意调动其内部的功能方法。程序中的一种体现:通常将类中的成员变量私有化(private),通过对外提供方法(setXxx,getXxx),可对该变量(xxx)进行访问。•boolean类型的变量没有getXX,只有isXX;—高级软件人才实作培训专家成都传智播客教育cd.itcast.cnthis关键字特点:this表示当前对象。•当前对象←→当前正在调用实例成员的对象换言之:谁调用了方法,谁就是当前对象。什么时候使用this关键字呢?•方法间的相互调用;•this.字段;•构造器中相互调用,但是此时this([参数])必须写在构造方法第一行。this不能用在static修饰的方法里和static修饰的代码块里;—高级软件人才实作培训专家成都传智播客教育cd.itcast.cnpackagepackage的引入,提供类的多层命名空间,从而能更好的管理代码结构,也能避免类名冲突。编译:javac-d.HelloWorld.java运行:javacd.itcast.demo.HelloWorldpackage必须写在文件的开头,必须写在import和类声明之前。java允许将一组功能相同的类放在同一个package下。企业开发的命名规则域名反过来写•cn.itcast.cd.erp.crm.domain•erp是项目名